/ Hex Artifact Content
Login

Artifact 874e16966eb6e58183ee2746abb4e4c5238f2350:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20  = P4_NOTUSED;.  
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  BUG.  pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ent = 0;.  if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54  qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64  race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e  &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f  dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63  PROFILE.  pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70  ycles = 0;.  pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  f.  return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69  ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e  nt op){.  return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(p, op, 0, 0, 
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65  3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p1){.  return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30  (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20  VdbeAddOp2(Vdbe 
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72  p1, int p2){.  r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f  1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20  VdbeAddOp4Int(. 
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20  .  int p4       
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34         /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69   operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  nteger */.){.  i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53  ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a  .  return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c  a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74  abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f   yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c  ded.  The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c  ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69  ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a  ve number.  The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20  ** label can be 
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76  used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61  alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68  tion.  Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  en.** the label 
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61  is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73   specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c  s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68   scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c   its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61  ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20  ll values of P2 
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74  which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68  he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65  e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44  ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20  BE knows that a 
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65  bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73  ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32   negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70   values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65  ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65  gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20  , a negative P2 
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a   be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74  () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a  Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70    int i;.  i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e  );.  if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  LabelAlloc ){.  
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61    int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a  belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e  el[0]));.    p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71  nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  abel[0]);.  }.  
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b  if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69  .    p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65  ] = -1;.  }.  re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a  turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20  be *p, int x){. 
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20   int j = -1-x;. 
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61  j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bel );.  if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e  >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nOp;.  }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20  * Mark the VDBE 
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20  as one that can 
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20  only be run one 
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79  lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  Once(Vdbe *p){. 
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74  .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20   Parse.mayAbort 
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a  is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68   ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f  rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e  therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61  .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54  lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f  sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74  f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d  ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74  piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72  o:.**.**   asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61  sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72  rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b  se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72  dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d  t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20  ayAbort){.  int 
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20  hasAbort = 0;.  
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65  .     || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e  pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70  dif.     || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c  code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26  IfNull) .      &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ort );.}.#endif 
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f  adOnly = 1;.  fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70  ->opcode;..    p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71  Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20  rty[opcode];.   
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f  Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29  de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
2d70: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61   (opcode==OP_Tra
2d80: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d  nsaction && pOp-
2d90: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64  >p2!=0) || opcod
2da0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a  e==OP_Vacuum ){.
2db0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c        p->readOnl
2dc0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  y = 0;.#ifndef S
2dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2de0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
2df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
2e00: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
2e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
2e20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2e30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20  s = pOp->p2;.   
2e40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
2e50: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b  e==OP_VFilter ){
2e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2e80: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20  Op - i >= 3 );. 
2e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
2ea0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
2eb0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
2ec0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61  .      if( n>nMa
2ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2ef0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = n;.#endif.   
2f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70   }..    if( (pOp
2f10: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c  ->opflags & OPFL
2f20: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f  G_JUMP)!=0 && pO
2f30: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20  p->p2<0 ){.     
2f40: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d   assert( -1-pOp-
2f50: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  >p2<p->nLabel );
2f60: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
2f70: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
2f80: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
2f90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
2fa0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29  ->db, p->aLabel)
2fb0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20  ;.  p->aLabel = 
2fc0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41  0;..  *pMaxFuncA
2fd0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2ff0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
3000: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
3010: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
3020: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3030: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
3040: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
3050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
3060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
3070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
3080: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  Op;.}../*.** Thi
3090: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
30a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
30b0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63  the array of opc
30c0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  odes associated 
30d0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65  with.** the Vdbe
30e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
30f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49  irst argument. I
3100: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73  t is the callers
3110: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
3120: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f  ** to arrange fo
3130: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61  r the returned a
3140: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74  rray to be event
3150: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e  ually freed usin
3160: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72  g the .** vdbeFr
3170: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63  eeOpArray() func
3180: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f  tion..**.** Befo
3190: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
31a0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68  nOp is set to th
31b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
31c0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72  ies in the retur
31d0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c  ned.** array. Al
31e0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73  so, *pnMaxArg is
31f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67   set to the larg
3200: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e  er of its curren
3210: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20  t value and .** 
3220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
3230: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62  tries in the Vdb
3240: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20  e.apArg[] array 
3250: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63  required to exec
3260: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  ute the .** retu
3270: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  rned program..*/
3280: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
3290: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28  VdbeTakeOpArray(
32a0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  Vdbe *p, int *pn
32b0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72  Op, int *pnMaxAr
32c0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f  g){.  VdbeOp *aO
32d0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73  p = p->aOp;.  as
32e0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d  sert( aOp && !p-
32f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3300: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  d );..  /* Check
3310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62   that sqlite3Vdb
3320: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73  eUsesBtree() was
3330: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74   not called on t
3340: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65  his VM */.  asse
3350: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d  rt( p->aMutex.nM
3360: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  utex==0 );..  re
3370: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3380: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3390: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
33a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
33b0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
33c0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
33d0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
33e0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
33f0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3400: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
3410: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
3420: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
3430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3440: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
3450: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
3460: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3470: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3490: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
34a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
34b0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
34c0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
34d0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
34e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
34f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3500: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
3510: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
3520: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
3530: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
3540: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
3550: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
3560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3570: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3580: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
35a0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
35b0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
35c0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
35d0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
35e0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
35f0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3600: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
3610: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
3620: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
3630: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
3640: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
3650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3660: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3680: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3690: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
36a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
36b0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
36c0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
36d0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
36e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
36f0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3700: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
3710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
3720: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
3730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3740: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
3750: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
3760: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3780: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
37a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
37b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
37c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
37d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
37e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
37f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3800: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3810: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3820: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3830: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3850: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3860: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3870: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3880: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
38a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
38b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
38c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
38d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
38e0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b  sert( addr>=0 );
38f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64  .  if( p->nOp>ad
3900: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  dr ){.    p->aOp
3910: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b  [addr].p1 = val;
3920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3930: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3940: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  f the P2 operand
3950: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3960: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3980: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69  useful for setti
3990: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e  ng a jump destin
39a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
39b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
39c0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P2(Vdbe *p, int 
39d0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
39e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
3a00: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  >=0 );.  if( p->
3a10: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  nOp>addr ){.    
3a20: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20  p->aOp[addr].p2 
3a30: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
3a40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
3a50: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f  alue of the P3 o
3a60: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
3a70: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
3a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3a90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
3aa0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3ab0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
3ac0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
3ad0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20  assert( addr>=0 
3ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e  );.  if( p->nOp>
3af0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
3b10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3b20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3b30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
3b40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
3b50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
3b60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
3b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3b80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
3b90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
3ba0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
3bb0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
3bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
3bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
3be0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
3bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
3c00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
3c10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
3c20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
3c30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
3c40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
3c50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
3c60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
3c70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
3c90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3ca0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
3cb0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3cc0: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3cd0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3ce0: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3cf0: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3d00: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3d10: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3d20: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3d30: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3d40: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3d50: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
3d60: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
3d70: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
3d80: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
3d90: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
3da0: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
3db0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
3dc0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3dd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
3de0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
3df0: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
3e00: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
3e10: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
3e20: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
3e30: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
3e40: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
3e50: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
3e60: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
3e70: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
3e80: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
3e90: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
3ea0: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
3eb0: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
3ec0: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
3ed0: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
3ee0: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
3ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
3f00: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
3f10: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
3f20: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
3f30: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
3f40: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3f50: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
3f60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3f80: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
3f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
3fa0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
3fb0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3fc0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3fd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3fe0: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
3ff0: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
4000: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
4010: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
4020: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
4030: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
4040: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
4050: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4060: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4070: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4080: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
4090: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
40a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
40b0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
40c0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
40d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
40e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
40f0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
4100: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4110: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
4120: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
4130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4140: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
4150: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4160: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4170: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
4180: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4190: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
41a0: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
41b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
41c0: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
41d0: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
41e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
41f0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
4200: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4210: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
4220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4240: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
4250: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4260: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4270: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
4280: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
4290: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
42a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
42b0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
42c0: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
42d0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
42e0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
42f0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
4300: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
4310: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
4320: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
4330: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
4340: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
4350: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4360: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
4370: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4380: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
4390: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
43a0: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
43b0: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
43c0: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
43d0: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
43e0: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
43f0: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
4400: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
4410: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4420: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
4430: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
4440: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
4450: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4460: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4470: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4480: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
4490: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
44a0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
44b0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
44c0: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
44d0: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
44e0: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
44f0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
4500: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
4510: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
4520: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
4530: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
4540: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
4550: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4560: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
4570: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
4580: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
4590: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
45a0: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
45b0: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
45c0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
45d0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
45e0: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
45f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4600: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
4610: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
4620: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 2d  int N){.  if( p-
4630: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
4640: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
4650: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c  p[addr];.    sql
4660: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
4670: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ;.    while( N--
4680: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34   ){.      freeP4
4690: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
46a0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
46b0: 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20      memset(pOp, 
46c0: 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d  0, sizeof(pOp[0]
46d0: 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f  ));.      pOp->o
46e0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
46f0: 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20  .      pOp++;.  
4700: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4710: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
4720: 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72  e of the P4 oper
4730: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
4740: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
4750: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4760: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
4770: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
4780: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
4790: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
47a0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
47b0: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
47c0: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
47d0: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
47e0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
47f0: 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  gram..**.** If n
4800: 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20  >=0 then the P4 
4810: 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d  operand is dynam
4820: 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ic, meaning that
4830: 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68   a copy of.** th
4840: 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65  e string is made
4850: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4860: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4870: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
4880: 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20  A value of n==0 
4890: 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73  means copy bytes
48a0: 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e   of zP4 up to an
48b0: 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a  d including the.
48c0: 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79  ** first null by
48d0: 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e  te.  If n>0 then
48e0: 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20   copy n+1 bytes 
48f0: 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66  of zP4..**.** If
4900: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69   n==P4_KEYINFO i
4910: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34  t means that zP4
4920: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4930: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4940: 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20  ture..** A copy 
4950: 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b  is made of the K
4960: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
4970: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4980: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
4990: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f  lite3_malloc, to
49a0: 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 74   be freed when t
49b0: 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c  he Vdbe is final
49c0: 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b  ized..** n==P4_K
49d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69  EYINFO_HANDOFF i
49e0: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a 50  ndicates that zP
49f0: 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65  4 points to a Ke
4a00: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a  yInfo structure.
4a10: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  ** stored in mem
4a20: 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 6c  ory that the cal
4a30: 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64  ler has obtained
4a40: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
4a50: 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61  lloc. The .** ca
4a60: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20  ller should not 
4a70: 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74  free the allocat
4a80: 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ion, it will be 
4a90: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
4aa0: 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69  dbe is.** finali
4ab0: 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65  zed..** .** Othe
4ac0: 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50  r values of n (P
4ad0: 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c  4_STATIC, P4_COL
4ae0: 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63  LSEQ etc.) indic
4af0: 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69  ate that zP4 poi
4b00: 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69  nts.** to a stri
4b10: 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 20  ng or structure 
4b20: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
4b30: 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20  ed to exist for 
4b40: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a  the lifetime of.
4b50: 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20  ** the Vdbe. In 
4b60: 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 63  these cases we c
4b70: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
4b80: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
4b90: 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63  If addr<0 then c
4ba0: 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20  hange P4 on the 
4bb0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e  most recently in
4bc0: 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 69  serted instructi
4bd0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
4be0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
4bf0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4c00: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
4c10: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
4c20: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
4c30: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
4c40: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
4c50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4c60: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4c70: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4c80: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
4c90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4ca0: 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 3d   ){.    if ( n!=
4cb0: 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e 21  P4_KEYINFO && n!
4cc0: 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 20  =P4_VTAB ) {.   
4cd0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c     freeP4(db, n,
4ce0: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
4cf0: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
4d00: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
4d10: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
4d20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64   );.  assert( ad
4d30: 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69  dr<p->nOp );.  i
4d40: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
4d50: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
4d60: 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20   1;.  }.  pOp = 
4d70: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
4d80: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
4d90: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
4da0: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
4db0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
4dc0: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
4dd0: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
4de0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
4df0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
4e00: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
4e10: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
4e20: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
4e30: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
4e40: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
4e50: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
4e60: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
4e70: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
4e80: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
4e90: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
4ea0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
4eb0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4ec0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
4ed0: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
4ee0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79  YINFO ){.    Key
4ef0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
4f00: 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20      int nField, 
4f10: 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65  nByte;..    nFie
4f20: 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29  ld = ((KeyInfo*)
4f30: 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  zP4)->nField;.  
4f40: 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66    nByte = sizeof
4f50: 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  (*pKeyInfo) + (n
4f60: 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28  Field-1)*sizeof(
4f70: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
4f80: 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20  0]) + nField;.  
4f90: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c    pKeyInfo = sql
4fa0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
4fb0: 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  0, nByte);.    p
4fc0: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20  Op->p4.pKeyInfo 
4fd0: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  = pKeyInfo;.    
4fe0: 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
4ff0: 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 4f        u8 *aSortO
5000: 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63  rder;.      memc
5010: 70 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49 6e  py((char*)pKeyIn
5020: 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20 2d  fo, zP4, nByte -
5030: 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20   nField);.      
5040: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
5050: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
5060: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
5070: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
5080: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
5090: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
50a0: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
50b0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
50c0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
50d0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
50e0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
50f0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
5100: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d      }.      pOp-
5110: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
5120: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  INFO;.    }else{
5130: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
5140: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5150: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
5160: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5170: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
5180: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  ( n==P4_KEYINFO_
5190: 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 70  HANDOFF ){.    p
51a0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
51b0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
51c0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49  p4type = P4_KEYI
51d0: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
51e0: 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20   n==P4_VTAB ){. 
51f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5200: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5210: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5220: 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65  VTAB;.    sqlite
5230: 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c  3VtabLock((VTabl
5240: 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73  e *)zP4);.    as
5250: 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a  sert( ((VTable *
5260: 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62  )zP4)->db==p->db
5270: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
5280: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  n<0 ){.    pOp->
5290: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
52a0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
52b0: 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61  pe = (signed cha
52c0: 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r)n;.  }else{.  
52d0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
52e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
52f0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
5300: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
5310: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
5320: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
5330: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
5340: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  AMIC;.  }.}..#if
5350: 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a  ndef NDEBUG./*.*
5360: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d  * Change the com
5370: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20  ment on the the 
5380: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f  most recently co
5390: 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ded instruction.
53a0: 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61    Or.** insert a
53b0: 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74   No-op and add t
53c0: 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68  he comment to th
53d0: 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69  at new instructi
53e0: 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b  on.  This.** mak
53f0: 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69  es the code easi
5400: 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e  er to read durin
5410: 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f  g debugging.  No
5420: 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65  ne of this happe
5430: 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75  ns.** in a produ
5440: 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ction build..*/.
5450: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5460: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5480: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
5490: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
54a0: 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  !p ) return;.  a
54b0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
54c0: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
54d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
54e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
54f0: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5500: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5510: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5520: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
5530: 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70    char **pz = &p
5540: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
5550: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61  zComment;.    va
5560: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
5570: 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  at);.    sqlite3
5580: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70  DbFree(p->db, *p
5590: 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71  z);.    *pz = sq
55a0: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d  lite3VMPrintf(p-
55b0: 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  >db, zFormat, ap
55c0: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
55d0: 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71  );.  }.}.void sq
55e0: 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d  lite3VdbeNoopCom
55f0: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f  ment(Vdbe *p, co
5600: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
5610: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
5620: 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 20  st ap;.  if( !p 
5630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
5640: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
5650: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73   OP_Noop);.  ass
5660: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
5670: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
5680: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
5690: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
56a0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
56b0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
56c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
56d0: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
56e0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
56f0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5700: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73  omment;.    va_s
5710: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5720: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
5730: 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29  Free(p->db, *pz)
5740: 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69  ;.    *pz = sqli
5750: 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64  te3VMPrintf(p->d
5760: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
5770: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
5780: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
5790: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
57a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70  ** Return the op
57b0: 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e  code for a given
57c0: 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 68   address.  If th
57d0: 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 2c  e address is -1,
57e0: 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20   then.** return 
57f0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5800: 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f 64  y inserted opcod
5810: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  e..**.** If a me
5820: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
5830: 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
5840: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
5850: 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a  calling of this.
5860: 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e  ** routine, then
5870: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
5880: 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 6c  dummy VdbeOp wil
5890: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20  l be returned.  
58a0: 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69  That opcode.** i
58b0: 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 6e  s readable but n
58c0: 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 6f  ot writable, tho
58d0: 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 74  ugh it is cast t
58e0: 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 6c  o a writable val
58f0: 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ue..** The retur
5900: 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 63  n of a dummy opc
5910: 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  ode allows the c
5920: 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  all to continue 
5930: 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61  functioning.** a
5940: 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74  fter a OOM fault
5950: 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
5960: 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  to check to see 
5970: 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 72  if the return fr
5980: 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  om .** this rout
5990: 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 70  ine is a valid p
59a0: 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63  ointer.  But bec
59b0: 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f  ause the dummy.o
59c0: 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64  pcode is 0,.** d
59d0: 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  ummy will never 
59e0: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20  be written to.  
59f0: 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 64  This is verified
5a00: 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74   by code inspect
5a10: 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75  ion and.** by ru
5a20: 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72  nning with Valgr
5a30: 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 74  ind..**.** About
5a40: 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c 49   the #ifdef SQLI
5a50: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 20  TE_OMIT_TRACE:  
5a60: 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 72  Normally, this r
5a70: 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
5a80: 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 73  called.** unless
5a90: 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 73   p->nOp>0.  This
5aa0: 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 74   is because in t
5ab0: 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 51  he absense of SQ
5ac0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 2c  LITE_OMIT_TRACE,
5ad0: 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 20  .** an OP_Trace 
5ae0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  instruction is a
5af0: 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 62  lways inserted b
5b00: 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  y sqlite3VdbeGet
5b10: 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a 2a  () as soon as.**
5b20: 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 63   a new VDBE is c
5b30: 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 61  reated.  So we a
5b40: 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 61  re free to set a
5b50: 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 20  ddr to p->nOp-1 
5b60: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
5b70: 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 63  g to double-chec
5b80: 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  k to make sure t
5b90: 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 69  hat the result i
5ba0: 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 20  s non-negative. 
5bb0: 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45  But.** if SQLITE
5bc0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 64  _OMIT_TRACE is d
5bd0: 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f 54  efined, the OP_T
5be0: 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 20  race is omitted 
5bf0: 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 74  and we do need t
5c00: 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 76  o.** check the v
5c10: 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d 31  alue of p->nOp-1
5c20: 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
5c30: 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ng..*/.VdbeOp *s
5c40: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5c50: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5c60: 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65  r){.  /* C89 spe
5c70: 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20  cifies that the 
5c80: 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22  constant "dummy"
5c90: 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   will be initial
5ca0: 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a  ized to all.  **
5cb0: 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73   zeros, which is
5cc0: 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20   correct.  MSVC 
5cd0: 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e  generates a warn
5ce0: 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73  ing, nevertheles
5cf0: 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63  s. */.  static c
5d00: 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d 6d  onst VdbeOp dumm
5d10: 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  y;  /* Ignore th
5d20: 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61  e MSVC warning a
5d30: 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69  bout no initiali
5d40: 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  zer */.  assert(
5d50: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5d60: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5d70: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 69  if( addr<0 ){.#i
5d80: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
5d90: 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 70  _TRACE.    if( p
5da0: 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 72  ->nOp==0 ) retur
5db0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
5dc0: 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64  y;.#endif.    ad
5dd0: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  dr = p->nOp - 1;
5de0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
5df0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
5e00: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
5e10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
5e20: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
5e30: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
5e40: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f     return (VdbeO
5e50: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c  p*)&dummy;.  }el
5e60: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
5e70: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5e80: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
5e90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  d(SQLITE_OMIT_EX
5ea0: 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e  PLAIN) || !defin
5eb0: 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20  ed(NDEBUG) \.   
5ec0: 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42    || defined(VDB
5ed0: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
5ee0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
5ef0: 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  UG)./*.** Comput
5f00: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
5f10: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
5f20: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
5f30: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
5f40: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
5f50: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
5f60: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
5f70: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
5f80: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
5f90: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
5fa0: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
5fb0: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
5fc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
5fd0: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
5fe0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
5ff0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
6000: 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20  INFO_STATIC:.   
6010: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
6020: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c  : {.      int i,
6030: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
6040: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
6050: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
6060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6070: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6080: 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64  emp, "keyinfo(%d
6090: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  ", pKeyInfo->nFi
60a0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  eld);.      i = 
60b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
60c0: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
60d0: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
60e0: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
60f0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
6100: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
6110: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
6120: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
6130: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
6140: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
6150: 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  en30(pColl->zNam
6160: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
6170: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
6180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
6190: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c  cpy(&zTemp[i],",
61a0: 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20  ...",4);.       
61b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
61c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
61d0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
61e0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ,';.          if
61f0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6200: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e  tOrder && pKeyIn
6210: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  fo->aSortOrder[j
6220: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ] ){.           
6230: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
6240: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
6250: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
6260: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c  &zTemp[i], pColl
6270: 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20  ->zName,n+1);.  
6280: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
6290: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
62a0: 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b  ( i+4<nTemp-6 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
62c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69  y(&zTemp[i],",ni
62d0: 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  l",4);.         
62e0: 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20   i += 4;.       
62f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6300: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29   zTemp[i++] = ')
6310: 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  ';.      zTemp[i
6320: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  ] = 0;.      ass
6330: 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a  ert( i<nTemp );.
6340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6350: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43   }.    case P4_C
6360: 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20  OLLSEQ: {.      
6370: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
6380: 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a   pOp->p4.pColl;.
6390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
63a0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
63b0: 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e  emp, "collseq(%.
63c0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
63d0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
63e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
63f0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
6400: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
6410: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
6420: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
6430: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6440: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
6450: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
6460: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
6470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6480: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
6490: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
64a0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
64b0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
64c0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
64d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
64e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
64f0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
6500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6510: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6520: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
6530: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6540: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6550: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
6560: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6570: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
6580: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
6590: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
65a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
65b0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
65c0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
65d0: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
65e0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d 65      assert( (pMe
65f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6600: 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ull)==0 );.     
6610: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6620: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6630: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6640: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6650: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6660: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
6670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6680: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6690: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
66a0: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
66b0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
66c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
66d0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
66e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66f0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
6700: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
6710: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6720: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
6730: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
6740: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
6750: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
6760: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6770: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
6780: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6790: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
67a0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
67b0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
67c0: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
67d0: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
67e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
67f0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6800: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
6810: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
6820: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62  Module);.      b
6830: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
6840: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
6850: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6860: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6870: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
6880: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
6890: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
68a0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
68b0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
68c0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
68d0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
68e0: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
68f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6900: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6910: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6920: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6930: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6940: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6950: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6960: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6970: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6980: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6990: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
69a0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
69b0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
69c0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
69d0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
69e0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
69f0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6a00: 6d 65 6e 74 20 68 61 73 20 74 6f 20 6b 6e 6f 77  ment has to know
6a10: 20 69 6e 20 61 64 76 61 6e 63 65 20 77 68 69 63   in advance whic
6a20: 68 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73 0a  h Btree objects.
6a30: 2a 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ** will be used 
6a40: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 61  so that it can a
6a50: 63 71 75 69 72 65 20 6d 75 74 65 78 65 73 20 6f  cquire mutexes o
6a60: 6e 20 74 68 65 6d 20 61 6c 6c 20 69 6e 20 73 6f  n them all in so
6a70: 72 74 65 64 0a 2a 2a 20 6f 72 64 65 72 20 28 76  rted.** order (v
6a80: 69 61 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  ia sqlite3VdbeMu
6a90: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 29 2e  texArrayEnter().
6aa0: 20 20 4d 75 74 65 78 65 73 20 61 72 65 20 61 63    Mutexes are ac
6ab0: 71 75 69 72 65 64 0a 2a 2a 20 69 6e 20 6f 72 64  quired.** in ord
6ac0: 65 72 20 28 61 6e 64 20 72 65 6c 65 61 73 65 64  er (and released
6ad0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
6ae0: 72 29 20 74 6f 20 61 76 6f 69 64 20 64 65 61 64  r) to avoid dead
6af0: 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  locks..*/.void s
6b00: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
6b10: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ree(Vdbe *p, int
6b20: 20 69 29 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b   i){.  int mask;
6b30: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
6b40: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
6b50: 26 26 20 69 3c 73 69 7a 65 6f 66 28 75 33 32 29  && i<sizeof(u32)
6b60: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
6b70: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
6b80: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
6b90: 0a 20 20 6d 61 73 6b 20 3d 20 28 28 75 33 32 29  .  mask = ((u32)
6ba0: 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d  1)<<i;.  if( (p-
6bb0: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
6bc0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
6bd0: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
6be0: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
6bf0: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
6c00: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
6c10: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
6c20: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
6c30: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
6c40: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
6c50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
6c60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
6c70: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
6c80: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6c90: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
6ca0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
6cb0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
6cc0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
6cd0: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
6ce0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
6cf0: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
6d00: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6d10: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
6d20: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
6d30: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
6d40: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
6d50: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
6d60: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
6d70: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
6d80: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
6d90: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
6da0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
6db0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
6dc0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
6dd0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
6de0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
6df0: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
6e00: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
6e10: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
6e20: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
6e30: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
6e40: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
6e50: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
6e60: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
6e70: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
6e80: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
6e90: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
6ea0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
6eb0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
6ec0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
6ed0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
6ee0: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
6ef0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
6f00: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
6f10: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
6f20: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
6f30: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6f40: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
6f50: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
6f60: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
6f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6f80: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
6f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
6fa0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
6fb0: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
6fc0: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
6fd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
6fe0: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
6ff0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
7000: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
7010: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
7020: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
7030: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7040: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
7050: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
7060: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
7070: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
7080: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
7090: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
70a0: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
70b0: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
70c0: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
70d0: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
70e0: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
70f0: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
7100: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
7110: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
7120: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
7130: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
7140: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
7150: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
7160: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
7170: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
7180: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
7190: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
71a0: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
71b0: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
71c0: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
71d0: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
71e0: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
71f0: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
7200: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
7210: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
7220: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
7230: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
7240: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7250: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
7260: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
7270: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
7280: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
7290: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
72a0: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
72b0: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
72c0: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
72d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
72e0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
72f0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
7300: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
7310: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
7320: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7330: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
7340: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
7350: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
7360: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7370: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7380: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
7390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
73a0: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
73b0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
73c0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
73d0: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
73e0: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
73f0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
7400: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
7410: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
7420: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
7430: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
7440: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
7450: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
7460: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7470: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7480: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
7490: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
74a0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
74b0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
74c0: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
74d0: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
74e0: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
74f0: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
7500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7510: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
7520: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7530: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
7540: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
7550: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
7560: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
7570: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
7580: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
7590: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
75a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
75b0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
75c0: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
75d0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
75e0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
75f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
7600: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
7610: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
7620: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
7630: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
7640: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
7650: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
7660: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
7670: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
7680: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
7690: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
76a0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
76b0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
76c0: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
76d0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
76e0: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
76f0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
7700: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
7710: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
7720: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
7730: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
7740: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
7750: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
7760: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
7770: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
7780: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
7790: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
77a0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
77b0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
77c0: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
77d0: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
77e0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
77f0: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
7800: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
7810: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
7820: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
7830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7840: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
7850: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
7880: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
7890: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
78a0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
78d0: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
78e0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
78f0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
7900: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
7910: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
7920: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
7930: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
7960: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
7970: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
7980: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
79a0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
79b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
79c0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
79f0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
7a00: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
7a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a20: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
7a30: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
7a40: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
7a50: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f   &p->aMem[1];  /
7a60: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
7a70: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
7a80: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
7a90: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
7aa0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
7ab0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
7ac0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
7ad0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
7ae0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
7af0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
7b00: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
7b10: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
7b20: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
7b30: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
7b40: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
7b50: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
7b60: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
7b70: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
7b80: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
7b90: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
7ba0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
7bb0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
7bc0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
7bd0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
7be0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
7bf0: 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  8);..  if( p->rc
7c00: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
7c10: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
7c20: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
7c30: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
7c40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
7c50: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
7c60: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
7c70: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
7c80: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
7c90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7ca0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
7cb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
7cc0: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
7cd0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
7ce0: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
7cf0: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
7d00: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
7d10: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
7d20: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
7d30: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
7d40: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
7d50: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
7d60: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
7d70: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
7d80: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
7d90: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
7da0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
7db0: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
7dc0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
7dd0: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
7de0: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
7df0: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
7e00: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
7e10: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
7e20: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
7e30: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
7e40: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
7e50: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
7e60: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
7e70: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
7e80: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
7e90: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
7ea0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
7eb0: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
7ec0: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
7ed0: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
7ee0: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
7ef0: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
7f00: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
7f10: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
7f20: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
7f30: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
7f40: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
7f50: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
7f60: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
7f70: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
7f80: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
7f90: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
7fa0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
7fb0: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
7fc0: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
7fd0: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
7fe0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
7ff0: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
8000: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
8010: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
8020: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
8030: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
8040: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
8050: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
8060: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
8070: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
8080: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
8090: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
80a0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
80b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
80c0: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
80d0: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
80e0: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
80f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
8100: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
8110: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
8120: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
8130: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
8140: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
8150: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
8160: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
8170: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8180: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
8190: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
81a0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
81b0: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
81c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
81d0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
81e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
81f0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8200: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
8210: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
8220: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
8230: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8240: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
8250: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
8260: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
8270: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
8280: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
8290: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
82a0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
82b0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
82c0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
82d0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
82e0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
82f0: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
8300: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
8310: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
8320: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
8330: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
8340: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
8350: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
8360: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
8370: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
8380: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
8390: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
83a0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
83b0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
83c0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
83d0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
83e0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
83f0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
8400: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8410: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8420: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
8430: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8440: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8450: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
8460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
8490: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
84a0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
84b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
84c0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
84d0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
84e0: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
84f0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8500: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
8510: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
8520: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8530: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
8540: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
8550: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
8560: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
8570: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
8580: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
8590: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
85a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
85b0: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
85c0: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
85d0: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
85e0: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
85f0: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
8600: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
8610: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
8620: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
8630: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
8640: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
8650: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
8660: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
8670: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
8680: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
8690: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
86a0: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
86b0: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
86c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
86d0: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
86e0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
86f0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
8700: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
8710: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
8720: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
8730: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
8740: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
8750: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
8760: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
8770: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
8780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
8790: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
87a0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
87b0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
87c0: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
87d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
87e0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
87f0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8800: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
8810: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
8820: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
8830: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
8840: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
8850: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
8860: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
8870: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
8880: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8890: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
88a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
88b0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
88c0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
88f0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8900: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8910: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
8920: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
8930: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
8940: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8960: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
8970: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
8980: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
8990: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
89a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
89b0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
89c0: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
89f0: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
8a00: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
8a10: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
8a20: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8a30: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
8a40: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
8a50: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
8a60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8a70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8a80: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
8a90: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8aa0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
8ab0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
8ac0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
8ad0: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
8ae0: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
8af0: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
8b00: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
8b10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
8b20: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
8b30: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
8b40: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
8b50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8b60: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
8b70: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
8b80: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
8b90: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
8ba0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
8bb0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
8bc0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
8bd0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
8be0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
8bf0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
8c00: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8c10: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
8c20: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
8c30: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
8c40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8c50: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
8c60: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
8c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
8c80: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
8c90: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
8ca0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
8cb0: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
8cc0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8cd0: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
8ce0: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
8cf0: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
8d00: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8d10: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
8d20: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
8d30: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
8d40: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
8d50: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
8d60: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
8d70: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
8d80: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
8d90: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
8da0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
8db0: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
8dc0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
8dd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
8de0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
8df0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
8e00: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
8e10: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8e20: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8e30: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
8e40: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
8e50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
8e60: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e80: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
8e90: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
8ea0: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
8eb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8ec0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
8ed0: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
8ee0: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
8ef0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
8f00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
8f10: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
8f20: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
8f30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
8f40: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
8f50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8f60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
8f70: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
8f80: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
8f90: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
8fa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8fb0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
8fc0: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
8fd0: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
8fe0: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
8ff0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9000: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9010: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9020: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9030: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9040: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9050: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
9060: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
9070: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
9080: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
9090: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
90a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
90b0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
90c0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
90d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
90e0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
90f0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9100: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9110: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9120: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9130: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9140: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9150: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9160: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9170: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
9180: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
9190: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
91a0: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
91b0: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
91c0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
91d0: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
91e0: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
91f0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9200: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9210: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9220: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9230: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9240: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9250: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9260: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9270: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9280: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9290: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
92a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
92b0: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
92c0: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
92d0: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
92e0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
92f0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9300: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9310: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9330: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9340: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9350: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9360: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9370: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9380: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9390: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
93a0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
93b0: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
93c0: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
93d0: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
93e0: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
93f0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9400: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9410: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9420: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9430: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9440: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9450: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9460: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9470: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9480: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9490: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
94a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
94b0: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
94c0: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
94d0: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
94e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
94f0: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9500: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9510: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9520: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9530: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9540: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9550: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
9560: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
9570: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
9580: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9590: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
95a0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
95b0: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
95c0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
95d0: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
95e0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
95f0: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
9600: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
9610: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
9620: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
9630: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
9640: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
9650: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
9660: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
9670: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
9680: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9690: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
96a0: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
96b0: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
96c0: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
96d0: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
96e0: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
96f0: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
9700: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
9710: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
9720: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
9730: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
9740: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
9750: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
9760: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
9770: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
9780: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
9790: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
97a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
97b0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
97c0: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
97d0: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
97e0: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
97f0: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
9800: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
9810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
9820: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
9830: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
9840: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
9850: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
9860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
9870: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
9880: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
9890: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
98a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
98b0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
98c0: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
98d0: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
98e0: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
98f0: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
9900: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
9910: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
9920: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
9930: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
9940: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
9950: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
9960: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
9970: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
9980: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
9990: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
99a0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
99b0: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
99c0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
99d0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
99e0: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
99f0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
9a00: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
9a10: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
9a20: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
9a30: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
9a40: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
9a50: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
9a60: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
9a70: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
9a80: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
9a90: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
9aa0: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
9ab0: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
9ac0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
9ad0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
9ae0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
9af0: 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
9b00: 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  e on a single vi
9b10: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
9b20: 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * The first call
9b30: 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63   is made while c
9b40: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
9b50: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73   statement. Subs
9b60: 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20  equent.** calls 
9b70: 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74  are made as part
9b80: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   of the process 
9b90: 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73  of resetting a s
9ba0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a  tatement to be.*
9bb0: 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66  * re-executed (f
9bc0: 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  rom a call to sq
9bd0: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20  lite3_reset()). 
9be0: 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20  The nVar, nMem, 
9bf0: 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20  nCursor .** and 
9c00: 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65  isExplain parame
9c10: 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61  ters are only pa
9c20: 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c  ssed correct val
9c30: 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ues the first ti
9c40: 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69  me.** the functi
9c50: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e  on is called. On
9c60: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
9c70: 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  s, from sqlite3_
9c80: 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a  reset(), nVar.**
9c90: 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e   is passed -1 an
9ca0: 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  d nMem, nCursor 
9cb0: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72  and isExplain ar
9cc0: 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72  e all passed zer
9cd0: 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
9ce0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
9cf0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
9d20: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
9d50: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
9d60: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
9d70: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
9da0: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
9db0: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
9dc0: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
9dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9de0: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
9df0: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
9e00: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e20: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
9e30: 20 6f 66 20 61 72 67 73 20 69 6e 20 53 75 62 50   of args in SubP
9e40: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
9e50: 20 69 73 45 78 70 6c 61 69 6e 2c 20 20 20 20 20   isExplain,     
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9e70: 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c 41  rue if the EXPLA
9e80: 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20 70  IN keywords is p
9e90: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
9ea0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
9eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
9ec0: 75 65 20 74 6f 20 73 65 74 20 56 64 62 65 2e 75  ue to set Vdbe.u
9ed0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a  sesStmtJournal *
9ee0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
9ef0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
9f00: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
9f10: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
9f20: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
9f30: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
9f40: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
9f50: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
9f60: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
9f70: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
9f80: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
9f90: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
9fa0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
9fb0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
9fc0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
9fd0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
9fe0: 52 55 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65  RUN;..  /* For e
9ff0: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
a000: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
a010: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
a020: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
a030: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
a040: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
a050: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
a060: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
a070: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
a080: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
a090: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
a0a0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
a0b0: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
a0c0: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
a0d0: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
a0e0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
a0f0: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
a100: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
a110: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
a120: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
a130: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
a140: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
a150: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
a160: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
a170: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
a180: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
a190: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
a1a0: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
a1b0: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
a1c0: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
a1d0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
a1e0: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
a1f0: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
a200: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
a210: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
a220: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
a230: 74 73 20 69 6e 2e 20 54 68 69 73 20 69 73 20 6f  ts in. This is o
a240: 6e 6c 79 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a  nly done the.  *
a250: 2a 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  * first time thi
a260: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
a270: 6c 6c 65 64 20 66 6f 72 20 61 20 67 69 76 65 6e  lled for a given
a280: 20 56 44 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20   VDBE, not when 
a290: 69 74 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  it is.  ** being
a2a0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c   called from sql
a2b0: 69 74 65 33 5f 72 65 73 65 74 28 29 20 74 6f 20  ite3_reset() to 
a2c0: 72 65 73 65 74 20 74 68 65 20 76 69 72 74 75 61  reset the virtua
a2d0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a  l machine..  */.
a2e0: 20 20 69 66 28 20 6e 56 61 72 3e 3d 30 20 26 26    if( nVar>=0 &&
a2f0: 20 41 4c 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c   ALWAYS(db->mall
a300: 6f 63 46 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a  ocFailed==0) ){.
a310: 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28      u8 *zCsr = (
a320: 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e  u8 *)&p->aOp[p->
a330: 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nOp];       /* M
a340: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
a350: 66 6f 72 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f  for alloation */
a360: 0a 20 20 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20  .    u8 *zEnd = 
a370: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
a380: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
a390: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
a3a0: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f  available mem */
a3b0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  .    int nByte; 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3e0: 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d  How much extra m
a3f0: 65 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a  emory needed */.
a400: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
a410: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
a420: 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a      p->usesStmtJ
a430: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65  ournal = (u8)use
a440: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20  sStmtJournal;.  
a450: 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20    if( isExplain 
a460: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
a470: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
a480: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
a490: 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43  zCsr, 0, zEnd-zC
a4a0: 73 72 29 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d  sr);.    zCsr +=
a4b0: 20 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29   (zCsr - (u8*)0)
a4c0: 26 37 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  &7;.    assert( 
a4d0: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
a4e0: 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20  MENT(zCsr) );.. 
a4f0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72     /* Memory for
a500: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
a510: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
a520: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
a530: 64 20 69 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20  d in two.    ** 
a540: 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20  passes.  On the 
a550: 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74  first pass, we t
a560: 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73  ry to reuse unus
a570: 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ed space at the 
a580: 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
a590: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
a5a0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
a5b0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
a5c0: 6c 20 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  l memory.    ** 
a5d0: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20  requirements by 
a5e0: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f  reusing the opco
a5f0: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74  de array tail, t
a600: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20  hen the second. 
a610: 20 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20     ** pass will 
a620: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74  fill in the rest
a630: 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61   using a fresh a
a640: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20  llocation.  .   
a650: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
a660: 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63  two-pass approac
a670: 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73  h that reuses as
a680: 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
a690: 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20  possible from.  
a6a0: 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65    ** the leftove
a6b0: 72 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  r space at the e
a6c0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
a6d0: 20 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69   array can signi
a6e0: 66 69 63 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  ficantly.    ** 
a6f0: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
a700: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
a710: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
a720: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f  tatement..    */
a730: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
a740: 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  nByte = 0;.     
a750: 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63   p->aMem = alloc
a760: 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e  Space(p->aMem, n
a770: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Mem*sizeof(Mem),
a780: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a790: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Byte);.      p->
a7a0: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
a7b0: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
a7c0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
a7d0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
a7e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72  );.      p->apAr
a7f0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
a800: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
a810: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73  zeof(Mem*), &zCs
a820: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
a830: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72  ;.      p->azVar
a840: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
a850: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
a860: 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73  eof(char*), &zCs
a870: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
a880: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
a890: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
a8a0: 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a  >apCsr, nCursor*
a8b0: 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f  sizeof(VdbeCurso
a8c0: 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r*),.           
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
a8f0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
a900: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
a910: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
a920: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
a930: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
a940: 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20     }.      zCsr 
a950: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
a960: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
a970: 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Byte];.    }whil
a980: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
a990: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
a9a0: 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72  ..    p->nCursor
a9b0: 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b   = (u16)nCursor;
a9c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 56 61 72  .    if( p->aVar
a9d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61   ){.      p->nVa
a9e0: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
a9f0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  .      for(n=0; 
aa00: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
aa10: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
aa20: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
aa30: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  l;.        p->aV
aa40: 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  ar[n].db = db;. 
aa50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa60: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
aa70: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b        p->aMem--;
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
aaa0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
aab0: 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  m */.      p->nM
aac0: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
aae0: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
aaf0: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20  nMem-1 */.      
ab00: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
ab10: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
ab20: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73  p->aMem[n].flags
ab30: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
ab40: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
ab50: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
ab60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
ab70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ab80: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e   for(n=1; n<p->n
ab90: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61  Mem; n++){.    a
aba0: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e  ssert( p->aMem[n
abb0: 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a  ].db==db );.  }.
abc0: 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20  #endif..  p->pc 
abd0: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
abe0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
abf0: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
ac00: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70  _Abort;.  p->exp
ac10: 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69  lain |= isExplai
ac20: 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  n;.  p->magic = 
ac30: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
ac40: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
ac50: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
ac60: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
ac70: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
ac80: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
ac90: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
aca0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
acb0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
acc0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74  FILE.  {.    int
acd0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
ace0: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
acf0: 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  .      p->aOp[i]
ad00: 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  .cnt = 0;.      
ad10: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
ad20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
ad30: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
ad40: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
ad50: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
ad60: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
ad70: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
ad80: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
ad90: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
ada0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
adb0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
adc0: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
add0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
ade0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
adf0: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pCx->pBt ){.  
ae00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ae10: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
ae20: 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70     /* The pCx->p
ae30: 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63  Cursor will be c
ae40: 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  lose automatical
ae50: 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  ly, if it exists
ae60: 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20  , by.    ** the 
ae70: 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20  call above. */. 
ae80: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e   }else if( pCx->
ae90: 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  pCursor ){.    s
aea0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
aeb0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72  Cursor(pCx->pCur
aec0: 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  sor);.  }.#ifnde
aed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
aee0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
aef0: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
af00: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
af10: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
af20: 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d  tabCursor = pCx-
af30: 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20  >pVtabCursor;.  
af40: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
af50: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
af60: 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  = pCx->pModule;.
af70: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
af80: 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f  hod = 1;.    pMo
af90: 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74  dule->xClose(pVt
afa0: 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70  abCursor);.    p
afb0: 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d  ->inVtabMethod =
afc0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d   0;.  }.#endif.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
afe0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
aff0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
b000: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
b010: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
b020: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
b030: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
b040: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
b050: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
b060: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
b070: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
b080: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
b090: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b0a0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
b0b0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
b0c0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
b0d0: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
b0e0: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
b0f0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
b100: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
b110: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
b120: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
b130: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
b140: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
b150: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
b160: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
b170: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
b180: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
b190: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
b1a0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
b1b0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
b1c0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
b1d0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
b1e0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
b1f0: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
b200: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
b210: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
b220: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
b230: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
b240: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
b250: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
b260: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
b270: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
b280: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
b290: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
b2a0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
b2b0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
b2c0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
b2d0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
b2e0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
b2f0: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
b300: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
b310: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
b320: 70 46 72 61 6d 65 20 3d 20 70 2d 3e 70 46 72 61  pFrame = p->pFra
b330: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
b340: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
b350: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
b360: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
b370: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
b380: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
b390: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
b3a0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
b3b0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
b3c0: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
b3d0: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
b3e0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b3f0: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
b400: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
b410: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
b420: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
b430: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
b440: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b450: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
b460: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
b470: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
b480: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
b490: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
b4a0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
b4b0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
b4c0: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
b4d0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
b4e0: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
b4f0: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
b500: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
b510: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
b520: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
b530: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
b540: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDel);.  }.}../
b550: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
b560: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75  e VM after execu
b570: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tion..**.** This
b580: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75   routine will au
b590: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
b5a0: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c  e any cursors, l
b5b0: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20  ists, and/or.** 
b5c0: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72  sorters that wer
b5d0: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74  e left open.  It
b5e0: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68   also deletes th
b5f0: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76  e values of.** v
b600: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20  ariables in the 
b610: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f  aVar[] array..*/
b620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
b630: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
b640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b650: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
b660: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
b670: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
b680: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
b690: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
b6a0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
b6b0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
b6c0: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
b6d0: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
b6e0: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
b6f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
b700: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
b710: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
b720: 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 73  sr==0 || p->apCs
b730: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  r[i]==0 );.  for
b740: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
b750: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
b760: 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e  ->aMem==0 || p->
b770: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
b780: 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 69  EM_Null );.#endi
b790: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
b7a0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
b7b0: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
b7c0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
b7d0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
b7e0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
b7f0: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
b800: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
b810: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
b820: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
b830: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
b840: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
b850: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
b860: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
b870: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
b880: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
b890: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
b8a0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
b8b0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
b8c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
b8d0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
b8e0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
b8f0: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
b900: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
b910: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
b920: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
b930: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
b940: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
b950: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b960: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
b970: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
b980: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
b990: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
b9a0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
b9b0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
b9c0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
b9d0: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
b9e0: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
b9f0: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
ba00: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
ba10: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ba20: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
ba30: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
ba40: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
ba50: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
ba60: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
ba70: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
ba80: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
ba90: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
baa0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
bab0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
bac0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
bad0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
bae0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
baf0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
bb00: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
bb10: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
bb20: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
bb30: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
bb40: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
bb50: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
bb60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
bb70: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
bb80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
bb90: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
bba0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
bbb0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
bbc0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
bbd0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
bbe0: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
bbf0: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
bc00: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
bc10: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
bc20: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
bc30: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
bc40: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
bc50: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
bc60: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
bc70: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
bc80: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bca0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
bcb0: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
bcc0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
bcf0: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
bd00: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
bd10: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bd30: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
bd40: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
bd50: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bd60: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
bd70: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
bd80: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
bd90: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
bda0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
bdb0: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
bdc0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
bdd0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
bde0: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
bdf0: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
be00: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
be10: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
be20: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
be30: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
be40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
be50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
be60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
be70: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
be80: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
be90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bea0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73  _NOMEM;.  }.  as
beb0: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
bec0: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
bed0: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
bee0: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
bef0: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63  esColumn]);.  rc
bf00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
bf10: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65  mSetStr(pColName
bf20: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c  , zName, -1, SQL
bf30: 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b  ITE_UTF8, xDel);
bf40: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30  .  assert( rc!=0
bf50: 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70   || !zName || (p
bf60: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d  ColName->flags&M
bf70: 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20  EM_Term)!=0 );. 
bf80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bf90: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77  *.** A read or w
bfa0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
bfb0: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
bfc0: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74  be active on dat
bfd0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
bfe0: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  db. If a transac
bff0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
c000: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68  commit it. If th
c010: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74  ere is a.** writ
c020: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70  e-transaction sp
c030: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  anning more than
c040: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
c050: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  le, this routine
c060: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f  .** takes care o
c070: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
c080: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a  rnal trickery..*
c090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
c0a0: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20  eCommit(sqlite3 
c0b0: 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
c0c0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
c0d0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
c0e0: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
c0f0: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
c100: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
c110: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
c120: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
c130: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
c140: 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
c150: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c160: 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
c170: 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
c180: 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
c190: 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
c1a0: 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
c1b0: 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
c1c0: 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
c1d0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
c1e0: 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
c1f0: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
c200: 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
c210: 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
c220: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
c230: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
c240: 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
c250: 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
c260: 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
c270: 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
c280: 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
c290: 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
c2a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
c2b0: 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
c2c0: 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
c2d0: 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
c2e0: 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
c2f0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
c300: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
c310: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
c320: 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
c330: 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a   &p->zErrMsg);..
c340: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
c350: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
c360: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
c370: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
c380: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
c390: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
c3a0: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
c3b0: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
c3c0: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
c3d0: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
c3e0: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
c3f0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
c400: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
c410: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
c420: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
c430: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
c440: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
c450: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
c460: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
c470: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
c480: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
c490: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
c4a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
c4b0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42  Db; i++){ .    B
c4c0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
c4d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
c4e0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
c4f0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
c500: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  {.      needXcom
c510: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mit = 1;.      i
c520: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73  f( i!=1 ) nTrans
c530: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ++;.      rc = s
c540: 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
c550: 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33  siveLock(sqlite3
c560: 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29  BtreePager(pBt))
c570: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c580: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c590: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
c5a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
c5b0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
c5c0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
c5d0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
c5e0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
c5f0: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
c600: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
c610: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
c620: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
c630: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
c640: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
c650: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
c660: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c670: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
c680: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
c690: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
c6a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
c6b0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
c6c0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
c6d0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
c6e0: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
c6f0: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
c700: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
c710: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
c720: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
c730: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
c740: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
c750: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
c760: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
c770: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
c780: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
c790: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
c7a0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
c7b0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
c7c0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
c7d0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
c7e0: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
c7f0: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
c800: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
c810: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
c820: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
c830: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
c840: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
c850: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
c860: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
c870: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
c880: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
c890: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
c8a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
c8b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
c8c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
c8d0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
c8e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c8f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
c900: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
c910: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c920: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
c930: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
c940: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
c950: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
c960: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
c970: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
c980: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
c990: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
c9a0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
c9b0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
c9c0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
c9d0: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
c9e0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
c9f0: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
ca00: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
ca10: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
ca20: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
ca30: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
ca40: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
ca50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
ca60: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
ca70: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
ca80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
ca90: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
caa0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
cab0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
cac0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cad0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
cae0: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
caf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
cb00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cb10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
cb20: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
cb30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
cb40: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
cb50: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
cb60: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
cb70: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
cb80: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
cb90: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
cba0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
cbb0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
cbc0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
cbd0: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
cbe0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
cbf0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
cc00: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
cc10: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
cc20: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
cc30: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
cc40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
cc50: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
cc60: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
cc70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
cc80: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
cc90: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
cca0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
ccb0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
ccc0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
ccd0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
cce0: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
ccf0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
cd00: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   res;..    /* Se
cd10: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
cd20: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
cd30: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
cd40: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
cd50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
cd60: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
cd70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
cd80: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
cd90: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
cda0: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
cdb0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
cdc0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
cdd0: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
cde0: 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66   iRandom&0x7ffff
cdf0: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
ce00: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
ce10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
ce30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ce40: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
ce50: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
ce60: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
ce70: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
ce80: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
ce90: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
cea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ceb0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
cec0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
ced0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
cee0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
cef0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
cf00: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
cf10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
cf20: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
cf30: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
cf40: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
cf50: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
cf60: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
cf70: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
cf80: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
cf90: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
cfa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cfb0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cfc0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
cfd0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cfe0: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
cff0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
d000: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
d010: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
d020: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
d030: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
d040: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
d050: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
d060: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
d070: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
d080: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
d090: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d0a0: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
d0b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
d0c0: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
d0d0: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
d0e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d0f0: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
d100: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
d110: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
d120: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
d130: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
d140: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
d150: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
d160: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
d170: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
d180: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
d190: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
d1a0: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
d1b0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
d1c0: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
d1d0: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
d1e0: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
d1f0: 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
d200: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
d210: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
d220: 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
d230: 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
d240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d250: 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
d260: 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
d270: 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26  if( !needSync &&
d280: 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79   !sqlite3BtreeSy
d290: 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20  ncDisabled(pBt) 
d2a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
d2b0: 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
d2c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
d2d0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
d2e0: 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c  (pMaster, zFile,
d2f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
d300: 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65  (zFile)+1, offse
d310: 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  t);.        offs
d320: 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  et += sqlite3Str
d330: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a  len30(zFile)+1;.
d340: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
d350: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d360: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
d370: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
d380: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
d390: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
d3a0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
d3b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
d3c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
d3d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
d3e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d3f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d400: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
d410: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d420: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
d430: 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
d440: 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20  L device.    ** 
d450: 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73  flag is set this
d460: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
d470: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d480: 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20   needSync .     
d490: 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  && 0==(sqlite3Os
d4a0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
d4b0: 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
d4c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
d4d0: 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
d4e0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
d4f0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
d500: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
d510: 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
d520: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d530: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
d540: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
d550: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
d560: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
d570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
d580: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
d590: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
d5a0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
d5b0: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
d5c0: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
d5d0: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
d5e0: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
d5f0: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
d600: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
d610: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
d620: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
d630: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
d640: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
d650: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
d660: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
d670: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
d680: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
d690: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
d6a0: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
d6b0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
d6c0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d6d0: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
d6e0: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
d6f0: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
d700: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
d710: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
d720: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
d730: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
d740: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
d750: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d760: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
d770: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
d780: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
d790: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
d7a0: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
d7b0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
d7c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
d7d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
d7e0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
d7f0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
d800: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
d810: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
d820: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d830: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
d840: 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
d850: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
d860: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
d870: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
d880: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
d890: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
d8a0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d8b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d8c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d8d0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
d8e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
d8f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d900: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
d910: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
d920: 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
d930: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
d940: 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
d950: 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
d960: 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
d970: 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
d980: 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
d990: 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
d9a0: 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
d9b0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
d9c0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
d9d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
d9e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d9f0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
da00: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
da10: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
da20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
da30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
da40: 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
da50: 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
da60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
da70: 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
da80: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
da90: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
daa0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
dab0: 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
dac0: 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
dad0: 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
dae0: 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
daf0: 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
db00: 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
db10: 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
db20: 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
db30: 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
db40: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
db50: 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
db60: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
db70: 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
db80: 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
db90: 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
dba0: 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
dbb0: 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
dbc0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
dbd0: 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
dbe0: 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
dbf0: 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
dc00: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
dc10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
dc20: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
dc30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
dc40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
dc50: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
dc60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
dc70: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
dc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
dc90: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
dca0: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
dcc0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
dcd0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
dce0: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
dcf0: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
dd00: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
dd10: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
dd20: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
dd30: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
dd40: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
dd50: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61  at the sqlite3.a
dd60: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75  ctiveVdbeCnt cou
dd70: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
dd80: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
dd90: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
dda0: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
ddb0: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
ddc0: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
ddd0: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
dde0: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
ddf0: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
de00: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
de10: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
de20: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
de30: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
de40: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
de50: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
de60: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
de70: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
de80: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
de90: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
dea0: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
deb0: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
dec0: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
ded0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
dee0: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
def0: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
df00: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
df10: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
df20: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
df30: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
df40: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
df50: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
df60: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
df70: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
df80: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
df90: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
dfa0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
dfb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
dfc0: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64  ite==db->writeVd
dfd0: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65  beCnt );.}.#else
dfe0: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
dff0: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
e000: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  endif../*.** For
e010: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61   every Btree tha
e020: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  t in database co
e030: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63  nnection db whic
e040: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d  h .** has been m
e050: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20  odified, "trip" 
e060: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61  or invalidate ea
e070: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20  ch cursor in.** 
e080: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74  that Btree might
e090: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
e0a0: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ied so that the 
e0b0: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65  cursor.** can ne
e0c0: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69  ver be used agai
e0d0: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  n.  This happens
e0e0: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
e0f0: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65  .*** occurs.  We
e100: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c   have to trip al
e110: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73  l the other curs
e120: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72  ors, even.** cur
e130: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56  sor from other V
e140: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  Ms in different 
e150: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e160: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74  ions,.** so that
e170: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72   none of them tr
e180: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74  y to use the dat
e190: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a  a at which they.
e1a0: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67  ** were pointing
e1b0: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d   and which now m
e1c0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61  ay have been cha
e1d0: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74  nged due.** to t
e1e0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
e1f0: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74  ** Remember that
e200: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20   a rollback can 
e210: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f  delete tables co
e220: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65  mplete and.** re
e230: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e  order rootpages.
e240: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73    So it is not s
e250: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74  ufficient just t
e260: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74  o save.** the st
e270: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
e280: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  r.  We have to i
e290: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75  nvalidate the cu
e2a0: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20  rsor.** so that 
e2b0: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  it is never used
e2c0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69   again..*/.stati
e2d0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
e2e0: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
e2f0: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33  edBtrees(sqlite3
e300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
e310: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e320: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e330: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
e340: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
e350: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42  f( p && sqlite3B
e360: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
e370: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e380: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
e390: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41  sors(p, SQLITE_A
e3a0: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  BORT);.    }.  }
e3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
e3c0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
e3d0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
e3e0: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
e3f0: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
e400: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
e410: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
e420: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
e430: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
e440: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
e450: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
e460: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
e470: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
e480: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
e490: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
e4a0: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
e4b0: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
e4c0: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
e4d0: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
e4e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
e4f0: 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mmtted..**.** If
e500: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
e510: 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
e520: 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
e530: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
e540: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
e550: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
e560: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
e570: 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
e580: 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
e590: 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
e5a0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
e5b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e5c0: 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
e5d0: 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
e5e0: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
e5f0: 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
e600: 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
e610: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e620: 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
e630: 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
e640: 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
e650: 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
e660: 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
e670: 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73  ve occured, caus
e680: 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
e690: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
e6a0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
e6b0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
e6c0: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
e6d0: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
e6e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
e6f0: 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
e700: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
e710: 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
e720: 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
e730: 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
e740: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
e750: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
e760: 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
e770: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
e780: 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
e790: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
e7a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e7b0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
e7c0: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
e7d0: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
e7e0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
e7f0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e800: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
e810: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
e820: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
e830: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
e840: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
e850: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
e860: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
e870: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
e880: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
e890: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
e8a0: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
e8b0: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
e8c0: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
e8d0: 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
e8e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e8f0: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
e900: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
e910: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
e920: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
e930: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
e940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
e950: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e960: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
e970: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e980: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
e990: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
e9a0: 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
e9b0: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  t = 0;..    /* I
e9c0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
e9d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
e9e0: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
e9f0: 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
ea00: 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
ea10: 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
ea20: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
ea30: 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
ea40: 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
ea50: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
ea60: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
ea70: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
ea80: 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
ea90: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
eaa0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
eab0: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
eac0: 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
ead0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
eae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
eaf0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
eb00: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
eb10: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
eb20: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
eb30: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
eb40: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
eb50: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
eb60: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
eb70: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
eb80: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
eb90: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
eba0: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
ebb0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
ebc0: 64 6f 69 6e 67 20 73 6f 20 69 74 0a 2a 2a 20 73  doing so it.** s
ebd0: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
ebe0: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
ebf0: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
ec00: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
ec10: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
ec20: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
ec30: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
ec40: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
ec50: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
ec60: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
ec70: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
ec80: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
ec90: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
eca0: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
ecb0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 29 20 69  treeEnterAll() i
ecc0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
ecd0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
ece0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
ecf0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
ed00: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
ed10: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
ed20: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
ed30: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
ed40: 74 68 20 74 68 65 20 56 4d 2e 20 4f 66 20 63 6f  th the VM. Of co
ed50: 75 72 73 65 20 6f 6e 6c 79 20 61 20 73 75 62 73  urse only a subs
ed60: 65 74 20 6f 66 20 74 68 65 73 65 20 73 74 72 75  et of these stru
ed70: 63 74 75 72 65 73 0a 2a 2a 20 77 69 6c 6c 20 62  ctures.** will b
ed80: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
ed90: 65 20 56 4d 2c 20 61 6e 64 20 77 65 20 63 6f 75  e VM, and we cou
eda0: 6c 64 20 75 73 65 20 56 64 62 65 2e 62 74 72 65  ld use Vdbe.btre
edb0: 65 4d 61 73 6b 20 74 6f 20 66 69 67 75 72 65 0a  eMask to figure.
edc0: 2a 2a 20 74 68 61 74 20 73 75 62 73 65 74 20 6f  ** that subset o
edd0: 75 74 2c 20 62 75 74 20 74 68 65 72 65 20 69 73  ut, but there is
ede0: 20 6e 6f 20 61 64 76 61 6e 74 61 67 65 20 74 6f   no advantage to
edf0: 20 64 6f 69 6e 67 20 73 6f 2e 0a 2a 2a 0a 2a 2a   doing so..**.**
ee00: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
ee10: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
ee20: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
ee30: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
ee40: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
ee50: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
ee60: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
ee70: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ee80: 43 41 43 48 45 0a 76 6f 69 64 20 73 71 6c 69 74  CACHE.void sqlit
ee90: 65 33 56 64 62 65 4d 75 74 65 78 41 72 72 61 79  e3VdbeMutexArray
eea0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
eeb0: 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
eec0: 44 53 41 46 45 0a 20 20 73 71 6c 69 74 65 33 42  DSAFE.  sqlite3B
eed0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e  treeMutexArrayEn
eee0: 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ter(&p->aMutex);
eef0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
ef00: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 70 2d  BtreeEnterAll(p-
ef10: 3e 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23  >db);.#endif.}.#
ef20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
ef30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
ef40: 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  lled when a tran
ef50: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62  saction opened b
ef60: 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  y the database .
ef70: 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69  ** handle associ
ef80: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d  ated with the VM
ef90: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
efa0: 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20  gument is about 
efb0: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74  to be .** commit
efc0: 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72  ted. If there ar
efd0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65  e outstanding de
efe0: 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b  ferred foreign k
eff0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  ey constraint.**
f000: 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74   violations, ret
f010: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
f020: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
f030: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
f040: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
f050: 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74  anding FK violat
f060: 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75  ions and this fu
f070: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
f080: 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  ** SQLITE_ERROR,
f090: 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20   set the result 
f0a0: 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c  of the VM to SQL
f0b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
f0c0: 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 65  nd write.** an e
f0d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
f0e0: 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
f0f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
f100: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f110: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
f120: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f130: 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
f140: 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
f150: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f160: 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
f170: 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e 44  ferred && db->nD
f180: 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 7c  eferredCons>0) |
f190: 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
f1a0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
f1b0: 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  >0) ){.    p->rc
f1c0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
f1d0: 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 72  AINT;.    p->err
f1e0: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
f1f0: 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
f200: 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45  SetString(&p->zE
f210: 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 65  rrMsg, db, "fore
f220: 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
f230: 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
f240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
f250: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
f260: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
f270: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
f280: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
f290: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
f2a0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
f2b0: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
f2c0: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
f2d0: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
f2e0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
f2f0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
f300: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
f310: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
f320: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
f330: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
f340: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f350: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
f360: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
f370: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
f380: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
f390: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
f3a0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
f3b0: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
f3c0: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
f3d0: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
f3e0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
f3f0: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
f400: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
f410: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
f420: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
f430: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
f440: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
f450: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
f460: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
f470: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
f480: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
f490: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
f4a0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
f4b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
f4c0: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
f4d0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
f4e0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
f4f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f500: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
f510: 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
f520: 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
f530: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
f540: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
f550: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
f560: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
f570: 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
f580: 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
f590: 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
f5a0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
f5b0: 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
f5c0: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
f5d0: 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
f5e0: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
f5f0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
f600: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
f610: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
f620: 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
f630: 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
f640: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
f650: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
f660: 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
f670: 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
f680: 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
f690: 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
f6a0: 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
f6b0: 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
f6c0: 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
f6d0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
f6e0: 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
f6f0: 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
f700: 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
f710: 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
f720: 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
f730: 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
f740: 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
f750: 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
f760: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
f770: 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
f780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f790: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
f7a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f7b0: 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  }.  closeAllCurs
f7c0: 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
f7d0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
f7e0: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
f7f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f800: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
f810: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
f820: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
f830: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
f840: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
f850: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
f860: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
f870: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
f880: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
f890: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
f8a0: 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
f8b0: 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
f8c0: 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
f8d0: 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
f8e0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
f8f0: 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
f900: 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
f910: 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
f920: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
f930: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
f940: 71 6c 69 74 65 33 56 64 62 65 4d 75 74 65 78 41  qlite3VdbeMutexA
f950: 72 72 61 79 45 6e 74 65 72 28 70 29 3b 0a 0a 20  rrayEnter(p);.. 
f960: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
f970: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
f980: 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  al errors */.   
f990: 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30   mrc = p->rc & 0
f9a0: 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xff;.    assert(
f9b0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49   p->rc!=SQLITE_I
f9c0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20  OERR_BLOCKED ); 
f9d0: 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e   /* This error n
f9e0: 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20  o longer exists 
f9f0: 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  */.    isSpecial
fa00: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
fa10: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
fa20: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
fa50: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
fa60: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
fa70: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
fa80: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
fa90: 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
faa0: 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
fab0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
fac0: 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
fad0: 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
fae0: 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
faf0: 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
fb00: 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
fb10: 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
fb20: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
fb30: 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
fb40: 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
fb50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
fb60: 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
fb70: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
fb80: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
fb90: 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
fba0: 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
fbb0: 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
fbc0: 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
fbd0: 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
fbe0: 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
fbf0: 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
fc00: 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
fc10: 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
fc20: 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72 69  ccured while wri
fc30: 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
fc40: 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  nal, sub-journal
fc50: 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20   or database.   
fc60: 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61     ** file as pa
fc70: 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20  rt of an effort 
fc80: 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65  to free up cache
fc90: 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63   space (see func
fca0: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61  tion.      ** pa
fcb0: 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70  gerStress() in p
fcc0: 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c  ager.c), the rol
fcd0: 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65  lback is require
fce0: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20  d to restore .  
fcf0: 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72      ** the pager
fd00: 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74   to a consistent
fd10: 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f   state..      */
fd20: 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72  .      if( !p->r
fd30: 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
fd40: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
fd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
fd60: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
fd70: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
fd80: 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73  E_FULL) && p->us
fd90: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
fda0: 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
fdb0: 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
fdc0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20  INT_ROLLBACK;.  
fdd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fde0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
fdf0: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
fe00: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
fe10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
fe20: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
fe30: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
fe40: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
fe50: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
fe60: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
fe70: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
fe80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
fe90: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
fea0: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
feb0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
fec0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
fed0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
fee0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
fef0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
ff00: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
ff10: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
ff20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
ff30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
ff40: 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
ff50: 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
ff60: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
ff70: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
ff80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
ff90: 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
ffa0: 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
ffb0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
ffc0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
ffd0: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
ffe0: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
fff0: 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
10000 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
10010 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
10020 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
10030 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
10040 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
10050 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
10060 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
10070 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
10080 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
10090 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
100a0 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
100b0 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
100c0 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
100d0 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
100e0 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
100f0 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 77  t .     && db->w
10100 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70 2d  riteVdbeCnt==(p-
10110 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20  >readOnly==0) . 
10120 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
10130 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
10140 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
10150 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
10160 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
10170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
10180 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10190 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20  kFk(p, 1);.     
101a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
101b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
101c0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
101d0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
101e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
101f0 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
10200 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
10210 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
10220 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10230 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10240 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10250 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
10260 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
10270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10280 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10290 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
102a0 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
102b0 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
102c0 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
102d0 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
102e0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
102f0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
10300 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
10310 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
10320 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
10330 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
10340 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
10350 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
10360 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
10370 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
10380 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
10390 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
103a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
103b0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
103c0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
103d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
103e0 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
103f0 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
10400 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
10410 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
10420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
10450 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
10460 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
10470 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
10480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10490 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
104a0 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
104b0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d       sqlite3Comm
104c0 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65  itInternalChange
104d0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  s(db);.        }
104e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
104f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
10500 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
10510 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
10520 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
10530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
10540 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
10550 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
10560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
10570 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
10580 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
10590 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
105a0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
105b0 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
105c0 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
105d0 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
105e0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
105f0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
10600 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
10610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10620 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
10630 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
10640 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  s(db);.        s
10650 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10660 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73  l(db);.        s
10670 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
10680 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
10690 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
106a0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
106b0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
106c0 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
106d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
106e0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
106f0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
10700 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
10710 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
10720 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
10730 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
10740 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
10750 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
10760 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
10770 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
10780 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
10790 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
107a0 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
107b0 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
107c0 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
107d0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
107e0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
107f0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
10800 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
10810 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
10820 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
10830 6e 74 28 29 20 63 61 6e 20 6f 6e 6c 79 20 66 61  nt() can only fa
10840 69 6c 20 69 66 20 65 53 74 61 74 65 6d 65 6e 74  il if eStatement
10850 4f 70 0a 20 20 20 20 2a 2a 20 69 73 20 53 41 56  Op.    ** is SAV
10860 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2e  EPOINT_ROLLBACK.
10870 20 20 42 75 74 20 69 66 20 70 2d 3e 72 63 3d 3d    But if p->rc==
10880 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 65  SQLITE_OK then e
10890 53 74 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20  StatementOp.    
108a0 2a 2a 20 6d 75 73 74 20 62 65 20 53 41 56 45 50  ** must be SAVEP
108b0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 20 48  OINT_RELEASE.  H
108c0 65 6e 63 65 20 74 68 65 20 4e 45 56 45 52 28 70  ence the NEVER(p
108d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc==SQLITE_OK)
108e0 20 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   in .    ** the 
108f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 2e 0a  following code..
10900 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
10910 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
10920 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10930 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
10940 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
10950 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
10960 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  rc ){.        as
10970 73 65 72 74 28 20 65 53 74 61 74 65 6d 65 6e 74  sert( eStatement
10980 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
10990 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 20 20  LLBACK );.      
109a0 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72    if( NEVER(p->r
109b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7c 7c  c==SQLITE_OK) ||
109c0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
109d0 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
109e0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
109f0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
10a00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
10a10 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
10a20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
10a30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
10a40 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
10a50 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66  teCursorsOnModif
10a60 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20  iedBtrees(db);. 
10a70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
10a80 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
10a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
10aa0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
10ab0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
10ac0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
10ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
10ae0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
10af0 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
10b00 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
10b10 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
10b20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
10b30 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
10b40 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
10b50 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
10b60 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
10b70 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
10b80 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
10b90 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
10ba0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
10bb0 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
10bc0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
10bd0 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
10be0 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
10bf0 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
10c00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
10c10 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
10c20 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
10c30 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
10c40 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
10c50 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  .    /* Rollback
10c60 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73   or commit any s
10c70 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68  chema changes th
10c80 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a  at occurred. */.
10c90 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
10ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
10cb0 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
10cc0 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
10cd0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
10ce0 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
10cf0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d  b, 0);.      db-
10d00 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
10d10 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
10d20 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
10d30 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
10d40 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
10d50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
10d60 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
10d70 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d  &p->aMutex);.  }
10d80 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
10d90 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
10da0 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
10db0 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
10dc0 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
10dd0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
10de0 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
10df0 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  Cnt--;.    if( !
10e00 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
10e10 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64       db->writeVd
10e20 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  beCnt--;.    }. 
10e30 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
10e40 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62  ctiveVdbeCnt>=db
10e50 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29  ->writeVdbeCnt )
10e60 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
10e70 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41   = VDBE_MAGIC_HA
10e80 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76  LT;.  checkActiv
10e90 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20  eVdbeCnt(db);.  
10ea0 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
10eb0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
10ec0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
10ed0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  MEM;.  }..  /* I
10ee0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
10ef0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
10f00 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
10f10 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
10f20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
10f30 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
10f40 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
10f50 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
10f60 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
10f70 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
10f80 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
10f90 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
10fa0 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
10fb0 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
10fc0 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
10fd0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
10fe0 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
10ff0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74   assert( db->act
11000 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20  iveVdbeCnt>0 || 
11010 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
11020 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
11030 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
11040 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
11050 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
11060 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
11070 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
11080 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
11090 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
110a0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
110b0 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
110c0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
110d0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
110e0 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
110f0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
11100 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11110 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
11120 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
11130 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11140 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
11150 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
11160 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
11170 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
11180 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
11190 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
111a0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
111b0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
111c0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
111d0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
111e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
111f0 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
11200 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
11210 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
11220 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
11230 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
11240 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
11250 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
11260 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
11270 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
11280 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
11290 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
112a0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
112b0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
112c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
112d0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
112e0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
112f0 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
11300 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
11310 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
11320 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
11330 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
11340 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
11350 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
11360 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
11370 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
11380 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
11390 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
113a0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
113b0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
113c0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
113d0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
113e0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
113f0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
11400 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
11410 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
11420 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
11430 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
11440 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
11450 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
11460 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
11470 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
11480 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
11490 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
114a0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
114b0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
114c0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
114d0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
114e0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
114f0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
11500 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
11510 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11520 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
11530 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
11540 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
11550 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
11560 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
11570 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
11580 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
11590 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
115a0 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
115b0 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
115c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
115d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
115e0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
115f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
11600 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
11610 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
11620 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
11630 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
11640 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
11650 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
11660 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
11670 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
11680 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
11690 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
116a0 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
116b0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
116c0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
116d0 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
116e0 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
116f0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
11700 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
11710 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
11720 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
11730 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
11740 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
11750 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
11760 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
11770 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
11780 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c  Error(db, p->rc,
11790 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
117a0 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e  ValueSetStr(db->
117b0 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72  pErr, -1, p->zEr
117c0 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  rMsg, SQLITE_UTF
117d0 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  8, SQLITE_TRANSI
117e0 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
117f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
11800 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
11810 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
11820 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
11830 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
11840 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
11850 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
11860 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
11870 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
11880 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
11890 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
118a0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
118b0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
118c0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
118d0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
118e0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
118f0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
11900 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
11910 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
11920 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
11930 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11940 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
11950 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
11960 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
11970 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
11980 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
11990 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
119a0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
119b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
119c0 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
119d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
119e0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
119f0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
11a00 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
11a10 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
11a20 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
11a30 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
11a40 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
11a50 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
11a60 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
11a70 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
11a80 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
11a90 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
11aa0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11ab0 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
11ac0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
11ad0 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
11ae0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
11af0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
11b00 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
11b10 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
11b20 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
11b30 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
11b40 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
11b50 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
11b60 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
11b70 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
11b80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11b90 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
11ba0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
11bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
11bc0 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
11bd0 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
11be0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
11bf0 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
11c00 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
11c10 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
11c20 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
11c30 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
11c40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11c50 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
11c60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11c70 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
11c80 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
11c90 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
11ca0 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
11cb0 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
11cc0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
11cd0 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
11ce0 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
11cf0 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
11d00 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
11d10 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
11d20 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
11d30 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
11d40 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
11d50 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
11d60 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
11d70 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
11d80 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
11d90 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
11da0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
11db0 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
11dc0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
11dd0 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
11de0 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
11df0 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
11e00 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
11e10 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 29 20  (((u32)1)<<i))) 
11e20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
11e30 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
11e40 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
11e50 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
11e60 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
11e70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
11e80 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
11e90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
11ea0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
11eb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11ec0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
11ed0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
11ee0 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 20 64  gument..** The d
11ef0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
11f00 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11f10 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
11f20 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
11f30 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
11f40 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
11f50 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
11f60 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
11f70 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
11f80 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11f90 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
11fa0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
11fb0 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
11fc0 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
11fd0 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
11fe0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  , *pNext;.  asse
11ff0 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
12000 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
12010 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12020 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
12030 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
12040 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
12050 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
12060 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
12070 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
12080 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
12090 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
120a0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
120b0 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
120c0 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
120d0 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
120e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
120f0 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
12100 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
12110 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e  (db, p->aOp, p->
12120 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  nOp);.  sqlite3D
12130 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
12140 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  bel);.  sqlite3D
12150 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
12160 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
12170 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
12180 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Sql);.  sqlite3D
12190 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72  bFree(db, p->pFr
121a0 65 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ee);.  sqlite3Db
121b0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
121c0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
121d0 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
121e0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
121f0 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
12200 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
12210 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
12220 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
12230 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
12240 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
12250 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12260 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
12270 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
12280 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29  ( db->pVdbe==p )
12290 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20  ;.    db->pVdbe 
122a0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
122b0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
122c0 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
122d0 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
122e0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63  ;.  }.  p->magic
122f0 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
12300 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b  AD;.  p->db = 0;
12310 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
12320 6c 65 74 65 4f 62 6a 65 63 74 28 64 62 2c 20 70  leteObject(db, p
12330 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
12340 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
12350 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
12360 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
12370 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
12380 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
12390 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
123a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
123b0 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
123c0 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
123d0 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
123e0 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
123f0 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
12400 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
12410 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
12420 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
12430 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
12440 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
12450 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
12460 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
12470 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
12480 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
12490 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
124a0 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
124b0 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
124c0 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
124d0 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
124e0 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
124f0 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
12500 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
12510 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
12520 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
12530 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
12540 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
12550 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12560 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
12570 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12580 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12590 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
125a0 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
125b0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
125c0 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
125d0 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  eto ){.    int r
125e0 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53  es, rc;.#ifdef S
125f0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65  QLITE_TEST.    e
12600 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12610 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
12620 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
12630 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
12640 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12650 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
12660 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c  cked(p->pCursor,
12670 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
12680 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
12690 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
126a0 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61  rn rc;.    p->la
126b0 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76  stRowid = p->mov
126c0 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69  etoTarget;.    i
126d0 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
126e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
126f0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72  T_BKPT;.    p->r
12700 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b  owidIsValid = 1;
12710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
12720 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
12730 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
12740 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
12750 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
12760 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
12770 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
12780 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
12790 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73 6f  ALWAYS(p->pCurso
127a0 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61  r) ){.    int ha
127b0 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20  sMoved;.    int 
127c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
127d0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
127e0 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73  p->pCursor, &has
127f0 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20  Moved);.    if( 
12800 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12810 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
12820 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63   ){.      p->cac
12830 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
12840 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d  _STALE;.      p-
12850 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
12860 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12880 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
12890 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
128a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
128b0 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
128c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
128d0 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
128e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
128f0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
12900 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
12910 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12920 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
12930 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
12940 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
12950 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
12960 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
12970 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
12980 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
12990 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
129a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
129b0 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
129c0 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
129d0 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
129e0 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
129f0 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
12a00 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
12a10 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
12a20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
12a30 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
12a40 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
12a50 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
12a60 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
12a70 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
12a80 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
12a90 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
12aa0 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
12ab0 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
12ac0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
12ad0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
12ae0 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
12af0 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
12b00 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
12b10 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
12b20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
12b30 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
12b40 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
12b50 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79   blob seperately
12b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
12b70 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
12b80 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
12b90 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
12ba0 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
12bb0 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
12bc0 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
12bd0 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
12be0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
12bf0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
12c00 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
12c20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
12c30 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
12c40 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
12c50 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
12c60 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
12c70 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
12c80 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
12cb0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
12cc0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
12cd0 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
12ce0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
12cf0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
12d00 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
12d10 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
12d20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
12d30 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d50 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
12d60 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
12d70 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
12d80 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
12d90 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
12da0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dc0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
12dd0 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
12de0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
12df0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
12e00 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
12e10 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
12e20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
12e30 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
12e40 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
12e50 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
12e60 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
12e90 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
12ea0 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
12eb0 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
12ec0 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
12ed0 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
12ee0 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
12ef0 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
12f00 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
12f10 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
12f20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
12f30 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
12f40 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
12f50 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
12f60 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
12f70 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
12f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12f90 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
12fa0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
12fb0 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
12fc0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
12fd0 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
12fe0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
12ff0 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  t){.  int flags 
13000 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20  = pMem->flags;. 
13010 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66   int n;..  if( f
13020 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
13030 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13040 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d   }.  if( flags&M
13050 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  EM_Int ){.    /*
13060 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74   Figure out whet
13070 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c  her to use 1, 2,
13080 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73   4, 6 or 8 bytes
13090 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20  . */.#   define 
130a0 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36  MAX_6BYTE ((((i6
130b0 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33  4)0x00008000)<<3
130c0 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20  2)-1).    i64 i 
130d0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
130e0 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20   u64 u;.    if( 
130f0 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26  file_format>=4 &
13100 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20  & (i&1)==i ){.  
13110 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
13120 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  2)i;.    }.    u
13130 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
13140 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
13150 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
13160 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
13170 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
13180 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
13190 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
131a0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
131b0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
131c0 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
131d0 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
131e0 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
131f0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
13200 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
13210 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
13220 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
13230 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
13240 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
13250 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
13260 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
13270 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
13280 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
13290 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73  .nZero;.  }.  as
132a0 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
132b0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
132c0 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
132d0 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
132e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
132f0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
13300 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
13310 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
13320 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
13330 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13340 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
13350 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
13360 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
13370 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
13380 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
13390 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
133a0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
133b0 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
133c0 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
133d0 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
133e0 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
133f0 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
13400 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
13410 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
13420 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
13430 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
13440 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
13450 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
13460 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
13470 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
13480 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
13490 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
134a0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
134b0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
134c0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
134d0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
134e0 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
134f0 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
13500 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
13510 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
13520 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
13530 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
13540 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
13550 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
13560 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
13570 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
13580 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
13590 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
135a0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
135b0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
135c0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
135d0 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
135e0 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
135f0 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
13600 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
13610 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
13620 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
13630 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
13640 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
13650 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
13660 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
13670 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
13680 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
13690 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
136a0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
136b0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
136c0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
136d0 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
136e0 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
136f0 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
13700 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
13710 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
13720 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
13730 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
13740 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
13750 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
13760 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
13770 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
13780 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
13790 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
137a0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
137b0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
137c0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
137d0 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
137e0 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
137f0 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
13800 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
13810 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
13820 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
13830 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
13840 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
13850 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
13860 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
13870 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
13880 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
13890 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
138a0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
138b0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
138c0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
138d0 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
138e0 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
138f0 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
13900 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
13910 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
13920 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
13930 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
13940 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
13950 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
13960 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
13970 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
13980 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
13990 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
139a0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
139b0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
139c0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
139d0 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
139e0 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
139f0 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
13a00 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
13a10 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
13a20 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
13a30 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
13a40 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
13a50 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
13a60 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
13a70 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
13a80 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
13a90 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
13aa0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
13ab0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
13ac0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
13ad0 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
13ae0 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
13af0 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
13b00 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
13b10 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
13b20 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
13b30 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
13b40 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
13b50 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
13b60 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
13b70 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
13b80 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
13b90 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
13ba0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
13bb0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
13bc0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
13bd0 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
13be0 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
13bf0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
13c00 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
13c10 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
13c20 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
13c30 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
13c40 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
13c50 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
13c60 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
13c70 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
13c80 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
13c90 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
13ca0 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
13cb0 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
13cc0 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
13cd0 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
13ce0 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
13cf0 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
13d00 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
13d10 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
13d20 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
13d30 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
13d40 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
13d50 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
13d60 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
13d70 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
13d80 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
13d90 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
13da0 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
13db0 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
13dc0 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
13dd0 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
13de0 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
13df0 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
13e00 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
13e10 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
13e20 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
13e30 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
13e40 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
13e50 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
13e60 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
13e70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
13e80 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
13e90 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
13ea0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
13eb0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
13ec0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
13ed0 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
13ee0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
13ef0 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
13f00 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
13f10 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
13f20 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
13f30 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
13f40 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
13f50 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
13f60 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
13f70 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
13f80 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13f90 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
13fa0 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20  _format);.  u32 
13fb0 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
13fc0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
13fd0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
13fe0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
13ff0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
14000 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
14010 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14020 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
14030 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
14040 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
14050 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
14060 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
14070 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
14080 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14090 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
140a0 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
140b0 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
140c0 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
140d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
140e0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
140f0 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
14100 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20   len<=(u32)nBuf 
14110 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
14120 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
14130 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
14140 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
14150 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14160 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14170 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
14180 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
14190 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
141a0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
141b0 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
141c0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
141d0 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
141e0 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
141f0 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
14200 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
14210 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
14220 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
14230 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
14240 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
14250 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
14260 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
14270 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
14280 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
14290 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
142a0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73  .nZero;.      as
142b0 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b  sert( nBuf>=0 );
142c0 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e  .      if( len >
142d0 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20   (u32)nBuf ){.  
142e0 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32        len = (u32
142f0 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20  )nBuf;.      }. 
14300 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
14310 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
14320 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
14330 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14340 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
14350 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
14360 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
14370 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
14380 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
14390 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
143a0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
143b0 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
143c0 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
143d0 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
143e0 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
143f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
14400 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73   read..*/ .u32 s
14410 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14420 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
14430 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
14440 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
14450 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
14460 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
14470 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
14480 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
14490 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
144a0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
144b0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
144c0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
144d0 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
144e0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
144f0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
14500 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
14510 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
14520 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
14530 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
14540 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
14550 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
14560 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
14570 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
14580 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
14590 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
145a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
145b0 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
145c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
145d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
145e0 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
145f0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
14600 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
14610 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14620 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
14630 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
14640 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
14650 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14660 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
14670 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
14680 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
14690 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
146a0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
146b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
146c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
146d0 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
146e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
146f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
14700 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
14710 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
14720 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
14730 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
14740 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
14750 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
14760 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
14770 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
14780 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
14790 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
147a0 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
147b0 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
147c0 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
147d0 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
147e0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
147f0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
14800 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
14810 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
14820 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
14830 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
14840 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
14850 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
14860 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
14870 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
14880 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
14890 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
148a0 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
148b0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
148c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
148d0 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
148e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
148f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
14900 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
14910 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
14920 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
14930 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
14940 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
14950 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
14960 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
14970 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
14980 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
14990 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
149a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
149b0 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
149c0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
149d0 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
149e0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
149f0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
14a00 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
14a10 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
14a20 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
14a30 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
14a40 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
14a50 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
14a60 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
14a70 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
14a80 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
14a90 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
14aa0 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
14ab0 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
14ac0 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
14ad0 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
14ae0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
14af0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
14b00 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
14b10 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
14b20 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
14b30 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14b40 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
14b50 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
14b60 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
14b70 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )==0 );.#endif..
14b80 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
14b90 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
14ba0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
14bb0 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
14bc0 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
14bd0 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
14be0 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
14bf0 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
14c00 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
14c10 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
14c20 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
14c30 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
14c40 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
14c50 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14c60 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
14c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14c80 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14c90 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
14ca0 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a  (pMem->r)==8 );.
14cb0 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65          swapMixe
14cc0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
14cd0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
14ce0 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69  &pMem->r, &x, si
14cf0 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
14d00 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14d10 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
14d20 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  m->r) ? MEM_Null
14d30 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   : MEM_Real;.   
14d40 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
14d50 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
14d60 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
14d70 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
14d80 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
14d90 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
14da0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
14db0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
14dc0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
14dd0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
14de0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
14df0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
14e00 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
14e10 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
14e20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
14e30 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
14e40 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
14e50 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
14e60 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
14e70 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
14e80 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
14e90 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
14ea0 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
14eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
14ec0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14ed0 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
14ee0 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
14ef0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
14f00 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
14f10 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
14f20 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
14f30 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
14f40 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
14f50 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74 68  pKey[], parse th
14f60 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f  e.** record into
14f70 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72   a UnpackedRecor
14f80 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  d structure.  Re
14f90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14fa0 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63 74  o.** that struct
14fb0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ure..**.** The c
14fc0 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
14fd0 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73 7a  might provide sz
14fe0 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20 6d  Space bytes of m
14ff0 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 61  emory.** space a
15000 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73 20  t pSpace.  This 
15010 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73 65  space can be use
15020 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  d to hold the re
15030 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61  turned.** VDbePa
15040 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  rsedRecord struc
15050 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c 61  ture if it is la
15060 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66 20  rge enough.  If 
15070 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67  it is.** not big
15080 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20 69   enough, space i
15090 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
150a0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
150b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
150c0 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20 73  rned structure s
150d0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
150e0 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  by a call to.** 
150f0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15100 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
15110 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52  )..*/ .UnpackedR
15120 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
15130 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
15140 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
15150 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
15160 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
15170 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
15180 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
15190 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
151a0 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
151b0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
151c0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
151d0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
151e0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
151f0 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
15200 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e        /* Unalign
15210 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ed space availab
15220 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6f  le to hold the o
15230 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73  bject */.  int s
15240 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20  zSpace          
15250 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
15260 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
15270 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
15280 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
15290 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
152a0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
152b0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
152c0 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75 6e 70   *p;  /* The unp
152d0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 68 61  acked record tha
152e0 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  t we will return
152f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
15300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
15310 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64 65 64  ory space needed
15320 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e 20 62   to hold p, in b
15330 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 64 3b  ytes */.  int d;
15340 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 31  .  u32 idx;.  u1
15350 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
15360 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
15370 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15380 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
15390 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 6e 4f   *pMem;.  int nO
153a0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ff;           /*
153b0 20 49 6e 63 72 65 61 73 65 20 70 53 70 61 63 65   Increase pSpace
153c0 20 62 79 20 74 68 69 73 20 6d 75 63 68 20 74 6f   by this much to
153d0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20 69 74   8-byte align it
153e0 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a   */.  .  /*.  **
153f0 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
15400 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
15410 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
15420 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
15430 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
15440 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
15450 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
15460 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
15470 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
15480 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
15490 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
154a0 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
154b0 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
154c0 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
154d0 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
154e0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
154f0 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
15500 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20 6e 4f  ;.  pSpace += nO
15510 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20 2d 3d  ff;.  szSpace -=
15520 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65 20 3d   nOff;.  nByte =
15530 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
15540 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
15550 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
15560 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
15570 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
15580 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  szSpace ){.    p
15590 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
155a0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
155b0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
155c0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
155d0 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67  n 0;.    p->flag
155e0 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s = UNPACKED_NEE
155f0 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43 4b 45  D_FREE | UNPACKE
15600 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a  D_NEED_DESTROY;.
15610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
15620 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
15630 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 70 2d  *)pSpace;.    p-
15640 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45  >flags = UNPACKE
15650 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a  D_NEED_DESTROY;.
15660 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66    }.  p->pKeyInf
15670 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
15680 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
15690 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
156a0 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d  ;.  p->aMem = pM
156b0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68  em = (Mem*)&((ch
156c0 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69  ar*)p)[ROUND8(si
156d0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
156e0 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  ord))];.  assert
156f0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
15700 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
15710 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
15720 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
15730 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
15740 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
15750 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c   idx<szHdr && u<
15760 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d  p->nField && d<=
15770 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
15780 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
15790 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
157a0 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
157b0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
157c0 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
157d0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
157e0 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
157f0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70  yInfo->db;.    p
15800 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a  Mem->flags = 0;.
15810 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
15820 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
15830 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15840 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
15850 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
15860 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
15870 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73     u++;.  }.  as
15880 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
15890 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
158a0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
158b0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
158c0 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  *)p;.}../*.** Th
158d0 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72  is routine destr
158e0 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65  oys a UnpackedRe
158f0 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  cord object..*/.
15900 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
15910 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
15920 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63  cord(UnpackedRec
15930 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ord *p){.  int i
15940 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a  ;.  Mem *pMem;..
15950 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
15960 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66  ;.  assert( p->f
15970 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
15980 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a  NEED_DESTROY );.
15990 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
159a0 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
159b0 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
159c0 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75  +){.    /* The u
159d0 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69  npacked record i
159e0 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75  s always constru
159f0 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  cted by the.    
15a00 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e  ** sqlite3VdbeUn
15a10 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e  packRecord() fun
15a20 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69  ction above, whi
15a30 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20  ch makes all.   
15a40 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20   ** strings and 
15a50 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41  blobs static.  A
15a60 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65  nd none of the e
15a70 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20  lements are.    
15a80 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72  ** ever transfor
15a90 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  med, so there is
15aa0 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20   never anything 
15ab0 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a  to delete..    *
15ac0 2f 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  /.    if( pMem->
15ad0 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
15ae0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
15af0 70 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pMem);.  }.  if(
15b00 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41   p->flags & UNPA
15b10 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 29  CKED_NEED_FREE )
15b20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
15b30 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  ree(p->pKeyInfo-
15b40 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  >db, p);.  }.}..
15b50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15b60 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
15b70 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
15b80 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
15b90 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
15ba0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
15bb0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
15bc0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
15bd0 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
15be0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
15bf0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
15c00 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
15c10 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
15c20 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
15c30 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
15c40 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
15c50 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
15c60 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
15c70 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
15c80 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
15c90 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
15ca0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
15cb0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
15cc0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
15cd0 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
15ce0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
15cf0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
15d00 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
15d10 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
15d20 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
15d30 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
15d40 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
15d50 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
15d60 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
15d70 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
15d80 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
15d90 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
15da0 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
15db0 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
15dc0 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
15dd0 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
15de0 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
15df0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
15e00 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
15e10 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
15e20 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
15e30 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
15e40 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
15e50 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
15e60 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
15e70 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
15e80 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
15e90 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
15ea0 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
15eb0 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
15ec0 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
15ed0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
15ee0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
15ef0 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
15f00 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
15f10 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
15f20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
15f30 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
15f40 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
15f50 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
15f60 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
15f70 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
15f80 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
15f90 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
15fa0 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
15fb0 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
15fc0 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
15fd0 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
15fe0 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
15ff0 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
16000 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
16010 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
16020 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
16030 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
16040 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
16050 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
16060 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
16070 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
16080 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
16090 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
160a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
160b0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
160c0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
160d0 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
160e0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
160f0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
16100 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
16110 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
16120 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
16130 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
16140 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
16150 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
16160 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
16170 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
16180 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
16190 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
161a0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
161b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
161c0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
161d0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
161e0 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
161f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
16200 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
16210 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
16220 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
16230 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
16240 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16250 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
16260 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
16270 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
16280 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
16290 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
162a0 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
162b0 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
162c0 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
162d0 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
162e0 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
162f0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
16300 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a  VVA_ONLY( mem1.z
16310 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
16320 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
16330 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16340 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
16350 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
16360 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
16370 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
16380 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16390 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
163a0 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
163b0 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
163c0 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
163d0 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
163e0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
163f0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
16400 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
16410 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64  initialized, and
16420 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65   doing .  ** the
16430 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69   unnecessary ini
16440 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20  tialization has 
16450 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67  a measurable neg
16460 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  ative performanc
16470 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73  e.  ** impact, s
16480 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ince this routin
16490 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68  e is a very high
164a0 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f   runner.  And so
164b0 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a  , we choose.  **
164c0 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   to ignore the c
164d0 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
164e0 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20   and leave this 
164f0 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69  variable uniniti
16500 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f  alized..  */.  /
16510 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b  *  mem1.u.i = 0;
16520 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c    // not needed,
16530 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65   here to silence
16540 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
16550 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d  g */.  .  idx1 =
16560 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
16570 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64  y1, szHdr1);.  d
16580 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66  1 = szHdr1;.  if
16590 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
165a0 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
165b0 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73  E_ROWID ){.    s
165c0 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e  zHdr1--;.  }.  n
165d0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
165e0 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
165f0 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
16600 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
16610 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
16620 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
16630 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
16640 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
16650 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
16660 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
16670 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
16680 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
16690 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
166a0 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d   );.    if( d1>=
166b0 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65 33  nKey1 && sqlite3
166c0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
166d0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e  n(serial_type1)>
166e0 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
166f0 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
16700 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
16710 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
16720 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
16730 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
16740 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
16750 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
16760 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
16770 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
16780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
16790 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
167a0 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
167b0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3c                i<
167d0 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66  nField ? pKeyInf
167e0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29  o->aColl[i] : 0)
167f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
16800 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16810 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
16820 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
16830 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20  ent below */..  
16840 20 20 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68      /* Invert th
16850 65 20 72 65 73 75 6c 74 20 69 66 20 77 65 20 61  e result if we a
16860 72 65 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f  re using DESC so
16870 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
16880 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
16890 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69  >aSortOrder && i
168a0 3c 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49  <nField && pKeyI
168b0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
168c0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
168d0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
168e0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66      .      /* If
168f0 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 41 52   the PREFIX_SEAR
16900 43 48 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  CH flag is set a
16910 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78  nd all fields ex
16920 63 65 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20  cept the final. 
16930 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69       ** rowid fi
16940 65 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20  eld were equal, 
16950 74 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50  then clear the P
16960 52 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61  REFIX_SEARCH fla
16970 67 20 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20  g and set .     
16980 20 2a 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69   ** pPKey2->rowi
16990 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  d to the value o
169a0 66 20 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c  f the rowid fiel
169b0 64 20 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65  d in (pKey1, nKe
169c0 79 31 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  y1)..      ** Th
169d0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
169e0 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70  e OP_IsUnique op
169f0 63 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  code..      */. 
16a00 20 20 20 20 20 69 66 28 20 28 70 50 4b 65 79 32       if( (pPKey2
16a10 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16a20 45 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48  ED_PREFIX_SEARCH
16a30 29 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d  ) && i==(pPKey2-
16a40 3e 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20  >nField-1) ){.  
16a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64        assert( id
16a60 78 31 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63  x1==szHdr1 && rc
16a70 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
16a80 72 74 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26  rt( mem1.flags &
16a90 20 4d 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20   MEM_Int );.    
16aa0 20 20 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67      pPKey2->flag
16ab0 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50  s &= ~UNPACKED_P
16ac0 52 45 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20  REFIX_SEARCH;.  
16ad0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f        pPKey2->ro
16ae0 77 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a  wid = mem1.u.i;.
16af0 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
16b00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16b10 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
16b20 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
16b30 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
16b40 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
16b50 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
16b60 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
16b70 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
16b80 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
16b90 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
16ba0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
16bb0 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
16bc0 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
16bd0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
16be0 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
16bf0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
16c00 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f  alloc==0 );..  /
16c10 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
16c20 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
16c30 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
16c40 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
16c50 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
16c60 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
16c70 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
16c80 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
16c90 4e 43 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67  NCRKEY.  ** flag
16ca0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72   is set, then br
16cb0 65 61 6b 20 74 68 65 20 74 69 65 20 62 79 20 74  eak the tie by t
16cc0 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20  reating key2 as 
16cd0 6c 61 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20  larger..  ** If 
16ce0 74 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46  the UPACKED_PREF
16cf0 49 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73  IX_MATCH flag is
16d00 20 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20   set, then keys 
16d10 77 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66  with common pref
16d20 69 78 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f  ixes.  ** are co
16d30 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
16d40 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
16d50 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
16d60 20 69 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61   is the .  ** la
16d70 72 67 65 72 2e 20 20 41 73 20 69 74 20 68 61 70  rger.  As it hap
16d80 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32  pens, the pPKey2
16d90 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
16da0 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20  the longer.  ** 
16db0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69  if there is a di
16dc0 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
16dd0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
16de0 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  ;.  if( pPKey2->
16df0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
16e00 5f 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20  _INCRKEY ){.    
16e10 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  rc = -1;.  }else
16e20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
16e30 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
16e40 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
16e50 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30    /* Leave rc==0
16e60 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
16e70 69 64 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20  idx1<szHdr1 ){. 
16e80 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
16e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
16ea0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
16eb0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
16ec0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
16ed0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
16ee0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
16ef0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
16f00 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
16f10 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
16f20 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
16f30 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
16f40 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
16f50 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
16f60 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
16f70 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
16f80 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
16f90 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
16fa0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
16fb0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
16fc0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
16fd0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
16fe0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
16ff0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
17000 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
17010 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17020 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
17030 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
17040 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
17050 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
17060 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
17070 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
17080 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
17090 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
170a0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
170b0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
170c0 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
170d0 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
170e0 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
170f0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
17100 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
17110 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
17120 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
17130 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
17140 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
17150 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
17160 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
17170 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
17180 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
17190 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
171a0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
171b0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
171c0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
171d0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
171e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
171f0 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
17200 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
17210 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
17220 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
17230 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
17240 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17250 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
17260 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72  lid(pCur) );.  r
17270 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17280 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
17290 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65  CellKey);.  asse
172a0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
172b0 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72  K );     /* pCur
172c0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
172d0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
172e0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73  ot fail */.  ass
172f0 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26  ert( (nCellKey &
17300 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29   SQLITE_MAX_U32)
17310 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20  ==(u64)nCellKey 
17320 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e  );..  /* Read in
17330 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
17340 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
17350 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 65  ex entry */.  me
17360 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
17370 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
17380 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
17390 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
173a0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
173b0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
173c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
173d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
173e0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
173f0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
17400 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
17410 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
17420 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
17430 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
17440 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73  zHdr==3 );.  tes
17450 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
17460 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
17470 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28  ely(szHdr<3 || (
17480 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
17490 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
174a0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
174b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
174c0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
174d0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
174e0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
174f0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
17500 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
17510 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
17520 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
17530 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
17540 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
17550 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
17560 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
17570 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
17580 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17590 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
175a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
175b0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
175c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
175d0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
175e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
175f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17600 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
17610 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17620 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
17630 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17640 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
17650 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
17660 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
17670 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
17680 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17690 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
176a0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
176b0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
176c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
176d0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
176e0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
176f0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
17700 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
17710 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
17720 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
17730 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17740 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
17750 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
17760 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
17770 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
17780 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
17790 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
177a0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
177b0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
177c0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
177d0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
177e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
177f0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
17800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
17810 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
17820 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
17830 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
17840 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
17850 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
17860 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
17870 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
17880 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
17890 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
178a0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
178b0 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30  se( m.zMalloc!=0
178c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
178d0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
178e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
178f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d  _CORRUPT_BKPT;.}
17900 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
17910 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
17920 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
17930 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
17940 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74  nting to against
17950 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
17960 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e  ng in pUnpacked.
17970 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52    Write into *pR
17980 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74  es a number.** t
17990 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c  hat is negative,
179a0 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
179b0 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73  ve if pC is less
179c0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
179d0 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74  .** or greater t
179e0 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20  han pUnpacked.  
179f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
17a00 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a   on success..**.
17a10 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20  ** pUnpacked is 
17a20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
17a30 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
17a40 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
17a50 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
17a60 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
17a70 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
17a80 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
17a90 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
17aa0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
17ab0 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c  as well.  Hence,
17ac0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
17ad0 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  ly compares the 
17ae0 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20  prefixes .** of 
17af0 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74  the keys prior t
17b00 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  o the final rowi
17b10 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72  d, not the entir
17b20 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e key..*/.int sq
17b30 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
17b40 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75  ompare(.  VdbeCu
17b50 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
17b60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
17b70 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
17b80 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
17b90 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
17ba0 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
17bb0 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
17bc0 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  ey to compare ag
17bd0 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  ainst */.  int *
17be0 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
17bf0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
17c00 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72  the comparison r
17c10 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b  esult here */.){
17c20 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
17c30 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
17c40 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
17c50 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20  = pC->pCursor;. 
17c60 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72   Mem m;..  asser
17c70 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
17c80 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75  ursorIsValid(pCu
17c90 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
17ca0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
17cb0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
17cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
17cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
17ce0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17cf0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17d00 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17d10 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
17d20 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
17d30 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
17d40 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
17d50 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a 2a   of the say.  **
17d60 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
17d70 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
17d80 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
17d90 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
17da0 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
17db0 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
17dc0 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
17dd0 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
17de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17df0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17e00 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
17e10 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
17e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
17e30 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
17e40 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
17e50 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
17e60 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
17e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
17e80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
17e90 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20  Unpacked->flags 
17ea0 26 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52  & UNPACKED_IGNOR
17eb0 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65  E_ROWID );.  *re
17ec0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
17ed0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
17ee0 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
17ef0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
17f00 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
17f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17f20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
17f30 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
17f40 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
17f50 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
17f60 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
17f70 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
17f80 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
17f90 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
17fa0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
17fb0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
17fc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
17fd0 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
17fe0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17ff0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
18000 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
18010 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
18020 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
18030 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
18040 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
18050 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
18060 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
18070 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
18080 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
18090 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
180a0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
180b0 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
180c0 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
180d0 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
180e0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
180f0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18100 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
18110 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
18120 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
18130 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
18140 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
18150 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
18160 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
18170 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
18180 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
18190 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
181a0 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
181b0 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
181c0 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
181d0 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
181e0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
181f0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
18200 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
18210 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
18220 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
18230 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
18240 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
18250 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
18260 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
18270 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
18280 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18290 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
182a0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
182b0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
182c0 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
182d0 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
182e0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
182f0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
18300 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18310 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
18320 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
18330 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
18340 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
18350 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
18360 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
18370 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
18380 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
18390 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
183a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
183b0 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
183c0 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
183d0 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
183e0 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
183f0 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
18400 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
18410 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
18420 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
18430 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
18440 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
18450 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
18460 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
18470 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
18480 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
18490 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
184a0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
184b0 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
184c0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
184d0 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
184e0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
184f0 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
18500 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
18510 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
18520 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
18530 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
18540 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
18550 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
18560 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
18570 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
18580 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18590 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
185a0 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
185b0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
185c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
185d0 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
185e0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
185f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
18600 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
18610 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
18620 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
18640 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20 2a  StoreType((Mem *
18650 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d 0a  )pRet);.      }.
18660 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
18670 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
18680 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
18690 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
186a0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
186b0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
186c0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
186d0 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
186e0 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
186f0 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
18700 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
18710 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
18720 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
18730 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
18740 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
18750 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
18760 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
18770 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
18780 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
18790 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
187a0 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
187b0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
187c0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
187d0 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
187e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
187f0 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65  e the pre-update
18800 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69   hook. If this i
18810 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
18820 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65  ELETE pre-update
18830 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63   call,.** then c
18840 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20  ursor passed as 
18850 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18860 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ent should point
18870 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75   to the row abou
18880 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74  t.** to be updat
18890 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  e or deleted. If
188a0 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
188b0 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70   calls sqlite3_p
188c0 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a  reupdate_old(),.
188d0 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ** the required 
188e0 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65  value will be re
188f0 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20  ad from the row 
18900 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
18910 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  s to..*/.void sq
18920 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61  lite3VdbePreUpda
18930 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a  teHook(.  Vdbe *
18940 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
18950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
18960 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f  e pre-update hoo
18970 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20  k is invoked by 
18980 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
18990 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20  *pCsr,          
189a0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
189b0 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c  o grab old.* val
189c0 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ues from */.  in
189d0 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
189f0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
18a00 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
18a10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
18a20 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
18a30 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18a40 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
18a50 74 20 63 68 61 72 20 2a 7a 54 62 6c 2c 20 20 20  t char *zTbl,   
18a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18a70 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  able name */.  i
18a80 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20  64 iKey1,       
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18aa0 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61  * Initial key va
18ab0 6c 75 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  lue */.  i64 iKe
18ac0 79 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y2              
18ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
18ae0 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 29  l key value */.)
18af0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
18b00 3d 20 76 2d 3e 64 62 3b 0a 0a 20 20 50 72 65 55  = v->db;..  PreU
18b10 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
18b20 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 70  .  memset(&preup
18b30 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  date, 0, sizeof(
18b40 50 72 65 55 70 64 61 74 65 29 29 3b 0a 0a 20 20  PreUpdate));..  
18b50 70 72 65 75 70 64 61 74 65 2e 70 43 73 72 20 3d  preupdate.pCsr =
18b60 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70 64 61   pCsr;.  preupda
18b70 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20 64 62  te.op = op;.  db
18b80 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 26  ->pPreUpdate = &
18b90 70 72 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d  preupdate;.  db-
18ba0 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
18bb0 61 63 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61  ack(db->pPreUpda
18bc0 74 65 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a  teArg, db, op, z
18bd0 44 62 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c  Db, zTbl, iKey1,
18be0 20 69 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70   iKey2);.  db->p
18bf0 50 72 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20  PreUpdate = 0;. 
18c00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18c10 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 52 65  b, preupdate.aRe
18c20 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 72 65  cord);.  if( pre
18c30 75 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64  update.pUnpacked
18c40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
18c50 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
18c60 64 52 65 63 6f 72 64 28 70 72 65 75 70 64 61 74  dRecord(preupdat
18c70 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  e.pUnpacked);.  
18c80 7d 0a 7d 0a 0a                                   }.}..