/ Hex Artifact Content
Login

Artifact 4a96cddec7c8cc33f98da703c1baf2a654b50cab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6c 6f 63 61 6c 20 61 6c 6c 20 62  also local all b
13a0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  trees..**.** The
13b0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
13c0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
13d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1400: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1410: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1420: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1430: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1440: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1450: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1460: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1470: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1480: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1490: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
14a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
14b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
14c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
14d0: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
14e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
14f0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1500: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1510: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1520: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1530: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1540: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1550: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1560: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1580: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15a0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
15b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
15c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15d0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
15e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1600: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1610: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1630: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1640: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1650: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1660: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1680: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1690: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
16a0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
16b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16c0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
16d0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
16e0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
16f0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1700: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1710: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1720: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1730: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1740: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1770: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1780: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1790: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
17a0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
17b0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
17c0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
17d0: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
17e0: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
17f0: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1800: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1810: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1820: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1830: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1840: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1850: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1860: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1870: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1880: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1890: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
18a0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
18b0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
18c0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
18d0: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
18e0: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
18f0: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1900: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1910: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1920: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1930: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
1940: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
1950: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
1960: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
1970: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
1980: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
1990: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19b0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
19c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
19d0: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a   = p->nLabel++;.
19e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
19f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1a00: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  NIT );.  if( i>=
1a10: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29  p->nLabelAlloc )
1a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
1a30: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1a40: 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   5;.    p->aLabe
1a50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1a60: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1a70: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e      n*sizeof(p->
1ab0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20  aLabel[0]));.   
1ac0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
1ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ae0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  cSize(p->db, p->
1af0: 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70  aLabel)/sizeof(p
1b00: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20  ->aLabel[0]);.  
1b10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1b20: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b30: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1b60: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1b80: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1b90: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1ba0: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1bb0: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
1bc0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1bd0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
1be0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1bf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c20: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1c30: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1c40: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1c50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1c60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1c70: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1c80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1ca0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1cb0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
1cc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
1cd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
1ce0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
1cf0: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
1d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
1d10: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
1d20: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
1d30: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
1d40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1d50: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1d60: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1d80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1d90: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1da0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1db0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1dc0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1de0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1df0: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1e00: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1e10: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1e20: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1e40: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1e50: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1e60: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1e70: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1e80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1e90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1ea0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1ed0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1ee0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1ef0: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1f00: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1f10: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1f20: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1f30: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1f40: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1f50: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f70: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1f80: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1f90: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1fa0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1fc0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1fd0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1fe0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1ff0: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2000: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2010: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2020: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2050: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2060: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2080: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2090: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
20a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
20d0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
20e0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
20f0: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2100: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2110: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2120: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2130: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2140: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2150: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2160: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2170: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2180: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2190: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
21a0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
21b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
21d0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
21e0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
21f0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2200: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2220: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2230: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2240: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2250: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2260: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2270: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2280: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
22a0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
22b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
22c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
22e0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
22f0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2300: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2310: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2330: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2340: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2360: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2370: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2380: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2390: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
23a0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
23b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
23c0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
23d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
23e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
23f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2400: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2410: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2420: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2440: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2450: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2460: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2470: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2480: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2490: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
24a0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
24b0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
24c0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
24d0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
24e0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
24f0: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2500: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2510: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2520: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2530: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2540: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2550: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2560: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2570: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
25c0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
25d0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
25e0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
25f0: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2600: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2610: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2620: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2630: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2640: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2660: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2670: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2680: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2690: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
26a0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
26b0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
26c0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
26d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
26e0: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
26f0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2700: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2710: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2720: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2730: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2740: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2750: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2760: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2780: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2790: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27a0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
27b0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
27c0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
27d0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
27e0: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
27f0: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2800: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
2810: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2820: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
2830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2840: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
2850: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
2860: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2870: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2880: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2890: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
28a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
28b0: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
28c0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
28d0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
28e0: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
28f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2900: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
2910: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
2920: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
2930: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
2940: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
2950: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
2960: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2970: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2980: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
29a0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
29b0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
29c0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
29d0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
29f0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2a00: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
2a10: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
2a20: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
2a30: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
2a40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2a50: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
2a60: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2a70: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2a80: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2a90: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2aa0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2ab0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2ac0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2ad0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2ae0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2af0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2b00: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2b10: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2b20: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2b30: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2b40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2b50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2b60: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2b70: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2b80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2b90: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ba0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2bb0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2bc0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2bd0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2be0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2bf0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2c00: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2c20: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2c30: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2c40: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2c50: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2c60: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2c70: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2c80: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ca0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2cb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2cc0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2cd0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2ce0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2cf0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2d00: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2d10: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2d20: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2d30: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2d40: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2d50: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2d60: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2d70: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2d80: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2d90: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2da0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2db0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2dc0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2e00: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2e20: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2e30: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2e40: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2e50: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2e60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2e70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2e80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2e90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2ea0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2ec0: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2ed0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2ee0: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2ef0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2f00: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2f10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2f20: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2f30: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2f40: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2f50: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2f60: 20 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50   if( (opcode==OP
2f70: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2f80: 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f  pOp->p2!=0) || o
2f90: 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d  pcode==OP_Vacuum
2fa0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61   ){.      p->rea
2fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64  dOnly = 0;.#ifnd
2fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
3000: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
3010: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
3020: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
3030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3040: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
3050: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
3060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3070: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
3080: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3090: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
30a0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
30b0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
30c0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
30d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
30e0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
30f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3100: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c  pcode==OP_Next |
3110: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  | opcode==OP_Sor
3120: 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  terNext ){.     
3130: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3140: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3150: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Next;.      pOp-
3160: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
3170: 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ANCE;.    }else 
3180: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50  if( opcode==OP_P
3190: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  rev ){.      pOp
31a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
31b0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31c0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ious;.      pOp-
31d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
31e0: 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ANCE;.    }..   
31f0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
3200: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
3210: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
3220: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3230: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
3240: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
3250: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
3260: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
3270: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
3280: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
3290: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
32a0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
32b0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32c0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
32d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
32e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
32f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3300: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3310: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3320: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3330: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3360: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3370: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3380: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3390: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
33b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
33c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
33d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
33e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
33f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3400: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3410: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3420: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3430: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3440: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3450: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3460: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3470: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3480: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3490: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
34b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
34c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
34d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
34e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
34f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3500: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3510: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3520: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3530: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3540: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3550: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3560: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3570: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3580: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3590: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
35b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
35c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
35d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
35f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3600: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3610: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3620: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3630: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3640: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
3650: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
3660: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
3670: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
3680: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
3690: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
36b0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
36c0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
36d0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
36e0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
36f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3700: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3710: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3730: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3740: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
3750: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
3760: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
3770: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3780: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3790: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37a0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
37b0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
37c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
37d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
37e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
37f0: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3810: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3820: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3830: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3840: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
3850: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
3860: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
3870: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
3880: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
3890: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38a0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
38b0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
38c0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
38d0: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
38e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
38f0: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3900: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3910: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3920: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3940: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
3950: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
3960: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
3970: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
3980: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39a0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
39b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
39c0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
39d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
39e0: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
39f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3a00: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
3a10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
3a20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
3a30: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
3a40: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
3a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3a60: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
3a70: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
3a80: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
3a90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3aa0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
3ab0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3ac0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ae0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3af0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3b00: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3b10: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
3b20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
3b30: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
3b40: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
3b50: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
3b60: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
3b70: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
3b80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b90: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
3ba0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3bb0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3bc0: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3bd0: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3be0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
3bf0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3c00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3c10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
3c20: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3c30: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3c40: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3c50: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3c60: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3c70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3c90: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3ca0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3cb0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3cc0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3cd0: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3ce0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3cf0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3d00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d10: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d20: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3d30: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3d60: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3d70: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
3d80: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3d90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
3da0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
3db0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3dc0: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
3dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3de0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3df0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
3e00: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
3e10: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
3e20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
3e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3e40: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
3e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3e60: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
3e70: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >aOp ){.    asse
3e80: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
3e90: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
3ea0: 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20  p-1].p5 = val;. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3ec0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
3ed0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
3ee0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
3ef0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3f00: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
3f10: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
3f20: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
3f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3f40: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
3f50: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
3f60: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3f70: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3f80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3f90: 20 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74   addr>=0 ) sqlit
3fa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3fb0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3fd0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3fe0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3ff0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
4000: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
4010: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
4020: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
4030: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
4040: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
4050: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4070: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4080: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4090: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
40a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
40b0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
40c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40d0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
40e0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
40f0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4100: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
4110: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
4120: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
4130: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
4140: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4160: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
4170: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
4180: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
4190: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
41a0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
41b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
41c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
41d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
41e0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
41f0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
4200: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4210: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
4220: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
4230: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
4240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4250: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
4260: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4270: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4280: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4290: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
42a0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
42b0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
42c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
42d0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
42e0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
42f0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4300: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4310: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4320: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4330: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4340: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4350: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4360: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4370: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
4380: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
4390: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
43a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
43b0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
43c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43e0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
43f0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4400: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4410: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4430: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4440: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4450: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4460: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4480: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
4490: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
44a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44b0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
44c0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
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 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
44f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4530: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4540: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4550: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4560: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4570: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
4580: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
4590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
45b0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
45c0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
45d0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
45e0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
45f0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4600: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4610: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4620: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4630: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4640: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4650: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4660: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4670: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4680: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
4690: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
46a0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
46b0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
46c0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
46d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
46e0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46f0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4700: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4710: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4730: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4740: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4750: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4760: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4770: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4780: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4790: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
47a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
47b0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
47c0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
47d0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
47e0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
47f0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4800: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4810: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4820: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4830: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4840: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4850: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4860: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4870: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4880: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
4890: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
48a0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
48b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
48c0: 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69  opcode at addr i
48d0: 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76  nto OP_Noop.*/.v
48e0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
48f0: 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65  hangeToNoop(Vdbe
4900: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4910: 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a    if( p->aOp ){.
4920: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
4930: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
4940: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4950: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
4960: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
4970: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
4980: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
4990: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
49a0: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
49b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
49c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
49d0: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
49e0: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
49f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
4a00: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
4a10: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
4a20: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
4a30: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
4a40: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
4a50: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
4a60: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
4a70: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
4a80: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
4a90: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
4aa0: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
4ab0: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
4ac0: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
4ad0: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
4ae0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
4af0: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
4b00: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
4b10: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4b20: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
4b30: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
4b40: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
4b50: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
4b60: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
4b70: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
4b80: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
4b90: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
4ba0: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
4bb0: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
4bc0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
4bd0: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
4be0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
4bf0: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
4c00: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
4c10: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
4c20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
4c30: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
4c40: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
4c50: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
4c60: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
4c70: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
4c80: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
4c90: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
4ca0: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
4cb0: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
4cc0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
4cd0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
4ce0: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
4cf0: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
4d00: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4d10: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
4d20: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
4d30: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
4d40: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
4d50: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
4d60: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
4d70: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
4d80: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
4d90: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
4da0: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
4db0: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4dc0: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
4dd0: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
4de0: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
4df0: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
4e00: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
4e10: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
4e20: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
4e30: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
4e40: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
4e50: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
4e60: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
4e70: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
4e80: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
4e90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4ea0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
4eb0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
4ed0: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
4ee0: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
4ef0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
4f00: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
4f10: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
4f20: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4f30: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
4f40: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
4f50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
4f60: 0a 20 20 20 20 69 66 20 28 20 6e 21 3d 50 34 5f  .    if ( n!=P4_
4f70: 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21 3d 50 34  KEYINFO && n!=P4
4f80: 5f 56 54 41 42 20 29 20 7b 0a 20 20 20 20 20 20  _VTAB ) {.      
4f90: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
4fa0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
4fb0: 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  P4);.    }.    r
4fc0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
4fd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
4fe0: 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3c  .  assert( addr<
4ff0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20  p->nOp );.  if( 
5000: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64  addr<0 ){.    ad
5010: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5020: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
5030: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
5040: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5050: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5060: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
5070: 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49  0;.  if( n==P4_I
5080: 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  NT32 ){.    /* N
5090: 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69  ote: this cast i
50a0: 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20  s safe, because 
50b0: 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20  the origin data 
50c0: 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74  point was an int
50d0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73  .    ** that was
50e0: 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73   cast to a (cons
50f0: 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20  t char *). */.  
5100: 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51    pOp->p4.i = SQ
5110: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
5120: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5130: 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32  4type = P4_INT32
5140: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50  ;.  }else if( zP
5150: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d  4==0 ){.    pOp-
5160: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5170: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5180: 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65  NOTUSED;.  }else
5190: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
51a0: 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66  FO ){.    KeyInf
51b0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  o *pKeyInfo;.   
51c0: 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79   int nField, nBy
51d0: 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20  te;..    nField 
51e0: 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34  = ((KeyInfo*)zP4
51f0: 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e  )->nField;.    n
5200: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
5210: 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65  KeyInfo) + (nFie
5220: 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65  ld-1)*sizeof(pKe
5230: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29  yInfo->aColl[0])
5240: 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70   + nField;.    p
5250: 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
5260: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
5270: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 4f 70 2d  nByte);.    pOp-
5280: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
5290: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
52a0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
52b0: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
52c0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
52d0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
52e0: 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d 20 6e 46   zP4, nByte - nF
52f0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 61 53 6f  ield);.      aSo
5300: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
5310: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
5320: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
5330: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
5340: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5350: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
5360: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
5370: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
5380: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
5390: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
53a0: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
53b0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
53c0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34   }.      pOp->p4
53d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
53e0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
53f0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
5400: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
5410: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5420: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
5430: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
5440: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
5450: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
5460: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5470: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5480: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
5490: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
54a0: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
54b0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
54c0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
54d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 41  >p4type = P4_VTA
54e0: 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  B;.    sqlite3Vt
54f0: 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  abLock((VTable *
5500: 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 72  )zP4);.    asser
5510: 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  t( ((VTable *)zP
5520: 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  4)->db==p->db );
5530: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30  .  }else if( n<0
5540: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5550: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5560: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5570: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 6e  = (signed char)n
5580: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
5590: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71  f( n==0 ) n = sq
55a0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
55b0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e  4);.    pOp->p4.
55c0: 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  z = sqlite3DbStr
55d0: 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c  NDup(p->db, zP4,
55e0: 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34   n);.    pOp->p4
55f0: 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49  type = P4_DYNAMI
5600: 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  C;.  }.}..#ifnde
5610: 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  f NDEBUG./*.** C
5620: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
5630: 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73  t on the the mos
5640: 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64  t recently coded
5650: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f   instruction.  O
5660: 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f  r.** insert a No
5670: 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20  -op and add the 
5680: 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20  comment to that 
5690: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
56a0: 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20    This.** makes 
56b0: 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20  the code easier 
56c0: 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64  to read during d
56d0: 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20  ebugging.  None 
56e0: 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a  of this happens.
56f0: 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69  ** in a producti
5700: 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61  on build..*/.sta
5710: 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 43 6f  tic void vdbeVCo
5720: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
5730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
5740: 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 29 7b  at, va_list ap){
5750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
5760: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
5770: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
5780: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
5790: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
57a0: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
57b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
57c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
57d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
57e0: 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 6c 69  >aOp );.    sqli
57f0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5800: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5810: 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ].zComment);.   
5820: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
5830: 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c  ].zComment = sql
5840: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
5850: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
5860: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
5870: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
5880: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
5890: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
58a0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
58b0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
58c0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
58d0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65  ormat);.    vdbe
58e0: 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72  VComment(p, zFor
58f0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
5900: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
5910: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5920: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
5930: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5940: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5950: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5960: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
5970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
5980: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
5990: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
59a0: 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56  rmat);.    vdbeV
59b0: 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d  Comment(p, zForm
59c0: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
59d0: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
59e0: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
59f0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
5a00: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
5a10: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
5a20: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
5a30: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
5a40: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
5a50: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5a60: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
5a70: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
5a80: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
5a90: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
5aa0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
5ab0: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
5ac0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
5ad0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
5ae0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
5af0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
5b00: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
5b10: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
5b20: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
5b30: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
5b40: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
5b50: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
5b60: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
5b70: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
5b80: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
5b90: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f  ing.** after a O
5ba0: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74  OM fault without
5bb0: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b   having to check
5bc0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
5bd0: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74  eturn from .** t
5be0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
5bf0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20   valid pointer. 
5c00: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
5c10: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73   dummy.opcode is
5c20: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c   0,.** dummy wil
5c30: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74  l never be writt
5c40: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20  en to.  This is 
5c50: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65  verified by code
5c60: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a   inspection and.
5c70: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69  ** by running wi
5c80: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a  th Valgrind..**.
5c90: 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23 69 66  ** About the #if
5ca0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5cb0: 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79  TRACE:  Normally
5cc0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5cd0: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a  s never called.*
5ce0: 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e  * unless p->nOp>
5cf0: 30 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  0.  This is beca
5d00: 75 73 65 20 69 6e 20 74 68 65 20 61 62 73 65 6e  use in the absen
5d10: 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
5d20: 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f  T_TRACE,.** an O
5d30: 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75 63 74  P_Trace instruct
5d40: 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 69 6e  ion is always in
5d50: 73 65 72 74 65 64 20 62 79 20 73 71 6c 69 74 65  serted by sqlite
5d60: 33 56 64 62 65 47 65 74 28 29 20 61 73 20 73 6f  3VdbeGet() as so
5d70: 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56  on as.** a new V
5d80: 44 42 45 20 69 73 20 63 72 65 61 74 65 64 2e 20  DBE is created. 
5d90: 20 53 6f 20 77 65 20 61 72 65 20 66 72 65 65 20   So we are free 
5da0: 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f 20 70  to set addr to p
5db0: 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a  ->nOp-1 without.
5dc0: 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64 6f 75  ** having to dou
5dd0: 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ble-check to mak
5de0: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
5df0: 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65  result is non-ne
5e00: 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69  gative. But.** i
5e10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5e20: 41 43 45 20 69 73 20 64 65 66 69 6e 65 64 2c 20  ACE is defined, 
5e30: 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69 73 20  the OP_Trace is 
5e40: 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65 20 64  omitted and we d
5e50: 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65  o need to.** che
5e60: 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ck the value of 
5e70: 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20  p->nOp-1 before 
5e80: 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56  continuing..*/.V
5e90: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
5ea0: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
5eb0: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
5ec0: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
5ed0: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
5ee0: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
5ef0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
5f00: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
5f10: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
5f20: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
5f30: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
5f40: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
5f50: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
5f60: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
5f70: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
5f80: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
5f90: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
5fa0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
5fb0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
5fc0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
5fd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
5fe0: 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28  IT_TRACE.    if(
5ff0: 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74   p->nOp==0 ) ret
6000: 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75  urn (VdbeOp*)&du
6010: 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mmy;.#endif.    
6020: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
6030: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
6040: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
6050: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
6060: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6070: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
6080: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
60a0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
60b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
60c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
60d0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
60e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
60f0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
6100: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
6110: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
6120: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
6130: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
6140: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
6150: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
6160: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
6170: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
6180: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
6190: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
61a0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
61b0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
61c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
61d0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
61e0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
61f0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
6200: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
6210: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
6220: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
6230: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
6240: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
6250: 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20  EYINFO_STATIC:. 
6260: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
6270: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
6280: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
6290: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
62a0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
62b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
62c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
62d0: 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28  zTemp, "keyinfo(
62e0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
62f0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
6300: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6310: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
6320: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
6330: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
6340: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
6350: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
6360: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
6370: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
6380: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
6390: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
63a0: 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e  rlen30(pColl->zN
63b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
63c0: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20  if( i+n>nTemp-6 
63d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
63e0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
63f0: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
6400: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
6410: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6420: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
6430: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20   ',';.          
6440: 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
6450: 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79  ortOrder && pKey
6460: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
6470: 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
6480: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6490: 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  '-';.          }
64a0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
64b0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f  y(&zTemp[i], pCo
64c0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a  ll->zName,n+1);.
64d0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e            i += n
64e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
64f0: 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20  if( i+4<nTemp-6 
6500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
6510: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
6520: 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  nil",4);.       
6530: 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20     i += 4;.     
6540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6550: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
6560: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
6570: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
6580: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
6590: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
65a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
65b0: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
65c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
65d0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
65e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
65f0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6600: 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28  zTemp, "collseq(
6610: 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e  %.20s)", pColl->
6620: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  zName);.      br
6630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6640: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
6650: 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  {.      FuncDef 
6660: 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pDef = pOp->p4.
6670: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
6680: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6690: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
66a0: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
66b0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
66c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66e0: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT64: {.      sq
66f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6700: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6710: 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49  ld", *pOp->p4.pI
6720: 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  64);.      break
6730: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6740: 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20   P4_INT32: {.   
6750: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6760: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6770: 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%d", pOp->p4.
6780: 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  i);.      break;
6790: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
67a0: 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20  P4_REAL: {.     
67b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
67c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
67d0: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
67e0: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
67f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6800: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
6810: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
6820: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
6830: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6840: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6850: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
6860: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
6870: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
6880: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6890: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
68b0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
68c0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
68d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
68e0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
68f0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
6900: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6910: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6920: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6930: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6940: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
6950: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
6960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6970: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6980: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
6990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
69a0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
69b0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
69c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
69d0: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
69e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
69f0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6a00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6a10: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
6a20: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
6a30: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
6a40: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
6a50: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
6a60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6a70: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6a80: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
6a90: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
6aa0: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
6ab0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
6ac0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
6ad0: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
6ae0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6af0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6b00: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
6b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6b20: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
6b30: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
6b40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6b50: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
6b60: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
6b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6b80: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
6b90: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
6ba0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
6bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6bc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6bd0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
6be0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
6bf0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
6c00: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
6c10: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
6c20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6c30: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
6c40: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
6c50: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
6c60: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
6c70: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
6c80: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
6c90: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
6ca0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
6cb0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6cc0: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
6cd0: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
6ce0: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
6cf0: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
6d00: 61 73 65 73 20 74 68 61 74 20 74 68 65 79 20 77  ases that they w
6d10: 69 6c 6c 20 62 65 20 75 73 69 6e 67 2e 20 20 41  ill be using.  A
6d20: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
6d30: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
6d40: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
6d50: 62 74 72 65 65 4d 61 73 6b 20 61 6e 64 20 69 73  btreeMask and is
6d60: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
6d70: 67 20 61 6e 64 20 6f 74 68 65 72 20 70 75 72 70  g and other purp
6d80: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
6d90: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6da0: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
6db0: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
6dc0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
6dd0: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
6de0: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
6df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
6e00: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
6e10: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70  eeMask)*8 );.  p
6e20: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28  ->btreeMask |= (
6e30: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
6e40: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
6e50: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
6e60: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
6e70: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  .pBt) ){.    p->
6e80: 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44  lockMask |= ((yD
6e90: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  bMask)1)<<i;.  }
6ea0: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6eb0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
6ec0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
6ed0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
6ee0: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
6ef0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
6f00: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
6f10: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
6f20: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
6f30: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6f40: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
6f50: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
6f60: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
6f70: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
6f80: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
6f90: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
6fa0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
6fb0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
6fc0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
6fd0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
6fe0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
6ff0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
7000: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
7010: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
7020: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
7030: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
7040: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
7050: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
7060: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7070: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
7080: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7090: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
70a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
70b0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
70c0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
70d0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
70e0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
70f0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7100: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
7110: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
7120: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
7130: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7140: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
7150: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
7160: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
7170: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
7180: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7190: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
71a0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
71b0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
71c0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
71d0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
71e0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
71f0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
7200: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
7210: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
7220: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7230: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7240: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7250: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
7260: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
7270: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
7280: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
7290: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
72a0: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
72b0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
72c0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
72d0: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
72e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72f0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
7300: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
7310: 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  yDbMask mask;.  
7320: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
7330: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
7340: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  b;.  if( p->lock
7350: 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  Mask==0 ) return
7360: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
7370: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
7380: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
7390: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
73a0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
73b0: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
73c0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
73d0: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
73e0: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
73f0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26  ->lockMask)!=0 &
7400: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
7410: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
7420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7430: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
7440: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
7450: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
7460: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
7470: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
7480: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
7490: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
74a0: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
74b0: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
74c0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
74d0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
74e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
74f0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
7500: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
7510: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
7520: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7530: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
7540: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
7550: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
7560: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
7570: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
7580: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
7590: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
75a0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
75b0: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
75c0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
75d0: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
75e0: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
75f0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
7600: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
7610: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
7620: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
7630: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
7640: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
7650: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
7660: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
7670: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7680: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
7690: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
76a0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
76b0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
76c0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
76d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
76e0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
76f0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
7700: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
7710: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
7720: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
7730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7740: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
7750: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
7760: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
7770: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
7780: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
7790: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
77a0: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
77b0: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
77c0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
77d0: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
77e0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
77f0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
7800: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
7810: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
7820: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
7830: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7840: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
7850: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
7860: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
7870: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
7880: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
7890: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
78a0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
78b0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
78c0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
78d0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
78e0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
78f0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
7900: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b  {.    Mem *pEnd;
7910: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
7920: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38   = p->db;.    u8
7930: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
7940: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7950: 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  d;.    if( db->p
7960: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20  nBytesFreed ){. 
7970: 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70       for(pEnd=&p
7980: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
7990: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
79a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
79b0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
79c0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
79d0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45      }.    for(pE
79e0: 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64  nd=&p[N]; p<pEnd
79f0: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; p++){.      as
7a00: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
7a10: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
7a20: 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20  p[1].db );..    
7a30: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
7a40: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
7a50: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
7a60: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
7a70: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
7a80: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
7a90: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
7aa0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
7ab0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
7ac0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
7ad0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
7ae0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
7af0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
7b00: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
7b10: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
7b20: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
7b30: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
7b40: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
7b50: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
7b60: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
7b70: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
7b80: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
7b90: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
7ba0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
7bb0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
7bc0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
7bd0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
7be0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
7bf0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
7c00: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
7c10: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
7c20: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
7c30: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
7c40: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
7c50: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
7c60: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
7c70: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
7c80: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
7c90: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
7ca0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
7cb0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
7cc0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
7cd0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
7ce0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
7cf0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
7d00: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
7d10: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
7d20: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
7d30: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
7d40: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d50: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
7d60: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7d70: 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  f( p->zMalloc ){
7d80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
7da0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
7db0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  p->zMalloc = 0;.
7dc0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
7dd0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7de0: 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  valid;.    }.   
7df0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7e00: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7e10: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7e20: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7e30: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7e40: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7e50: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7e60: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7e70: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7e80: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7e90: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7ea0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7eb0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7ec0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7ed0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7ee0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7ef0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7f00: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7f10: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7f20: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7f30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7f40: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7f60: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7f70: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7f80: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7f90: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7fa0: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7fb0: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7fc0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fe0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7ff0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
8000: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
8010: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
8020: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8030: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
8040: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
8050: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
8060: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
8070: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
8080: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
8090: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
80a0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
80b0: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
80c0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
80d0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
80e0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
80f0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
8100: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
8110: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
8120: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
8130: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
8140: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
8150: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
8160: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
8170: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
8180: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
8190: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
81a0: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
81b0: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
81c0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
81d0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
81e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
81f0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
8200: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
8210: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8220: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
8230: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
8240: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
8250: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
8260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8270: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
8280: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82a0: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
82b0: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
82c0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
82d0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
8300: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
8310: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
8320: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
8330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8340: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
8350: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
8360: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8380: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
8390: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
83a0: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
83b0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83d0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
83e0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
83f0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8420: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
8430: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8450: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8460: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
8470: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
8480: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8490: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
84a0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
84b0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
84c0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
84d0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
84e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
84f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
8500: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
8510: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
8520: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
8530: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
8540: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
8550: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
8560: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
8570: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
8580: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
8590: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
85a0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
85b0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
85c0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
85d0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
85e0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
85f0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
8600: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
8610: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
8620: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8630: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
8640: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8650: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
8660: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
8670: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
8680: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
8690: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
86a0: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
86b0: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
86c0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
86d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
86e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
8700: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
8710: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
8720: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
8730: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
8740: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
8750: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
8760: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
8770: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
8780: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
8790: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
87a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
87b0: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
87c0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
87d0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
87e0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
87f0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
8800: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
8810: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
8820: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
8830: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
8840: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
8850: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
8860: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
8870: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
8880: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
8890: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
88a0: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
88b0: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
88c0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
88d0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
88e0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
88f0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
8900: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
8910: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
8920: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
8930: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
8940: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
8950: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
8960: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
8970: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
8980: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
8990: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
89a0: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
89b0: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
89c0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
89d0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
89e0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
89f0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
8a00: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
8a10: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
8a20: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8a30: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8a40: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8a50: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8a60: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8a70: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8a80: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8a90: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8aa0: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8ab0: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
8ac0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
8ad0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
8ae0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8af0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8b00: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
8b10: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8b20: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8b30: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8b40: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8b50: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8b60: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8b70: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8b80: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8b90: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8ba0: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8bb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8bc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
8bd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
8be0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
8bf0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
8c00: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
8c10: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8c20: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8c30: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8c40: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8c50: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8c60: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8c80: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8c90: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8ca0: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8cb0: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
8cc0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
8cd0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
8ce0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
8cf0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
8d00: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
8d10: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d30: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8d40: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8d50: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8d60: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8d70: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8d80: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8d90: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8da0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8db0: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
8dc0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
8dd0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
8de0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8df0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
8e00: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
8e10: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8e20: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8e30: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8e40: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8e50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e60: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8e70: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8e80: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8e90: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ec0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
8ed0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
8ee0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
8ef0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
8f00: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
8f10: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8f20: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8f30: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8f40: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8f50: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8f60: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8f70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8f80: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8f90: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8fa0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8fb0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8fc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8fd0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8fe0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
8ff0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
9000: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
9010: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
9020: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
9030: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
9040: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
9050: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
9060: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
9070: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
9080: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
9090: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
90a0: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
90b0: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
90c0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
90d0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
90e0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
90f0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
9100: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9110: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
9120: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
9130: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
9140: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
9150: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9160: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
9170: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9180: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
9190: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
91a0: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
91b0: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
91c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91d0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
91e0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
91f0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9200: 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29  Sub, nByte, 1) )
9210: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  {.          apSu
9220: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
9230: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
9240: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62        apSub[nSub
9250: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50  ++] = pOp->p4.pP
9260: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
9270: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d    pSub->flags |=
9280: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20   MEM_Blob;.     
9290: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e       pSub->n = n
92a0: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  Sub*sizeof(SubPr
92b0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
92c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
92d0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
92e0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
92f0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
9300: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20  ->p1;           
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9320: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P1 */.    pMem
9330: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9340: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
9350: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
9360: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9370: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
9380: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
93b0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
93c0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
93d0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
93e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
93f0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
9400: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
9410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9420: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
9430: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
9440: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
9450: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
9460: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
9470: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
9480: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
9490: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
94a0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
94b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
94c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
94d0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
94e0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
94f0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
9500: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
9510: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
9520: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
9530: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
9540: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
9550: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9560: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
9570: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
9580: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9590: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
95a0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
95b0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
95c0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
95d0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
95e0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
95f0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
9600: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
9610: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
9620: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
9630: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
9640: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
9650: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
9660: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
9670: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9680: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
9690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
96a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
96b0: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
96c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
96d0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
96e0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
96f0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
9700: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
9710: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
9720: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
9730: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
9740: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
9750: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d  TEXT;.      pMem
9760: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
9770: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
9780: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
9790: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
97a0: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  if( pOp->zCommen
97b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  t ){.        pMe
97c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
97d0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
97e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70       pMem->z = p
97f0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  Op->zComment;.  
9800: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
9810: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
9820: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
9830: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9840: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9850: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9860: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9870: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
9880: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
9890: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
98a0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
98d0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
98e0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
98f0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9900: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
9910: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
9920: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
9930: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
9940: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
9950: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9960: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
9970: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
9980: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
9990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
99a0: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
99b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
99c0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
99d0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
99e0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
99f0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
9a00: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
9a10: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
9a20: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9a30: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9a40: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  Op;.  if( nOp<1 
9a50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
9a60: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
9a70: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
9a80: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70  =OP_Trace && pOp
9a90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
9aa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
9ab0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
9ac0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
9ad0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
9ae0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
9af0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
9b00: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
9b10: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9b20: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
9b30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9b40: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
9b50: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
9b60: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
9b70: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
9b80: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9b90: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
9ba0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
9bb0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
9bc0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
9bd0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
9be0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
9bf0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
9c00: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
9c10: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
9c20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
9c30: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
9c40: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
9c50: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
9c60: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
9c70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9c80: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
9c90: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
9ca0: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
9cb0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b  e3Isspace(z[i]);
9cc0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
9cd0: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
9ce0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9cf0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20  e3Isspace(z[i]) 
9d00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
9d10: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
9d20: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
9d30: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
9d40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9d50: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
9d60: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
9d70: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
9d80: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
9d90: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
9da0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9db0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
9dc0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
9dd0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
9de0: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  /../*.** Allocat
9df0: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66  e space from a f
9e00: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72  ixed size buffer
9e10: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
9e20: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74  inter to.** that
9e30: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75   space.  If insu
9e40: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69  fficient space i
9e50: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74  s available, ret
9e60: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
9e70: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74  The pBuf paramet
9e80: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  er is the initia
9e90: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69  l value of a poi
9ea0: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a  nter which will.
9eb0: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e  ** receive the n
9ec0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66  ew memory.  pBuf
9ed0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c   is normally NUL
9ee0: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e  L.  If pBuf is n
9ef0: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d  ot.** NULL, it m
9f00: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79  eans that memory
9f10: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61   space has alrea
9f20: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
9f30: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68  d and that.** th
9f40: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
9f50: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  d not allocate a
9f60: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20  ny new memory.  
9f70: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74  When pBuf is not
9f80: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20  .** NULL simply 
9f90: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e  return pBuf.  On
9fa0: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20  ly allocate new 
9fb0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65  memory space whe
9fc0: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c  n pBuf.** is NUL
9fd0: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69  L..**.** nByte i
9fe0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9ff0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e  bytes of space n
a000: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70  eeded..**.** *pp
a010: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61  From points to a
a020: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61  vailable space a
a030: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74  nd pEnd points t
a040: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
a050: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70  .** available sp
a060: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65  ace.  When space
a070: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a   is allocated, *
a080: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63  ppFrom is advanc
a090: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65  ed past.** the e
a0a0: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  nd of the alloca
a0b0: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a  ted space..**.**
a0c0: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f   *pnByte is a co
a0d0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
a0e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
a0f0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
a100: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
a110: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
a120: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
a130: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f   space in *ppFro
a140: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  m to satisfy the
a150: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65  .** request, the
a160: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  n increment *pnB
a170: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  yte by the amoun
a180: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
a190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a1a0: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
a1b0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
a1c0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
a1d0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
a1e0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
a1f0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
a200: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a210: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
a220: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  cate */.  u8 **p
a230: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f  pFrom,         /
a240: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61  * IN/OUT: Alloca
a250: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20  te from *ppFrom 
a260: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20  */.  u8 *pEnd,  
a270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
a280: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70  nter to 1 byte p
a290: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a  ast the end of *
a2a0: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f  ppFrom buffer */
a2b0: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20  .  int *pnByte  
a2c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
a2d0: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  location cannot 
a2e0: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65  be made, increme
a2f0: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b  nt *pnByte */.){
a300: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
a310: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
a320: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  *ppFrom) );.  if
a330: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20  ( pBuf ) return 
a340: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20  pBuf;.  nByte = 
a350: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20  ROUND8(nByte);. 
a360: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b   if( &(*ppFrom)[
a370: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29  nByte] <= pEnd )
a380: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f  {.    pBuf = (vo
a390: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20  id*)*ppFrom;.   
a3a0: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74   *ppFrom += nByt
a3b0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
a3c0: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65  *pnByte += nByte
a3d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
a3e0: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Buf;.}../*.** Re
a3f0: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61  wind the VDBE ba
a400: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
a410: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69  ing in preparati
a420: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e  on for.** runnin
a430: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  g it..*/.void sq
a440: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a450: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65  Vdbe *p){.#if de
a460: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
a470: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56  UG) || defined(V
a480: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69  DBE_PROFILE).  i
a490: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nt i;.#endif.  a
a4a0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
a4b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
a4c0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
a4d0: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72  IT );..  /* Ther
a4e0: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c  e should be at l
a4f0: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e  east one opcode.
a500: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a510: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f  p->nOp>0 );..  /
a520: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20  * Set the magic 
a530: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  to VDBE_MAGIC_RU
a540: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20  N sooner rather 
a550: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20  than later. */. 
a560: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
a570: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66  _MAGIC_RUN;..#if
a580: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a590: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d  .  for(i=1; i<p-
a5a0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nMem; i++){.   
a5b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
a5c0: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b  [i].db==p->db );
a5d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
a5e0: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72  >pc = -1;.  p->r
a5f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
a600: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20   p->errorAction 
a610: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d  = OE_Abort;.  p-
a620: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
a630: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
a640: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
a650: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
a660: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
a670: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
a680: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
a690: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72  ;.  p->nFkConstr
a6a0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66  aint = 0;.#ifdef
a6b0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
a6c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
a6d0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  p; i++){.    p->
a6e0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
a6f0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
a700: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  cles = 0;.  }.#e
a710: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ndif.}../*.** Pr
a720: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
a730: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
a740: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69  ution for the fi
a750: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a  rst time after.*
a760: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76  * creating the v
a770: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a780: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
a790: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
a7a0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
a7b0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
a7c0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
a7d0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
a7e0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
a7f0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
a800: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
a810: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
a820: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
a830: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
a840: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
a850: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
a860: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20  lled exact once 
a870: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61  on a each virtua
a880: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
a890: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
a8a0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
a8b0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
a8c0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
a8d0: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
a8e0: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
a8f0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74  e is called, fut
a900: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
a910: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a920: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
a930: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
a940: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
a950: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
a960: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
a970: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
a980: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
a990: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
a9a0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
a9b0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
a9c0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
a9d0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
a9e0: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
a9f0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
aa00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
aa10: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
aa20: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
aa30: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
aa40: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
aa50: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
aa60: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
aa70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
aa80: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
aa90: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aab0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
aac0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aae0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
aaf0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
ab00: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
ab10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
ab20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ab30: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
ab40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ab50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ab60: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
ab70: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
aba0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
abb0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
abc0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
abd0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
abe0: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
abf0: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
ac00: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
ac10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ac20: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ac30: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
ac40: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ac70: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
ac80: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
ac90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
acb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
acc0: 38 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20  8 *zCsr;        
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ace0: 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   Memory availabl
acf0: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
ad00: 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20   */.  u8 *zEnd; 
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
ad30: 74 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65  te past allocate
ad40: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
ad50: 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad70: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
ad80: 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20  emory is needed 
ad90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  */..  assert( p!
ada0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
adb0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
adc0: 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
add0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
ade0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
adf0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d  C_INIT );.  db =
ae00: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
ae10: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ae20: 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20  ed==0 );.  nVar 
ae30: 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a  = pParse->nVar;.
ae40: 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d    nMem = pParse-
ae50: 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72  >nMem;.  nCursor
ae60: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b   = pParse->nTab;
ae70: 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65  .  nArg = pParse
ae80: 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e  ->nMaxArg;.  nOn
ae90: 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  ce = pParse->nOn
aea0: 63 65 3b 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20  ce;.  .  /* For 
aeb0: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
aec0: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
aed0: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
aee0: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
aef0: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
af00: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
af10: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
af20: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
af30: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
af40: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
af50: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
af60: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
af70: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
af80: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
af90: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
afa0: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
afb0: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
afc0: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
afd0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
afe0: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
aff0: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
b000: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
b010: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
b020: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
b030: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
b040: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
b050: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
b060: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
b070: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c  Cursor;..  /* Al
b080: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
b090: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
b0a0: 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73  s, SQL variables
b0b0: 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61  , VDBE cursors a
b0c0: 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61  nd .  ** an arra
b0d0: 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c  y to marshal SQL
b0e0: 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   function argume
b0f0: 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a  nts in..  */.  z
b100: 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61  Csr = (u8*)&p->a
b110: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20  Op[p->nOp];     
b120: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c    /* Memory aval
b130: 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  iable for alloca
b140: 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d  tion */.  zEnd =
b150: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
b160: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
b170: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
b180: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
b190: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
b1a0: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
b1b0: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
b1c0: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
b1d0: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
b1e0: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
b1f0: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
b200: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
b210: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
b220: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
b230: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
b240: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
b250: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
b260: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
b270: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
b280: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
b290: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
b2a0: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
b2b0: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
b2c0: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
b2d0: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
b2e0: 74 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20  ted in two.  ** 
b2f0: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
b300: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
b310: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
b320: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
b330: 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  .  ** end of the
b340: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
b350: 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  If we are unable
b360: 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20   to satisfy all 
b370: 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75  memory.  ** requ
b380: 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73  irements by reus
b390: 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61  ing the opcode a
b3a0: 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20  rray tail, then 
b3b0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20  the second.  ** 
b3c0: 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69  pass will fill i
b3d0: 6e 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67  n the rest using
b3e0: 20 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74   a fresh allocat
b3f0: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ion.  .  **.  **
b400: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61   This two-pass a
b410: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75  pproach that reu
b420: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f  ses as much memo
b430: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ry as possible f
b440: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66  rom.  ** the lef
b450: 74 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74  tover space at t
b460: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  he end of the op
b470: 63 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73  code array can s
b480: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a  ignificantly.  *
b490: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f  * reduce the amo
b4a0: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65  unt of memory he
b4b0: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64  ld by a prepared
b4c0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
b4d0: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74  .  do {.    nByt
b4e0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  e = 0;.    p->aM
b4f0: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
b500: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69  p->aMem, nMem*si
b510: 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72  zeof(Mem), &zCsr
b520: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b530: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
b540: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61  llocSpace(p->aVa
b550: 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d  r, nVar*sizeof(M
b560: 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  em), &zCsr, zEnd
b570: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b580: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
b590: 70 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e  pace(p->apArg, n
b5a0: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
b5b0: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
b5c0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
b5d0: 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  zVar = allocSpac
b5e0: 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72  e(p->azVar, nVar
b5f0: 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20  *sizeof(char*), 
b600: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b610: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  yte);.    p->apC
b620: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
b630: 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f  p->apCsr, nCurso
b640: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
b650: 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20  sor*),.         
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
b680: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
b690: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
b6a0: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
b6b0: 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c  g, nOnce, &zCsr,
b6c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
b6d0: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b      if( nByte ){
b6e0: 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20  .      p->pFree 
b6f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
b700: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
b710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72  ;.    }.    zCsr
b720: 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20   = p->pFree;.   
b730: 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42   zEnd = &zCsr[nB
b740: 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20  yte];.  }while( 
b750: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61  nByte && !db->ma
b760: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
b770: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 28 75   p->nCursor = (u
b780: 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d  16)nCursor;.  p-
b790: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
b7a0: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
b7b0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
b7c0: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
b7d0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
b7e0: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
b7f0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
b800: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
b810: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
b820: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
b830: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
b840: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
b850: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
b860: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
b870: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
b880: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
b890: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
b8a0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
b8b0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
b8c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
b8d0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
b8e0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
b8f0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
b900: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
b930: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
b940: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
b950: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b960: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
b970: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
b980: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
b990: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
b9a0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
b9b0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  n].flags = MEM_I
b9c0: 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20 20 70 2d  nvalid;.      p-
b9d0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
b9e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
b9f0: 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
ba00: 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71  e->explain;.  sq
ba10: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
ba20: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
ba30: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
ba40: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
ba50: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
ba60: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
ba70: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
ba80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ba90: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
baa0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
bab0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
bac0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
bad0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
bae0: 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73  e3VdbeSorterClos
baf0: 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20  e(p->db, pCx);. 
bb00: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
bb10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bb20: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
bb30: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
bb40: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
bb50: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
bb60: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
bb70: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
bb80: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
bb90: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
bba0: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
bbb0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
bbc0: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
bbd0: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
bbe0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bbf0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
bc00: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
bc10: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
bc20: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
bc30: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
bc40: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
bc50: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
bc60: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
bc70: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
bc80: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
bc90: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
bca0: 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28  pModule->xClose(
bcb0: 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20  pVtabCursor);.  
bcc0: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
bcd0: 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
bce0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
bcf0: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
bd00: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
bd10: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
bd20: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
bd30: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
bd40: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
bd50: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
bd60: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
bd70: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
bd80: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
bd90: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
bda0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
bdb0: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
bdc0: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
bdd0: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
bde0: 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67  ;.  v->aOnceFlag
bdf0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65   = pFrame->aOnce
be00: 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65  Flag;.  v->nOnce
be10: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  Flag = pFrame->n
be20: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61  OnceFlag;.  v->a
be30: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70  Op = pFrame->aOp
be40: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72  ;.  v->nOp = pFr
be50: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61  ame->nOp;.  v->a
be60: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d  Mem = pFrame->aM
be70: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20  em;.  v->nMem = 
be80: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pFrame->nMem;.  
be90: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d  v->apCsr = pFram
bea0: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e  e->apCsr;.  v->n
beb0: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d  Cursor = pFrame-
bec0: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64  >nCursor;.  v->d
bed0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70  b->lastRowid = p
bee0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64  Frame->lastRowid
bef0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  v->nChange =
bf00: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65   pFrame->nChange
bf10: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
bf20: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
bf30: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
bf40: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
bf50: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
bf60: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
bf70: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
bf80: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
bf90: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
bfa0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
bfb0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
bfc0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
bfd0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
bfe0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
bff0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
c000: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
c010: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
c020: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
c030: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c040: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
c050: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
c060: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
c070: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
c080: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
c090: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
c0a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
c0b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
c0c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
c0d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
c0e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a  re(pFrame);.  }.
c0f0: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
c100: 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30  .  p->nFrame = 0
c110: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
c120: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
c130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c140: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
c150: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
c160: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
c170: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
c180: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
c190: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
c1a0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
c1b0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
c1c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
c1d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
c1e0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
c1f0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
c200: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
c210: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
c220: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
c230: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
c240: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
c250: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
c260: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
c270: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
c280: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
c290: 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pDel);.  }.}../*
c2a0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
c2b0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
c2c0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
c2d0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
c2e0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
c2f0: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
c300: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
c310: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
c320: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
c330: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
c340: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
c350: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
c360: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
c370: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
c380: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nup(Vdbe *p){.  
c390: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
c3a0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  >db;..#ifdef SQL
c3b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45  ITE_DEBUG.  /* E
c3c0: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20  xecute assert() 
c3d0: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
c3e0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64  sure that the Vd
c3f0: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a  be.apCsr[] and .
c400: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d    ** Vdbe.aMem[]
c410: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72   arrays have alr
c420: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65  eady been cleane
c430: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  d up.  */.  int 
c440: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  i;.  if( p->apCs
c450: 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  r ) for(i=0; i<p
c460: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20  ->nCursor; i++) 
c470: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72  assert( p->apCsr
c480: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  [i]==0 );.  if( 
c490: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66  p->aMem ){.    f
c4a0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d  or(i=1; i<=p->nM
c4b0: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
c4c0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
c4d0: 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69 64 20 29  s==MEM_Invalid )
c4e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
c4f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c500: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
c510: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
c520: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
c530: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
c540: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
c550: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
c560: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
c570: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
c580: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
c590: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
c5a0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
c5b0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
c5c0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
c5d0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
c5e0: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
c5f0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
c600: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
c610: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
c620: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
c630: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
c640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
c650: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
c660: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
c670: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
c680: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
c690: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
c6a0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
c6b0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
c6c0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
c6d0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
c6e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
c6f0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
c700: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
c710: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
c720: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
c730: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
c740: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
c750: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
c760: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
c770: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
c780: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
c790: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
c7a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
c7b0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
c7c0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
c7d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
c7e0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
c7f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
c800: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
c810: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c820: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
c830: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
c840: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
c850: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
c860: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
c870: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
c880: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
c890: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
c8a0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
c8b0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
c8c0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
c8d0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
c8e0: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
c8f0: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
c900: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
c910: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
c920: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
c930: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
c940: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
c950: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
c960: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
c970: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
c980: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
c990: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
c9a0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
c9b0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
c9c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c9d0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
c9e0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
ca10: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
ca20: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ca40: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
ca50: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
ca60: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
ca90: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
caa0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
cab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
cac0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
cad0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
cae0: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
caf0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
cb00: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
cb20: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
cb30: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
cb40: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
cb50: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
cb60: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
cb70: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
cb80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
cb90: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
cba0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
cbb0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
cbc0: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
cbd0: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
cbe0: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
cbf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
cc00: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
cc10: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
cc20: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
cc30: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
cc40: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
cc50: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
cc60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
cc70: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
cc80: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
cc90: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
cca0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
ccb0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
ccc0: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
ccd0: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
cce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ccf0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
cd00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
cd10: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
cd20: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
cd30: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
cd40: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
cd50: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
cd60: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
cd70: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
cd80: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
cd90: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
cda0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
cdb0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
cdc0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
cdd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cde0: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
cdf0: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
ce00: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
ce10: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
ce20: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
ce30: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
ce40: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
ce50: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
ce60: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
ce70: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ce80: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
ce90: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
cea0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
ceb0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
cec0: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
ced0: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
cee0: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
cef0: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
cf00: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
cf10: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
cf20: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
cf30: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
cf40: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
cf50: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
cf60: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
cf70: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
cf80: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
cf90: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
cfa0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
cfb0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
cfc0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
cfd0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
cfe0: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
cff0: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
d000: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
d010: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
d020: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
d030: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
d040: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
d050: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
d060: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
d070: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
d080: 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d 3e  tabSync(db, &p->
d090: 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a 20  zErrMsg);..  /* 
d0a0: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
d0b0: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
d0c0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
d0d0: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
d0e0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
d0f0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
d100: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
d110: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
d120: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
d130: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
d140: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
d150: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
d160: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
d170: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
d180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
d190: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
d1a0: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
d1b0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
d1c0: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
d1d0: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
d1e0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
d1f0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
d200: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
d210: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
d220: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d230: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
d240: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
d250: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
d260: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
d270: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
d280: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
d290: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2a0: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
d2b0: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
d2c0: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
d2d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21   }.  }.  if( rc!
d2e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d2f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d300: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d310: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72  are any write-tr
d320: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c  ansactions at al
d330: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  l, invoke the co
d340: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69  mmit hook */.  i
d350: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26  f( needXcommit &
d360: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  & db->xCommitCal
d370: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20  lback ){.    rc 
d380: 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c  = db->xCommitCal
d390: 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69  lback(db->pCommi
d3a0: 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72  tArg);.    if( r
d3b0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
d3c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
d3d0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
d3e0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
d3f0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
d400: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
d410: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
d420: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
d430: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
d440: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
d450: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
d460: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
d470: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
d480: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
d490: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
d4a0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
d4b0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
d4c0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
d4d0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
d4e0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
d4f0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
d500: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
d510: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
d520: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
d530: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
d540: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
d550: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
d560: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
d570: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
d580: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
d590: 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
d5a0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
d5b0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
d5c0: 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
d5d0: 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
d5e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d5f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d600: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
d610: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
d620: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
d630: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
d640: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d650: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
d660: 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
d670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
d680: 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
d690: 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
d6a0: 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
d6b0: 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
d6c0: 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
d6d0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
d6e0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
d6f0: 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
d700: 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
d710: 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
d720: 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
d730: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
d740: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
d750: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
d760: 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
d770: 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
d780: 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
d790: 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
d7a0: 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
d7b0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
d7c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d7d0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d7e0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d7f0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d800: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d810: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d820: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d830: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
d840: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d850: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
d860: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
d880: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
d890: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
d8a0: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
d8b0: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
d8c0: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
d8d0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
d8e0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
d8f0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
d900: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
d910: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
d920: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
d930: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
d940: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
d950: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
d960: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
d970: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
d980: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
d990: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
d9a0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
d9b0: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
d9c0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
d9d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
d9e0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
d9f0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
da00: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
da10: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
da20: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
da30: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
da40: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
da50: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
da60: 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
da70: 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
da80: 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
da90: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
daa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
dab0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
dac0: 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
dad0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
dae0: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
daf0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
db00: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
db10: 58 58 58 58 58 39 58 58 22 2c 20 7a 4d 61 69 6e  XXXXX9XX", zMain
db20: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
db30: 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
db40: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
db50: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
db60: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
db70: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
db80: 74 2b 2b 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  t++>100 ){.     
db90: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
dba0: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 63 61 6e  QLITE_FULL, "can
dbb0: 6e 6f 74 20 66 69 6e 64 20 75 6e 69 71 75 65 20  not find unique 
dbc0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 22 29  master-journal")
dbd0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
dbe0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
dbf0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
dc00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc10: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
dc20: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
dc30: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69  eof(iRandom), &i
dc40: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73  Random);.      s
dc50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
dc60: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61  13, &zMaster[nMa
dc70: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36  inFile], "-mj%06
dc80: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20  X9%02X",.       
dc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dca0: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d          (iRandom
dcb0: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69  >>8)&0xffffff, i
dcc0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20  Random&0xff);.  
dcd0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70      /* The antip
dce0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61  enultimate chara
dcf0: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74  cter of the mast
dd00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
dd10: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
dd20: 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61   "9" to avoid na
dd30: 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68  me collisions wh
dd40: 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c  en using 8+3 fil
dd50: 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20  enames. */.     
dd60: 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72   assert( zMaster
dd70: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
dd80: 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39  (zMaster)-3]=='9
dd90: 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ' );.      sqlit
dda0: 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d  e3FileSuffix3(zM
ddb0: 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72  ainFile, zMaster
ddc0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
ddd0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
dde0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
ddf0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
de00: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
de10: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
de20: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
de30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
de40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
de50: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
de60: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
de70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
de80: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
de90: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
dea0: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
deb0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
dec0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
ded0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
dee0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
def0: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
df00: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
df10: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
df20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
df30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
df40: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
df50: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
df60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
df70: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
df80: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
df90: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
dfa0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
dfb0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
dfc0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
dfd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
dfe0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
dff0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
e000: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
e010: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
e020: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e030: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
e040: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
e050: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
e060: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
e070: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e080: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
e090: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
e0a0: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
e0b0: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
e0c0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
e0d0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
e0e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
e0f0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
e100: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
e110: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
e120: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
e130: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
e140: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
e150: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65   *zFile = sqlite
e160: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c  3BtreeGetJournal
e170: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20  name(pBt);.     
e180: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20     if( zFile==0 
e190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
e1a0: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
e1b0: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f  e TEMP and :memo
e1c0: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
e1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e1e0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
e1f0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  [0]!=0 );.      
e200: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
e210: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
e220: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
e230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
e240: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
e250: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
e260: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e270: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
e280: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
e290: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
e2a0: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
e2b0: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
e2c0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
e2d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
e2e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e2f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e300: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
e310: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
e320: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e330: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
e340: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
e350: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e360: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
e370: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
e380: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e390: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
e3a0: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
e3b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
e3c0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
e3d0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
e3e0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
e3f0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
e400: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
e410: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
e420: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
e430: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
e440: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
e450: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
e460: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
e470: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
e480: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
e490: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
e4a0: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
e4b0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
e4c0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
e4d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
e4e0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
e4f0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
e500: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
e510: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e520: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e530: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e540: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
e550: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
e560: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
e570: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
e580: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
e590: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
e5a0: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
e5b0: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
e5c0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
e5d0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e5e0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
e5f0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
e600: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
e610: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
e620: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
e630: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
e640: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
e650: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
e660: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
e670: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
e680: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
e690: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
e6a0: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
e6b0: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
e6c0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
e6d0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
e6e0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
e6f0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
e700: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
e710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
e720: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
e730: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
e740: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rred..    */.   
e750: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e760: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e770: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
e780: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e790: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e7a0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e7b0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e7c0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
e7d0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
e7e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
e7f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
e800: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
e810: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ster);.    asser
e820: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  t( rc!=SQLITE_BU
e830: 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  SY );.    if( rc
e840: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e850: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e860: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e870: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
e880: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e890: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
e8a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
e8b0: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
e8c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
e8d0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
e8e0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
e8f0: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
e900: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
e910: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
e920: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
e930: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
e940: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
e950: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
e960: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
e970: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e980: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
e990: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
e9a0: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
e9b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
e9c0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
e9d0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
e9e0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
e9f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
ea00: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
ea10: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
ea20: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
ea30: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
ea40: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
ea50: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
ea60: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
ea70: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
ea80: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
ea90: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
eaa0: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
eab0: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
eac0: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
ead0: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
eae0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
eaf0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
eb00: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
eb10: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
eb20: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
eb30: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
eb40: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
eb50: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
eb60: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
eb70: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
eb80: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
eb90: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
eba0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
ebb0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
ebc0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ebd0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ebe0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
ebf0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ec00: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ec10: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
ec20: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ec30: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
ec40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ec50: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
ec60: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
ec70: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
ec80: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
ec90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
eca0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
ecb0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
ecc0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
ecd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
ece0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
ecf0: 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e  te3.activeVdbeCn
ed00: 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  t count variable
ed10: 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
ed20: 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
ed30: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
ed40: 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
ed50: 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
ed60: 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
ed70: 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
ed80: 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
ed90: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
eda0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
edb0: 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
edc0: 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
edd0: 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
ede0: 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
edf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
ee00: 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
ee10: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
ee20: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
ee30: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
ee40: 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
ee50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
ee60: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
ee70: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
ee80: 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  e = 0;.  p = db-
ee90: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
eea0: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
eeb0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
eec0: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
eed0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
eee0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
eef0: 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
ef00: 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rite++;.    }.  
ef10: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
ef20: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
ef30: 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t==db->activeVdb
ef40: 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  eCnt );.  assert
ef50: 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72  ( nWrite==db->wr
ef60: 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iteVdbeCnt );.}.
ef70: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
ef80: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
ef90: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
efa0: 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65  * For every Btre
efb0: 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61  e that in databa
efc0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
efd0: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62   which .** has b
efe0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74  een modified, "t
eff0: 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61  rip" or invalida
f000: 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69  te each cursor i
f010: 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20  n.** that Btree 
f020: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
f030: 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74  modified so that
f040: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
f050: 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  an never be used
f060: 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61   again.  This ha
f070: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c  ppens when a rol
f080: 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73  lback.*** occurs
f090: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72  .  We have to tr
f0a0: 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  ip all the other
f0b0: 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a   cursors, even.*
f0c0: 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74  * cursor from ot
f0d0: 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65  her VMs in diffe
f0e0: 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f  rent database co
f0f0: 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f  nnections,.** so
f100: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
f110: 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  em try to use th
f120: 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20  e data at which 
f130: 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69  they.** were poi
f140: 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20  nting and which 
f150: 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65  now may have bee
f160: 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a  n changed due.**
f170: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
f180: 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ..**.** Remember
f190: 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b   that a rollback
f1a0: 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c   can delete tabl
f1b0: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a  es complete and.
f1c0: 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70  ** reorder rootp
f1d0: 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20  ages.  So it is 
f1e0: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a  not sufficient j
f1f0: 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74  ust to save.** t
f200: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
f210: 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65  cursor.  We have
f220: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
f230: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20  he cursor.** so 
f240: 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72  that it is never
f250: 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a   used again..*/.
f260: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
f270: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
f280: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71  odifiedBtrees(sq
f290: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
f2a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
f2b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f2c0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
f2d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f2e0: 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c      if( p && sql
f2f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
f300: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ns(p) ){.      s
f310: 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
f320: 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c  llCursors(p, SQL
f330: 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
f340: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
f350: 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
f360: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
f370: 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
f380: 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
f390: 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
f3a0: 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
f3b0: 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
f3c0: 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
f3d0: 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
f3e0: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
f3f0: 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
f400: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
f410: 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
f420: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
f430: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
f440: 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
f450: 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
f460: 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
f470: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f480: 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a 2a 0a  is commtted..**.
f490: 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
f4a0: 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
f4b0: 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
f4c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
f4d0: 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
f4e0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
f4f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
f500: 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
f510: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
f520: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
f530: 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
f540: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f550: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
f560: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
f570: 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
f580: 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
f590: 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
f5a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
f5b0: 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
f5c0: 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
f5d0: 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
f5e0: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
f5f0: 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
f600: 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64 2c  ay have occured,
f610: 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
f620: 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
f630: 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
f640: 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
f650: 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
f660: 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
f670: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
f680: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
f690: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
f6a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
f6b0: 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
f6c0: 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
f6d0: 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
f6e0: 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
f6f0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
f700: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f710: 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
f720: 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
f730: 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
f740: 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
f750: 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
f760: 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
f770: 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
f780: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
f790: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
f7a0: 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
f7b0: 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
f7c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
f7d0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
f7e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
f7f0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f800: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
f810: 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
f820: 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
f830: 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
f840: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
f850: 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
f860: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
f870: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
f880: 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
f890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
f8a0: 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
f8b0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
f8c0: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
f8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
f8e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f8f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
f900: 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
f910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f920: 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
f930: 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
f940: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
f950: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f960: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
f970: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f980: 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
f990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
f9a0: 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
f9b0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
f9c0: 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
f9d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f9e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f9f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
fa00: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
fa10: 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
fa20: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
fa30: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
fa40: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
fa50: 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
fa60: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
fa70: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
fa80: 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
fa90: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
faa0: 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
fab0: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
fac0: 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
fad0: 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
fae0: 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
faf0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
fb00: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
fb10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
fb20: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
fb30: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
fb40: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
fb50: 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
fb60: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  s;.    }.  }.  r
fb70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fb80: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fb90: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
fba0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  a transaction op
fbb0: 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61  ened by the data
fbc0: 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20  base .** handle 
fbd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
fbe0: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73  the VM passed as
fbf0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20   an argument is 
fc00: 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20  about to be .** 
fc10: 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68  committed. If th
fc20: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
fc30: 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72  ing deferred for
fc40: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
fc50: 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e  int.** violation
fc60: 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  s, return SQLITE
fc70: 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73  _ERROR. Otherwis
fc80: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
fc90: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
fca0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20   outstanding FK 
fcb0: 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74  violations and t
fcc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
fcd0: 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
fce0: 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72  ERROR, set the r
fcf0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20  esult of the VM 
fd00: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  to SQLITE_CONSTR
fd10: 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a 2a  AINT and write.*
fd20: 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * an error messa
fd30: 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
fd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
fd50: 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
fd60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
fd70: 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
fd80: 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
fd90: 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
fda0: 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
fdb0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
fdc0: 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
fdd0: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
fde0: 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 72  s>0) || (!deferr
fdf0: 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73  ed && p->nFkCons
fe00: 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 20  traint>0) ){.   
fe10: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
fe20: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
fe30: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
fe40: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73   OE_Abort;.    s
fe50: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
fe60: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
fe70: 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f   "foreign key co
fe80: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
fe90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
fea0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
feb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fec0: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
fed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fee0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
fef0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
ff00: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
ff10: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
ff20: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
ff30: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
ff40: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
ff50: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
ff60: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
ff70: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
ff80: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
ff90: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
ffa0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
ffb0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
ffc0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
ffd0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
ffe0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
fff0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
10000 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
10010 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
10020 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
10030 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
10040 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
10050 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
10060 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
10070 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
10080 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
10090 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
100a0 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
100b0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
100c0 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
100d0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
100e0 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
100f0 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
10100 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
10110 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
10120 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
10130 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
10140 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65  /* Used to store
10170 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72   transient retur
10180 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c  n codes */.  sql
10190 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
101a0 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  ;..  /* This fun
101b0 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
101c0 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
101d0 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
101e0 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
101f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
10200 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
10210 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
10220 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
10230 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
10240 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
10250 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
10260 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
10270 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
10280 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
10290 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
102a0 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
102b0 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
102c0 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
102d0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
102e0 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
102f0 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
10300 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
10310 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
10320 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
10330 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
10340 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
10350 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
10360 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
10370 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
10380 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
10390 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
103a0 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
103b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
103c0 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
103d0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
103e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
103f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
10400 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  EM;.  }.  if( p-
10410 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d  >aOnceFlag ) mem
10420 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
10430 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
10440 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  g);.  closeAllCu
10450 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
10460 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
10470 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
10480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10490 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
104a0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
104b0 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
104c0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
104d0 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
104e0 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
104f0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
10500 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  0 ){.    int mrc
10510 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
10520 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
10530 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
10540 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
10550 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
10560 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
10570 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
10580 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
10590 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
105a0 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
105b0 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
105c0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
105d0 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
105e0 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
105f0 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
10600 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
10610 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
10620 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
10630 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
10640 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
10650 43 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73  CKED );  /* This
10660 20 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72   error no longer
10670 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69   exists */.    i
10680 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
10690 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
106a0 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
106b0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
106c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
106d0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
106e0 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
106f0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
10700 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
10710 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
10720 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
10730 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
10740 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
10750 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
10760 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
10770 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
10780 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
10790 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
107a0 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
107b0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
107c0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
107d0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
107e0 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
107f0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
10800 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
10810 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
10820 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
10830 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
10840 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
10850 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
10860 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
10870 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
10880 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
10890 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
108a0 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77      ** occured w
108b0 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
108c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
108d0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
108e0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
108f0 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
10900 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
10910 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
10920 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
10930 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
10940 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
10950 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
10960 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
10970 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
10980 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
10990 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
109a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
109b0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
109c0 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
109d0 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
109e0 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
109f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
10a00 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
10a10 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
10a20 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
10a30 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
10a40 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
10a50 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
10a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
10a70 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
10a80 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
10a90 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
10aa0 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
10ab0 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
10ac0 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
10ad0 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
10ae0 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
10af0 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
10b00 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
10b10 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
10b20 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
10b30 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
10b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10b50 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
10b60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10b70 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
10b80 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
10b90 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
10ba0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
10bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10bc0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
10bd0 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
10be0 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
10bf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
10c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10c10 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10c20 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
10c30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
10c40 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
10c50 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
10c60 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
10c70 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
10c80 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
10c90 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
10ca0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
10cb0 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
10cc0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
10cd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
10ce0 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
10cf0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
10d00 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
10d10 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
10d20 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
10d30 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
10d40 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
10d50 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
10d60 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
10d70 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
10d80 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65  && db->writeVdbe
10d90 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  Cnt==(p->readOnl
10da0 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
10db0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
10dc0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
10dd0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
10de0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
10df0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
10e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10e10 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
10e20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
10e50 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
10e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
10e70 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
10e80 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
10e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
10ea0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
10eb0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
10ec0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
10ed0 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  NT;.        }els
10ee0 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
10ef0 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
10f00 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
10f10 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
10f20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
10f30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
10f40 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
10f50 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
10f60 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
10f70 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
10f80 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
10f90 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
10fa0 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
10fb0 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
10fc0 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
10fd0 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
10fe0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
10ff0 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
11000 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
11010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
11020 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11030 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
11040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11050 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
11060 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11070 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
11080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11090 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
110a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
110b0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
110c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
110d0 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
110e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
110f0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11100 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
11110 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
11120 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
11130 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
11140 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11150 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11160 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
11170 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
11180 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
11190 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
111a0 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
111b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
111c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
111d0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
111e0 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
111f0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
11200 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
11210 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
11220 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
11230 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
11240 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
11250 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
11260 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
11270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11280 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
11290 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
112a0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  s(db);.        s
112b0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
112c0 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  l(db);.        s
112d0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
112e0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
112f0 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11300 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
11310 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11320 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
11330 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11340 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
11350 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
11360 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
11370 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
11380 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
11390 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
113a0 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
113b0 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
113c0 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
113d0 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
113e0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
113f0 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
11400 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
11410 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
11420 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
11430 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
11440 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
11450 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
11460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11470 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
11480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11490 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
114a0 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
114b0 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
114c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
114d0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
114e0 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
114f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
11500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
11510 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
11520 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11530 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
11540 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a  ;.          p->z
11550 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
11560 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e      }.        in
11570 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
11580 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
11590 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
115a0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
115b0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
115c0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
115d0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
115e0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
115f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
11600 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
11610 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45  this was an INSE
11620 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45  RT, UPDATE or DE
11630 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74  LETE and no stat
11640 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11650 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
11660 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75  n rolled back, u
11670 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61  pdate the databa
11680 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68  se connection ch
11690 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20  ange-counter. . 
116a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
116b0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a  >changeCntOn ){.
116c0 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65        if( eState
116d0 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e  mentOp!=SAVEPOIN
116e0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
116f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11700 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
11710 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
11720 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11730 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
11740 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
11750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
11760 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
11770 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
11780 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
11790 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
117a0 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
117b0 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
117c0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
117d0 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
117e0 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
117f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11800 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
11810 68 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20  hema(db, -1);.  
11820 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20      db->flags = 
11830 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c  (db->flags | SQL
11840 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
11850 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
11860 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
11870 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
11880 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
11890 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
118a0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
118b0 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
118c0 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
118d0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
118e0 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
118f0 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56  .    db->activeV
11900 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66  dbeCnt--;.    if
11910 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
11920 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74  {.      db->writ
11930 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20  eVdbeCnt--;.    
11940 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  }.    assert( db
11950 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e  ->activeVdbeCnt>
11960 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e  =db->writeVdbeCn
11970 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  t );.  }.  p->ma
11980 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
11990 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
119a0 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
119b0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
119c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
119d0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
119e0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
119f0 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
11a00 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
11a10 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
11a20 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
11a30 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
11a40 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
11a50 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
11a60 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
11a70 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
11a80 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
11a90 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
11aa0 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
11ab0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
11ac0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
11ad0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
11ae0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
11af0 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
11b00 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
11b10 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20  activeVdbeCnt>0 
11b20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
11b30 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
11b40 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
11b50 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
11b60 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
11b70 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
11b80 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
11b90 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
11ba0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
11bb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
11bc0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
11bd0 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
11be0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
11bf0 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
11c00 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
11c10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11c20 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
11c30 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
11c40 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
11c50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
11c60 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11c70 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
11c80 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
11c90 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
11ca0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
11cb0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
11cc0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
11cd0 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
11ce0 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
11cf0 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
11d00 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
11d10 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
11d20 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
11d30 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
11d40 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
11d50 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
11d60 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
11d70 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
11d80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11d90 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
11da0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
11db0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
11dc0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11dd0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
11de0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
11df0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
11e00 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
11e10 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
11e20 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
11e30 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
11e40 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
11e50 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
11e60 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
11e70 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
11e80 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
11e90 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
11ea0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
11eb0 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  ();.    db->mall
11ec0 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f  ocFailed = mallo
11ed0 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d  cFailed;.    db-
11ee0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
11ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
11f00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
11f10 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
11f20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
11f30 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
11f40 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
11f50 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
11f60 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
11f70 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
11f80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
11f90 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
11fa0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
11fb0 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
11fc0 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
11fd0 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
11fe0 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
11ff0 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
12000 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
12010 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
12020 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
12030 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
12040 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
12050 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
12060 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
12070 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
12080 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
12090 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
120a0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
120b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
120c0 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
120d0 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
120e0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
120f0 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
12100 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
12110 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
12120 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
12130 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
12140 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
12150 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
12160 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
12170 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
12180 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
12190 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
121a0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
121b0 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
121c0 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
121d0 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
121e0 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
121f0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
12200 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
12210 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
12220 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
12230 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
12240 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
12250 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
12260 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
12270 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
12280 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
12290 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
122a0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
122b0 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
122c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
122d0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  c>=0 ){.    sqli
122e0 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
122f0 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
12300 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
12310 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
12320 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
12330 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
12340 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
12350 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
12360 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
12370 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
12380 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
12390 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
123a0 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
123b0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
123c0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
123d0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
123e0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
123f0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
12400 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
12410 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
12420 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
12430 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
12440 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
12450 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
12460 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
12470 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
12480 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
12490 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
124a0 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
124b0 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
124c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
124d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
124e0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
124f0 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
12500 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
12510 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
12520 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
12530 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
12540 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
12550 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
12560 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
12570 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
12580 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
12590 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
125a0 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
125b0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
125c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
125d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
125e0 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
125f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
12600 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
12610 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
12620 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
12630 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
12640 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
12650 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
12660 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
12670 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
12680 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12690 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
126a0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
126b0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
126c0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
126d0 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
126e0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
126f0 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
12700 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
12710 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
12720 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
12730 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
12740 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
12750 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
12760 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
12770 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
12780 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
12790 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
127a0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
127b0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
127c0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
127d0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
127e0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
127f0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
12800 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
12810 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
12820 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
12830 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
12840 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
12850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12860 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
12870 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
12880 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
12890 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
128a0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
128b0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
128c0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
128d0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
128e0 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
128f0 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
12900 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
12910 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12920 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
12930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12940 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65  *.** Call the de
12950 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63  structor for eac
12960 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20  h auxdata entry 
12970 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72  in pVdbeFunc for
12980 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f   which.** the co
12990 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
129a0 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72  in mask is clear
129b0 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69  .  Auxdata entri
129c0 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20  es beyond 31.** 
129d0 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72  are always destr
129e0 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f  oyed.  To destro
129f0 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e  y all auxdata en
12a00 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73  tries, call this
12a10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68  .** routine with
12a20 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69   mask==0..*/.voi
12a30 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12a40 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46  eteAuxData(VdbeF
12a50 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20  unc *pVdbeFunc, 
12a60 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74  int mask){.  int
12a70 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
12a80 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78  <pVdbeFunc->nAux
12a90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
12aa0 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78  ct AuxData *pAux
12ab0 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61   = &pVdbeFunc->a
12ac0 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pAux[i];.    if(
12ad0 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b   (i>31 || !(mask
12ae0 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29  &(((u32)1)<<i)))
12af0 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
12b00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
12b10 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
12b20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
12b30 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
12b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
12b50 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
12b60 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12b70 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
12b80 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12b90 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
12ba0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
12bb0 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20  rgument..** The 
12bc0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
12bd0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12be0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
12bf0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
12c00 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
12c10 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
12c20 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
12c30 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
12c40 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
12c50 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
12c60 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
12c70 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12c80 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  eObject(sqlite3 
12c90 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
12ca0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
12cb0 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  b, *pNext;.  int
12cc0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
12cd0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
12ce0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
12cf0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
12d00 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
12d10 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
12d20 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
12d30 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
12d40 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
12d50 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
12d60 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
12d70 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
12d80 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
12d90 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
12da0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
12db0 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
12dc0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
12dd0 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ub);.  }.  for(i
12de0 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
12df0 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
12e00 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
12e10 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72  ar[i]);.  vdbeFr
12e20 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
12e30 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
12e40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12e50 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
12e60 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12e70 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
12e80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12e90 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
12ea0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
12eb0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69  b, p->pFree);.#i
12ec0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
12ed0 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
12ee0 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 44  LAIN).  sqlite3D
12ef0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78  bFree(db, p->zEx
12f00 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65  plain);.  sqlite
12f10 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
12f20 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66  Explain);.#endif
12f30 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12f40 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
12f50 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
12f60 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
12f70 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12f80 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
12f90 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
12fa0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
12fb0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
12fc0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e  p->db;.  if( p->
12fd0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
12fe0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
12ff0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
13000 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
13010 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
13020 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
13030 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
13040 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
13050 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
13060 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
13070 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
13080 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
13090 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
130a0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
130b0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d  Object(db, p);.}
130c0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
130d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69  e the cursor p i
130e0 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20  s ready to read 
130f0 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77  or write the row
13100 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20   to which it.** 
13110 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f  was last positio
13120 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ned.  Return an 
13130 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
13140 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f   OOM fault or I/
13150 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65  O error.** preve
13160 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69  nts us from posi
13170 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73  tioning the curs
13180 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  or to its correc
13190 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t position..**.*
131a0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
131b0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
131c0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
131d0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
131e0 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
131f0 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20  ow.  If no move 
13200 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63  is pending, chec
13210 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
13220 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  row has been.** 
13230 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
13240 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
13250 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c  r and if it has,
13260 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73   mark the row as
13270 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a  .** a NULL row..
13280 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
13290 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
132a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63  ointing to the c
132b0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74  orrect row and t
132c0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e  hat row has.** n
132d0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ot been deleted 
132e0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
132f0 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  he cursor, then 
13300 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13310 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20  a no-op..*/.int 
13320 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
13330 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
13340 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
13350 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
13360 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
13370 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
13380 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
13390 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
133a0 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
133b0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
133c0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
133d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
133e0 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
133f0 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
13400 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
13410 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
13420 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13430 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
13440 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54  wid = p->movetoT
13450 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72  arget;.    if( r
13460 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53  es!=0 ) return S
13470 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
13480 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  PT;.    p->rowid
13490 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66  IsValid = 1;.#if
134a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
134b0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72      sqlite3_sear
134c0 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
134d0 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72  if.    p->deferr
134e0 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20  edMoveto = 0;.  
134f0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
13500 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
13510 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
13520 59 53 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  YS(p->pCursor) )
13530 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76  {.    int hasMov
13540 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
13550 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
13560 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
13570 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65  Cursor, &hasMove
13580 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
13590 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
135a0 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a  if( hasMoved ){.
135b0 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74        p->cacheSt
135c0 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
135d0 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c  LE;.      p->nul
135e0 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  lRow = 1;.    }.
135f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
13600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
13610 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
13620 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
13630 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13640 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
13650 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
13660 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
13670 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
13680 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13690 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
136a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
136b0 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
136c0 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
136d0 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
136e0 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
136f0 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
13700 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
13710 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
13720 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
13730 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
13740 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
13750 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
13760 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
13770 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
13780 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
13790 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
137a0 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
137b0 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
137c0 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
137d0 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
137e0 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
137f0 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
13800 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
13810 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
13820 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
13830 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
13840 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
13850 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
13860 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
13870 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
13880 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
13890 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
138a0 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
138b0 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
138c0 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
138d0 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
138e0 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
138f0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
13900 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
13910 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
13920 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
13930 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
13940 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
13950 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
13960 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
13970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
13980 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
13990 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
139a0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
139d0 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
13a00 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
13a10 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13a30 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
13a40 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
13a50 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
13a60 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
13a70 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13a80 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
13ab0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13ac0 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
13ae0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
13af0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
13b00 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
13b10 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
13b20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13b30 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
13b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b50 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
13b60 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
13b70 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
13b80 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13b90 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
13ba0 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
13bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bc0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
13bd0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
13be0 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
13bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
13c10 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
13c20 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
13c30 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
13c40 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
13c50 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
13c60 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
13c70 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
13c80 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
13c90 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
13ca0 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
13cb0 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
13cc0 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
13cd0 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
13ce0 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
13cf0 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
13d00 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
13d10 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
13d20 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
13d30 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
13d40 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
13d50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
13d60 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
13d70 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
13d80 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
13d90 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
13da0 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
13db0 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
13dc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
13dd0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
13de0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
13df0 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
13e00 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
13e10 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
13e20 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
13e30 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
13e40 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
13e50 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
13e60 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
13e70 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
13e80 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
13e90 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
13ea0 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b  return 8+(u32)i;
13eb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13ec0 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
13ed0 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29  i<(-MAX_6BYTE) )
13ee0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20   return 6;.     
13ef0 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73   /* Previous tes
13f00 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d  t prevents:  u =
13f10 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35   -(-922337203685
13f20 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20  4775808) */.    
13f30 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65    u = -i;.    }e
13f40 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69  lse{.      u = i
13f50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13f60 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
13f70 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
13f80 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
13f90 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
13fa0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
13fb0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
13fc0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
13fd0 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
13fe0 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
13ff0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
14000 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
14010 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
14020 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
14030 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
14040 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
14050 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
14060 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
14070 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
14080 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
14090 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
140a0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
140b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
140c0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
140d0 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
140e0 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
140f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
14100 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
14110 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
14120 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
14130 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
14140 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  ype..*/.u32 sqli
14150 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14160 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
14170 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
14180 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
14190 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
141a0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
141b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
141c0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
141d0 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
141e0 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
141f0 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
14200 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
14210 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
14220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
14230 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
14240 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
14250 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
14260 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
14270 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
14280 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
14290 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
142a0 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
142b0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
142c0 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
142d0 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
142e0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
142f0 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
14300 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
14310 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
14320 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
14330 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
14340 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
14350 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
14360 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
14370 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
14380 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
14390 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
143a0 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
143b0 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
143c0 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
143d0 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
143e0 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
143f0 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
14400 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
14410 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
14420 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
14430 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
14440 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
14450 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
14460 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
14470 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
14480 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
14490 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
144a0 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
144b0 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
144c0 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
144d0 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
144e0 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
144f0 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
14500 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
14510 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
14520 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
14530 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
14540 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
14550 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
14560 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
14570 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
14580 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
14590 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
145a0 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
145b0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
145c0 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
145d0 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
145e0 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
145f0 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
14600 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
14610 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
14620 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
14630 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
14640 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
14650 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
14660 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
14670 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
14680 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
14690 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
146a0 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
146b0 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
146c0 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
146d0 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
146e0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
146f0 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
14700 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
14710 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
14720 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
14730 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
14740 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
14750 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
14760 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
14770 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
14780 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
14790 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
147a0 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
147b0 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
147c0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
147d0 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
147e0 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
147f0 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
14800 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
14810 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
14820 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
14830 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
14840 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
14850 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
14860 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
14870 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
14880 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
14890 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
148a0 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
148b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
148c0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
148d0 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
148e0 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
148f0 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
14900 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
14910 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
14920 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
14930 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
14940 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
14950 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
14960 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
14970 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
14980 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
14990 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
149a0 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
149b0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
149c0 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
149d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
149e0 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
149f0 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
14a00 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
14a10 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
14a20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
14a30 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
14a40 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
14a50 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
14a60 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
14a70 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
14a80 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
14a90 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
14aa0 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
14ab0 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
14ac0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
14ad0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
14ae0 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
14af0 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
14b00 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
14b10 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
14b20 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
14b30 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
14b40 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
14b50 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
14b60 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
14b70 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
14b80 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
14b90 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
14ba0 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
14bb0 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
14bc0 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
14bd0 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
14be0 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
14bf0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
14c00 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
14c10 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
14c20 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
14c30 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
14c40 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
14c50 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
14c60 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
14c70 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
14c80 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
14c90 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
14ca0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
14cb0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
14cc0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
14cd0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
14ce0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
14cf0 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
14d00 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
14d10 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
14d20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
14d30 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
14d40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
14d50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
14d60 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
14d70 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
14d80 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
14d90 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
14da0 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
14db0 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
14dc0 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
14dd0 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
14de0 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
14df0 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
14e00 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
14e10 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
14e20 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
14e30 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
14e40 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
14e50 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
14e60 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
14e70 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
14e80 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
14e90 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
14ea0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
14eb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ec0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
14ed0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
14ee0 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
14ef0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
14f00 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
14f10 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33  assert( len<=(u3
14f20 32 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68  2)nBuf );.    wh
14f30 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
14f40 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28    buf[i] = (u8)(
14f50 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
14f60 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
14f70 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
14f80 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
14f90 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
14fa0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
14fb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14fc0 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
14fd0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
14fe0 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
14ff0 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
15000 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
15010 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
15020 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
15030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
15040 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  em->n<=nBuf );. 
15050 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
15060 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
15070 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
15080 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
15090 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
150a0 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  ){.      len += 
150b0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
150c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 42 75       assert( nBu
150d0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f>=0 );.      if
150e0 28 20 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75  ( len > (u32)nBu
150f0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  f ){.        len
15100 20 3d 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20   = (u32)nBuf;.  
15110 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
15120 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
15130 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
15140 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15150 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
15160 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
15170 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
15180 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
15190 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
151a0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
151b0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
151c0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
151d0 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
151e0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
151f0 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
15200 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15210 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
15220 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
15230 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
15240 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
15250 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
15260 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
15270 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
15280 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
15290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
152a0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
152b0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
152c0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
152e0 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
152f0 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
15300 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
15310 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
15320 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
15330 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
15340 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
15350 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
15360 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
15370 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
15380 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
15390 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
153a0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
153b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
153c0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
153d0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
153e0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
153f0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
15400 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
15410 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
15420 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15430 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15440 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
15450 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
15460 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15470 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15480 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
15490 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
154a0 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
154b0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
154c0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
154d0 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
154e0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
154f0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
15500 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
15510 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
15520 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
15530 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
15540 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
15550 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15560 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
15570 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
15580 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
15590 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
155a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
155b0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
155c0 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
155d0 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
155e0 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
155f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15600 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15610 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
15620 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
15630 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
15640 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
15650 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
15660 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
15670 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
15680 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
15690 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
156a0 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
156b0 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
156c0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
156d0 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
156e0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
156f0 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
15700 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15710 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15720 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
15730 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
15740 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15750 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
15760 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
15770 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
15780 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
15790 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
157a0 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
157b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
157c0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
157d0 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
157e0 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
157f0 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
15800 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
15810 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
15820 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
15830 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
15840 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
15850 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
15860 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
15870 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
15880 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
15890 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
158a0 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
158b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
158c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
158d0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
158e0 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
158f0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
15900 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
15910 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
15920 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
15930 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
15940 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
15950 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
15960 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
15970 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
15980 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
15990 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
159a0 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
159b0 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
159c0 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
159d0 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
159e0 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
159f0 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
15a00 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
15a10 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
15a20 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
15a30 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
15a40 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
15a50 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
15a60 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
15a70 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
15a80 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
15a90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15aa0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
15ab0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
15ac0 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
15ad0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
15ae0 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
15af0 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
15b00 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
15b10 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15b20 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
15b30 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
15b40 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
15b50 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
15b60 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
15b70 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
15b80 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
15b90 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
15ba0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
15bb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15bc0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
15bd0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
15be0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
15bf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15c00 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
15c10 20 7b 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e   {.      u32 len
15c20 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
15c30 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65  12)/2;.      pMe
15c40 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62  m->z = (char *)b
15c50 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  uf;.      pMem->
15c60 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70  n = len;.      p
15c70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20  Mem->xDel = 0;. 
15c80 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
15c90 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20  type&0x01 ){.   
15ca0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15cb0 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d   = MEM_Str | MEM
15cc0 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65  _Ephem;.      }e
15cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  lse{.        pMe
15ce0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42  m->flags = MEM_B
15cf0 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  lob | MEM_Ephem;
15d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
15d10 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d  eturn len;.    }
15d20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
15d40 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
15d50 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
15d60 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
15d70 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
15d80 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
15d90 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
15da0 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
15db0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
15dc0 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
15dd0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
15de0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
15df0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
15e00 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
15e10 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
15e20 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
15e30 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
15e40 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
15e50 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
15e60 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
15e70 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
15e80 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
15e90 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
15ea0 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
15eb0 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
15ec0 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
15ed0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
15ee0 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
15ef0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
15f00 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
15f10 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
15f20 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
15f30 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
15f40 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
15f50 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
15f60 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
15f70 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
15f80 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
15f90 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
15fa0 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
15fb0 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
15fc0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
15fd0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
15fe0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
15ff0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
16000 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
16010 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
16020 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
16030 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
16040 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16060 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
16070 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
16080 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
16090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
160a0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
160b0 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
160c0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
160d0 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
160e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
160f0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65  aller should fre
16100 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a  e this pointer *
16110 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
16120 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
16130 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
16140 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
16150 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66  urn */.  int nOf
16160 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
16170 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
16180 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20  ement pSpace by 
16190 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74  nOff to align it
161a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
161d0 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
161e0 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f  d for *p */..  /
161f0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
16200 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
16210 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
16220 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
16230 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
16240 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
16250 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
16260 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
16270 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
16280 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
16290 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
162a0 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
162b0 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
162c0 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
162d0 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
162e0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
162f0 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
16300 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  7;.  nByte = ROU
16310 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
16320 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
16330 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
16340 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
16350 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
16360 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20  ace+nOff ){.    
16370 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
16380 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
16390 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
163a0 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
163b0 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68     *ppFree = (ch
163c0 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20  ar *)p;.    if( 
163d0 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
163e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
163f0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
16400 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a  )&pSpace[nOff];.
16410 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b      *ppFree = 0;
16420 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20  .  }..  p->aMem 
16430 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
16440 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
16450 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
16460 29 29 5d 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  ))];.  p->pKeyIn
16470 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
16480 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
16490 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
164a0 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  1;.  return p;.}
164b0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
164c0 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
164d0 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
164e0 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75   in pKey[], popu
164f0 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70  late the .** Unp
16500 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
16510 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20  cture indicated 
16520 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  by the fourth ar
16530 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a  gument with the.
16540 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
16550 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72  he decoded recor
16560 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  d..*/ .void sqli
16570 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
16580 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ack(.  KeyInfo *
16590 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
165a0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
165b0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
165c0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
165d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
165e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
165f0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
16600 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
16610 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
16620 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
16630 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
16640 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f  rd *p      /* Po
16650 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75  pulate this stru
16660 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74  cture before ret
16670 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20  urning. */.){.  
16680 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16690 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e  har *aKey = (con
166a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
166b0 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64   *)pKey;.  int d
166c0 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20  ; .  u32 idx;   
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
166f0 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64  n aKey[] to read
16700 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75   from */.  u16 u
16710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
16730 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
16740 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ter */.  u32 szH
16750 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  dr;.  Mem *pMem 
16760 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d  = p->aMem;..  p-
16770 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73  >flags = 0;.  as
16780 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
16790 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
167a0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
167b0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
167c0 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
167d0 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
167e0 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
167f0 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
16800 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
16810 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
16820 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
16830 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
16840 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
16850 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
16860 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
16870 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
16880 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
16890 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
168a0 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
168b0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
168c0 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
168d0 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
168e0 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
168f0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
16900 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
16910 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
16920 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
16930 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
16940 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
16950 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
16960 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
16970 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a  Field = u;.}../*
16980 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16990 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
169a0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
169b0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
169c0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
169d0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
169e0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
169f0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
16a00 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
16a10 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
16a20 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
16a30 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
16a40 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
16a50 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
16a60 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
16a70 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
16a80 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
16a90 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
16aa0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
16ab0 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
16ac0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
16ad0 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
16ae0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16af0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
16b00 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
16b10 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
16b20 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
16b30 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
16b40 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
16b50 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
16b60 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
16b70 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
16b80 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
16b90 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
16ba0 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
16bb0 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
16bc0 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
16bd0 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
16be0 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
16bf0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
16c00 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
16c10 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
16c20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16c30 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
16c40 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
16c50 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
16c60 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
16c70 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
16c80 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
16c90 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
16ca0 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
16cb0 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
16cc0 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
16cd0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
16ce0 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
16cf0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
16d00 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
16d10 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
16d20 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
16d30 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
16d40 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   key */.){.  int
16d50 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
16d60 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
16d70 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
16d80 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
16d90 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
16da0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
16db0 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
16dc0 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
16dd0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
16de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16df0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
16e00 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
16e10 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
16e20 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
16e30 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
16e40 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
16e50 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
16e60 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
16e70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16e80 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
16e90 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
16ea0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
16eb0 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
16ec0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
16ed0 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
16ee0 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
16ef0 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
16f00 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
16f10 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
16f20 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
16f30 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
16f40 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
16f50 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
16f60 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16f70 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
16f80 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
16f90 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
16fa0 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
16fb0 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
16fc0 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
16fd0 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
16fe0 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
16ff0 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
17000 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
17010 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
17020 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
17030 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
17040 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
17050 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
17060 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
17070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
17080 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
17090 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
170a0 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
170b0 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
170c0 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
170d0 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
170e0 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
170f0 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
17100 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
17110 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
17120 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
17130 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
17140 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
17150 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
17160 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
17170 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
17180 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
17190 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
171a0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
171b0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
171c0 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e   nField = pKeyIn
171d0 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68  fo->nField;.  wh
171e0 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
171f0 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
17200 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20  ield ){.    u32 
17210 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
17220 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
17230 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
17240 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
17250 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
17260 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
17270 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
17280 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
17290 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31  e1 );.    if( d1
172a0 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74  >=nKey1 && sqlit
172b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
172c0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
172d0 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  )>0 ) break;..  
172e0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
172f0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
17300 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
17310 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
17320 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
17330 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
17340 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
17350 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
17360 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
17370 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17380 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
17390 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
173a0 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173c0 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
173d0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
173e0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
173f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
17400 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d  t( mem1.zMalloc=
17410 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f  =0 );  /* See co
17420 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a  mment below */..
17430 20 20 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20        /* Invert 
17440 74 68 65 20 72 65 73 75 6c 74 20 69 66 20 77 65  the result if we
17450 20 61 72 65 20 75 73 69 6e 67 20 44 45 53 43 20   are using DESC 
17460 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20  sort order. */. 
17470 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
17480 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
17490 20 69 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65   i<nField && pKe
174a0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
174b0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
174c0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20  rc = -rc;.      
174d0 7d 0a 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20  }.    .      /* 
174e0 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  If the PREFIX_SE
174f0 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65 74  ARCH flag is set
17500 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20   and all fields 
17510 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c  except the final
17520 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  .      ** rowid 
17530 66 69 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c  field were equal
17540 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65  , then clear the
17550 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20 66   PREFIX_SEARCH f
17560 6c 61 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20  lag and set .   
17570 20 20 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f     ** pPKey2->ro
17580 77 69 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65  wid to the value
17590 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 66 69   of the rowid fi
175a0 65 6c 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e  eld in (pKey1, n
175b0 4b 65 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20  Key1)..      ** 
175c0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
175d0 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20  the OP_IsUnique 
175e0 6f 70 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f  opcode..      */
175f0 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 4b 65  .      if( (pPKe
17600 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41  y2->flags & UNPA
17610 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52  CKED_PREFIX_SEAR
17620 43 48 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79  CH) && i==(pPKey
17630 32 2d 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a  2->nField-1) ){.
17640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17650 69 64 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20  idx1==szHdr1 && 
17660 72 63 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rc );.        as
17670 73 65 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73  sert( mem1.flags
17680 20 26 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20   & MEM_Int );.  
17690 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c        pPKey2->fl
176a0 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44  ags &= ~UNPACKED
176b0 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a  _PREFIX_SEARCH;.
176c0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
176d0 72 6f 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69  rowid = mem1.u.i
176e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20  ;.      }.    . 
176f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17700 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
17710 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f   }..  /* No memo
17720 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
17730 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
17740 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
17750 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
17760 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
17770 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
17780 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
17790 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
177a0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
177b0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
177c0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
177d0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
177e0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
177f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
17800 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
17810 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
17820 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
17830 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
17840 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
17850 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
17860 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
17870 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
17880 5f 49 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c  _INCRKEY.  ** fl
17890 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
178a0 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
178b0 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
178c0 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49  s larger..  ** I
178d0 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52  f the UPACKED_PR
178e0 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20  EFIX_MATCH flag 
178f0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79  is set, then key
17900 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72  s with common pr
17910 65 66 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20  efixes.  ** are 
17920 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65  considered to be
17930 20 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69   equal.  Otherwi
17940 73 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b  se, the longer k
17950 65 79 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20  ey is the .  ** 
17960 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
17970 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
17980 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
17990 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a  e the longer.  *
179a0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  * if there is a 
179b0 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
179c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
179d0 20 29 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32   );.  if( pPKey2
179e0 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
179f0 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20  ED_INCRKEY ){.  
17a00 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c    rc = -1;.  }el
17a10 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  se if( pPKey2->f
17a20 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
17a30 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a  PREFIX_MATCH ){.
17a40 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
17a50 3d 30 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  =0 */.  }else if
17a60 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b  ( idx1<szHdr1 ){
17a70 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d  .    rc = 1;.  }
17a80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a90 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
17aa0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
17ab0 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
17ac0 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
17ad0 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
17ae0 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
17af0 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
17b00 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
17b10 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
17b20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
17b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
17b40 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
17b50 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
17b60 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
17b70 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
17b80 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
17b90 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
17ba0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
17bb0 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
17bc0 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
17bd0 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
17be0 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
17bf0 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
17c00 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
17c10 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
17c20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43  sqlite3 *db, BtC
17c30 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
17c40 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
17c50 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
17c60 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
17c70 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
17c80 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
17c90 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
17ca0 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
17cb0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
17cc0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
17cd0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
17ce0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
17cf0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
17d00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
17d10 54 45 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  TER(db);..  /* G
17d20 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
17d30 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
17d40 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
17d50 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
17d60 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
17d70 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
17d80 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
17d90 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
17da0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
17db0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
17dc0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
17dd0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
17de0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
17df0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
17e00 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
17e10 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
17e20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
17e30 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
17e40 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
17e50 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
17e60 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
17e70 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
17e80 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
17e90 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
17ea0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
17eb0 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
17ec0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
17ed0 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
17ee0 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
17ef0 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
17f00 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
17f10 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
17f20 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
17f30 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
17f40 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
17f50 6e 74 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  ntry */.  memset
17f60 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  (&m, 0, sizeof(m
17f70 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
17f80 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
17f90 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ee(pCur, 0, (int
17fa0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
17fb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
17fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17fd0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
17fe0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
17ff0 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
18000 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
18010 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
18020 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
18030 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
18040 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
18050 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
18060 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
18070 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
18080 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
18090 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
180a0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
180b0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
180c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
180d0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
180e0 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
180f0 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
18100 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
18110 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
18120 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
18130 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
18140 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
18150 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
18160 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
18170 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
18180 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
18190 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
181a0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
181b0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
181c0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
181d0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
181e0 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
181f0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
18200 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
18210 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
18220 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
18230 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
18240 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
18250 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
18260 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
18270 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
18280 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
18290 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
182a0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
182b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
182c0 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
182d0 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
182e0 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
182f0 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
18300 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
18310 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
18320 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
18330 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
18340 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
18350 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
18360 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
18370 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
18380 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
18390 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
183a0 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
183b0 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
183c0 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
183d0 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
183e0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
183f0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
18400 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
18410 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
18420 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
18430 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
18440 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
18450 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
18460 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
18470 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
18480 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
18490 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
184a0 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
184b0 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  m.zMalloc!=0 );.
184c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
184d0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
184e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
184f0 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
18500 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
18510 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
18520 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
18530 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
18540 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
18550 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
18560 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
18570 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
18580 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
18590 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
185a0 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
185b0 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
185c0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
185d0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
185e0 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
185f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
18600 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
18610 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
18620 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
18630 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
18640 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
18650 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
18660 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
18670 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
18680 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18690 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
186a0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
186b0 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
186c0 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
186d0 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
186e0 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
186f0 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
18700 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
18710 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
18720 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
18730 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
18740 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
18750 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
18760 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
18770 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
18780 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
18790 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
187a0 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
187b0 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74  version of key t
187c0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
187d0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  t */.  int *res 
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
18800 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
18810 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
18820 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
18830 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
18840 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
18850 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
18860 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
18870 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
18880 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
18890 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
188a0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
188b0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
188c0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
188d0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
188e0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
188f0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
18900 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
18910 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
18920 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
18930 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
18940 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
18950 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73 61  ecause of the sa
18960 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
18970 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
18980 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
18990 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
189a0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
189b0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
189c0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
189d0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
189e0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
189f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18a00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  BKPT;.  }.  mems
18a10 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&m, 0, sizeof
18a20 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (m));.  rc = sql
18a30 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
18a40 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
18a50 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b  , 0, (int)nCellK
18a60 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
18a70 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
18a80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
18a90 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e  ert( pUnpacked->
18aa0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
18ab0 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 3b  _PREFIX_MATCH );
18ac0 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65  .  *res = sqlite
18ad0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
18ae0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e  re(m.n, m.z, pUn
18af0 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74  packed);.  sqlit
18b00 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
18b10 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
18b20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18b30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18b40 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74  sets the value t
18b50 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
18b60 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
18b70 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  s to.** sqlite3_
18b80 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65  changes() on the
18b90 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18ba0 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20   'db'. .*/.void 
18bb0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
18bc0 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
18bd0 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b  b, int nChange){
18be0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18bf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
18c00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62  ->mutex) );.  db
18c10 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61  ->nChange = nCha
18c20 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
18c30 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e  lChange += nChan
18c40 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ge;.}../*.** Set
18c50 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76   a flag in the v
18c60 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  dbe to update th
18c70 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
18c80 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61   when it is fina
18c90 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65  lised.** or rese
18ca0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
18cb0 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67  e3VdbeCountChang
18cc0 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76  es(Vdbe *v){.  v
18cd0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20  ->changeCntOn = 
18ce0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
18cf0 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20   every prepared 
18d00 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69  statement associ
18d10 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
18d20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18d30 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a  ** as expired..*
18d40 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20  *.** An expired 
18d50 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20  statement means 
18d60 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69  that recompilati
18d70 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  on of the statem
18d80 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d  ent is.** recomm
18d90 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73  end.  Statements
18da0 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69   expire when thi
18db0 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20  ngs happen that 
18dc0 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72  make their.** pr
18dd0 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e  ograms obsolete.
18de0 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d    Removing user-
18df0 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
18e00 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  s or collating.*
18e10 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20  * sequences, or 
18e20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68  changing an auth
18e30 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69  orization functi
18e40 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73  on are the types
18e50 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68   of.** things th
18e60 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64  at make prepared
18e70 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f   statements obso
18e80 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lete..*/.void sq
18e90 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
18ea0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71  redStatements(sq
18eb0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
18ec0 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d  be *p;.  for(p =
18ed0 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70   db->pVdbe; p; p
18ee0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
18ef0 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
18f00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
18f10 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  urn the database
18f20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
18f30 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71   the Vdbe..*/.sq
18f40 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64  lite3 *sqlite3Vd
18f50 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20  beDb(Vdbe *v){. 
18f60 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d   return v->db;.}
18f70 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18f80 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
18f90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72  qlite3_value str
18fa0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
18fb0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e  g the value boun
18fc0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
18fd0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63  Var of VM v. Exc
18fe0 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75  ept, if the valu
18ff0 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c  e is an SQL NULL
19000 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69  , return .** 0 i
19010 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69  nstead. Unless i
19020 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79  t is NULL, apply
19030 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f   affinity aff (o
19040 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  ne of the SQLITE
19050 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61  _AFF_*.** consta
19060 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75  nts) to the valu
19070 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
19080 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ng it..**.** The
19090 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
190a0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
190b0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e   the caller usin
190c0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  g sqlite3ValueFr
190d0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ee()..*/.sqlite3
190e0 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56  _value *sqlite3V
190f0 64 62 65 47 65 74 56 61 6c 75 65 28 56 64 62 65  dbeGetValue(Vdbe
19100 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
19110 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
19120 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
19130 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
19140 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
19150 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28  iVar-1];.    if(
19160 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
19170 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
19180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
19190 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
191a0 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
191b0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
191c0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
191d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
191e0 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
191f0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
19200 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
19210 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
19220 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
19230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
19240 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 65 28  dbeMemStoreType(
19250 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a 20 20  (Mem *)pRet);.  
19260 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
19270 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20  rn pRet;.    }. 
19280 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19290 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
192a0 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69  e SQL variable i
192b0 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64  Var so that bind
192c0 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20  ing a new value 
192d0 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a  to it signals.**
192e0 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70   to sqlite3_reop
192f0 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65  timize() that re
19300 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73  -preparing the s
19310 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73  tatement may res
19320 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74  ult.** in a bett
19330 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a  er query plan..*
19340 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
19350 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62  beSetVarmask(Vdb
19360 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b  e *v, int iVar){
19370 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
19380 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e  0 );.  if( iVar>
19390 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70  32 ){.    v->exp
193a0 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66  mask = 0xfffffff
193b0 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
193c0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28  v->expmask |= ((
193d0 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31  u32)1 << (iVar-1
193e0 29 29 3b 0a 20 20 7d 0a 7d 0a                    ));.  }.}.