/ Hex Artifact Content
Login

Artifact 316409c6878363525a2835aab15e0505c951a16d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20   *z, int n, int 
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20  isPrepareV2){.  
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72  assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70  eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66  areV2==0 );.  if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20  MIT_TRACE.  if( 
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07c0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23  sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c   that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67  east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77  er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  as..**.** If an 
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72  out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72   resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20  QLITE_NOMEM. In 
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61  this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41  Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a  Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a    VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  )));.  pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e  ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29  ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20  /sizeof(Op);.   
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a   p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e    }.  return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a   SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70  beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33  , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64  ){.  int i;.  Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20  beOp *pOp;..  i 
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65  = p->nOp;.  asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20  .  assert( op>0 
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c  if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72  =i ){.    if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a  owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e      }.  }.  p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op++;.  pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d  ->aOp[i];.  pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70  >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b  ;.  pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b  .  pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b  .  pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b  .  pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ;.  pOp->p4type 
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69  = P4_NOTUSED;.#i
0f40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f50: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f60: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f70: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0f80: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0f90: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fa0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fb0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fc0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0fd0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
0fe0: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
0ff0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1000: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1010: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1020: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1040: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1050: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1060: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1070: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
1080: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
1090: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10a0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10b0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10c0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10d0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
10e0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
10f0: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1100: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1110: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1120: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1130: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1140: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1150: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1160: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1170: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1190: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11a0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11b0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11c0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
11e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
11f0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1200: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1210: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1220: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1230: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1240: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1250: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1260: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1270: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1280: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1290: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12a0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12b0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12d0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
12e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12f0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1300: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1310: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1320: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f  ../*.** Add an O
1330: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70  P_ParseSchema op
1340: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
1350: 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75  ine is broken ou
1360: 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  t from.** sqlite
1370: 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69  3VdbeAddOp4() si
1380: 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  nce it needs to 
1390: 61 6c 73 6f 20 6c 6f 63 61 6c 20 61 6c 6c 20 62  also local all b
13a0: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  trees..**.** The
13b0: 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d   zWhere string m
13c0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
13d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
13e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
13f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1400: 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69  ll take ownershi
1410: 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  p of the allocat
1420: 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f  ed memory..*/.vo
1430: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  id sqlite3VdbeAd
1440: 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56  dParseSchemaOp(V
1450: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c  dbe *p, int iDb,
1460: 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a   char *zWhere){.
1470: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61    int j;.  int a
1480: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1490: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61  eAddOp3(p, OP_Pa
14a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
14b0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
14c0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
14d0: 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34  addr, zWhere, P4
14e0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
14f0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
1500: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
1510: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
1520: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
1530: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1540: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
1550: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
1560: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
1570: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
1580: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
1590: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
15a0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
15b0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
15c0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
15d0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
15e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1600: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
1610: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
1620: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1630: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1640: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1650: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1660: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
1670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1680: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
1690: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
16a0: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
16b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16c0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
16d0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
16e0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
16f0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
1700: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
1710: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
1720: 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  dr;.}../*.** Cre
1730: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c  ate a new symbol
1740: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20  ic label for an 
1750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
1760: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a   has yet to be.*
1770: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79  * coded.  The sy
1780: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20  mbolic label is 
1790: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65  really just a ne
17a0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20  gative number.  
17b0: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e  The.** label can
17c0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
17d0: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f  P2 value of an o
17e0: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72  peration.  Later
17f0: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61  , when.** the la
1800: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20  bel is resolved 
1810: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64  to a specific ad
1820: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20  dress, the VDBE 
1830: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72  will scan.** thr
1840: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69  ough its operati
1850: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e  on list and chan
1860: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  ge all values of
1870: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a   P2 which match.
1880: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74  ** the label int
1890: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61  o the resolved a
18a0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ddress..**.** Th
18b0: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61  e VDBE knows tha
18c0: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20  t a P2 value is 
18d0: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20  a label because 
18e0: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c  labels are.** al
18f0: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e  ways negative an
1900: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20  d P2 values are 
1910: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f  suppose to be no
1920: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48  n-negative..** H
1930: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65  ence, a negative
1940: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c   P2 value is a l
1950: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65  abel that has ye
1960: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64  t to be resolved
1970: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
1980: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
1990: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  lloc() fails..*/
19a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19b0: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  MakeLabel(Vdbe *
19c0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
19d0: 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a   = p->nLabel++;.
19e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
19f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
1a00: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  NIT );.  if( i>=
1a10: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29  p->nLabelAlloc )
1a20: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d  {.    int n = p-
1a30: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b  >nLabelAlloc*2 +
1a40: 20 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   5;.    p->aLabe
1a50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
1a60: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
1a70: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e      n*sizeof(p->
1ab0: 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 20  aLabel[0]));.   
1ac0: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20   p->nLabelAlloc 
1ad0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1ae0: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  cSize(p->db, p->
1af0: 61 4c 61 62 65 6c 29 2f 73 69 7a 65 6f 66 28 70  aLabel)/sizeof(p
1b00: 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 3b 0a 20 20  ->aLabel[0]);.  
1b10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  }.  if( p->aLabe
1b20: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1b30: 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a  el[i] = -1;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d    return -1-i;.}
1b50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
1b60: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
1b70: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
1b80: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
1b90: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
1ba0: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
1bb0: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
1bc0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
1bd0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
1be0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
1bf0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
1c00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c10: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
1c20: 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 78  l(Vdbe *p, int x
1c30: 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d 31 2d  ){.  int j = -1-
1c40: 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  x;.  assert( p->
1c50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1c60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1c70: 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d  rt( j>=0 && j<p-
1c80: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28  >nLabel );.  if(
1c90: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1ca0: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d    p->aLabel[j] =
1cb0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a   p->nOp;.  }.}..
1cc0: 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56  /*.** Mark the V
1cd0: 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20  DBE as one that 
1ce0: 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20  can only be run 
1cf0: 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69  one time..*/.voi
1d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e  d sqlite3VdbeRun
1d10: 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70  OnlyOnce(Vdbe *p
1d20: 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f  ){.  p->runOnlyO
1d30: 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64  nce = 1;.}..#ifd
1d40: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  ef SQLITE_DEBUG 
1d50: 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72 74  /* sqlite3Assert
1d60: 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63  MayAbort() logic
1d70: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   */../*.** The f
1d80: 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e  ollowing type an
1d90: 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75  d function are u
1da0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1db0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
1dc0: 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20  es.** in a Vdbe 
1dd0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64  main program and
1de0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75 62   each of the sub
1df0: 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67  -programs (trigg
1e00: 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20  ers) it may .** 
1e10: 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20  invoke directly 
1e20: 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49  or indirectly. I
1e30: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1e40: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
1e50: 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a  **   Op *pOp;.**
1e60: 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49     VdbeOpIter sI
1e70: 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d  ter;.**.**   mem
1e80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
1e90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a  izeof(sIter));.*
1ea0: 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b  *   sIter.v = v;
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76              // v
1ed0: 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62 65   is of type Vdbe
1ee0: 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28  * .**   while( (
1ef0: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
1f00: 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20  (&sIter)) ){.** 
1f10: 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68      // Do someth
1f20: 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20  ing with pOp.** 
1f30: 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33    }.**   sqlite3
1f40: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
1f50: 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a  ter.apSub);.** .
1f60: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1f70: 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64 62  t VdbeOpIter Vdb
1f80: 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20  eOpIter;.struct 
1f90: 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56  VdbeOpIter {.  V
1fa0: 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
1fb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
1fc0: 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  e to iterate thr
1fd0: 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73  ough the opcodes
1fe0: 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67   of */.  SubProg
1ff0: 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20  ram **apSub;    
2000: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
2010: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20  subprograms */. 
2020: 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20   int nSub;      
2030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2040: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2050: 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69   in apSub */.  i
2060: 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20 20  nt iAddr;       
2070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2080: 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73  ress of next ins
2090: 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75  truction to retu
20a0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  rn */.  int iSub
20b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20c0: 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70     /* 0 = main p
20d0: 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73  rogram, 1 = firs
20e0: 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74  t sub-program et
20f0: 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  c. */.};.static 
2100: 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56  Op *opIterNext(V
2110: 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20  dbeOpIter *p){. 
2120: 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b   Vdbe *v = p->v;
2130: 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b  .  Op *pRet = 0;
2140: 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e  .  Op *aOp;.  in
2150: 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d  t nOp;..  if( p-
2160: 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29  >iSub<=p->nSub )
2170: 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53  {..    if( p->iS
2180: 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ub==0 ){.      a
2190: 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20  Op = v->aOp;.   
21a0: 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b     nOp = v->nOp;
21b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21c0: 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    aOp = p->apSub
21d0: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70  [p->iSub-1]->aOp
21e0: 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d  ;.      nOp = p-
21f0: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2200: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
2210: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64    assert( p->iAd
2220: 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70  dr<nOp );..    p
2230: 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41  Ret = &aOp[p->iA
2240: 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64  ddr];.    p->iAd
2250: 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d  dr++;.    if( p-
2260: 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20  >iAddr==nOp ){. 
2270: 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a       p->iSub++;.
2280: 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d        p->iAddr =
2290: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   0;.    }.  .   
22a0: 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70   if( pRet->p4typ
22b0: 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  e==P4_SUBPROGRAM
22c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
22d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31  yte = (p->nSub+1
22e0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
22f0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  ram*);.      int
2300: 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
2310: 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b  0; j<p->nSub; j+
2320: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
2330: 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65  p->apSub[j]==pRe
2340: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  t->p4.pProgram )
2350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2360: 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e        if( j==p->
2370: 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
2380: 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74  p->apSub = sqlit
2390: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
23a0: 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75  e(v->db, p->apSu
23b0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
23c0: 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62     if( !p->apSub
23d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52   ){.          pR
23e0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
23f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2400: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75   p->apSub[p->nSu
2410: 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e  b++] = pRet->p4.
2420: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20  pProgram;.      
2430: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2440: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
2450: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pRet;.}../*.** C
2460: 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67  heck if the prog
2470: 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ram stored in th
2480: 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20  e VM associated 
2490: 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a  with pParse may.
24a0: 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52  ** throw an ABOR
24b0: 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75  T exception (cau
24c0: 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  sing the stateme
24d0: 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69  nt, but not enti
24e0: 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  re transaction.*
24f0: 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  * to be rolled b
2500: 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69  ack). This condi
2510: 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20  tion is true if 
2520: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
2530: 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70   or any.** sub-p
2540: 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73  rograms contains
2550: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
2560: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  owing:.**.**   *
2570: 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50    OP_Halt with P
2580: 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  1=SQLITE_CONSTRA
2590: 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62  INT and P2=OE_Ab
25a0: 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  ort..**   *  OP_
25b0: 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20  HaltIfNull with 
25c0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
25d0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
25e0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
25f0: 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20  _Destroy.**   * 
2600: 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20   OP_VUpdate.**  
2610: 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a   *  OP_VRename.*
2620: 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e  *   *  OP_FkCoun
2630: 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28  ter with P2==0 (
2640: 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
2650: 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n key constraint
2660: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65  ).**.** Then che
2670: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
2680: 65 20 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62  e of Parse.mayAb
2690: 6f 72 74 20 69 73 20 74 72 75 65 20 69 66 20 61  ort is true if a
26a0: 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62  n.** ABORT may b
26b0: 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c  e thrown, or fal
26c0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65  se otherwise. Re
26d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74 20  turn true if it 
26e0: 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f  does.** match, o
26f0: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
2700: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
2710: 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20   is intended to 
2720: 62 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61  be used as.** pa
2730: 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20  rt of an assert 
2740: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65  statement in the
2750: 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c   compiler. Simil
2760: 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  ar to:.**.**   a
2770: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
2780: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2790: 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
27a0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
27b0: 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ) );.*/.int sqli
27c0: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79  te3VdbeAssertMay
27d0: 41 62 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69  Abort(Vdbe *v, i
27e0: 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20  nt mayAbort){.  
27f0: 69 6e 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30  int hasAbort = 0
2800: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56  ;.  Op *pOp;.  V
2810: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2820: 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72  .  memset(&sIter
2830: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2840: 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d  r));.  sIter.v =
2850: 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70   v;..  while( (p
2860: 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28  Op = opIterNext(
2870: 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20  &sIter))!=0 ){. 
2880: 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20     int opcode = 
2890: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pOp->opcode;.   
28a0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
28b0: 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64  Destroy || opcod
28c0: 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c  e==OP_VUpdate ||
28d0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e   opcode==OP_VRen
28e0: 61 6d 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ame .#ifndef SQL
28f0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
2900: 5f 4b 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70  _KEY.     || (op
2910: 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74  code==OP_FkCount
2920: 65 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30  er && pOp->p1==0
2930: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20   && pOp->p2==1) 
2940: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20  .#endif.     || 
2950: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ((opcode==OP_Hal
2960: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  t || opcode==OP_
2970: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20  HaltIfNull) .   
2980: 20 20 20 26 26 20 28 70 4f 70 2d 3e 70 31 3d 3d     && (pOp->p1==
2990: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
29a0: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
29b0: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
29c0: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
29d0: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
29e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
29f0: 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
2a00: 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a  , sIter.apSub);.
2a10: 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75  .  /* Return tru
2a20: 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d  e if hasAbort==m
2a30: 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61  ayAbort. Or if a
2a40: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2a50: 6f 63 63 75 72 65 64 2e 0a 20 20 2a 2a 20 49 66  occured..  ** If
2a60: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
2a70: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
2a80: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
2a90: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
2aa0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
2ab0: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
2ac0: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
2ad0: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
2ae0: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
2af0: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
2b00: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
2b10: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
2b20: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
2b30: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
2b40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
2b50: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2b60: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
2b70: 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e  ayAbort );.}.#en
2b80: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
2b90: 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65  BUG - the sqlite
2ba0: 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  3AssertMayAbort(
2bb0: 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f  ) function */../
2bc0: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
2bd0: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
2be0: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
2bf0: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
2c00: 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70  ative.** on jump
2c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20   instructions.  
2c20: 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 65 20  Each such value 
2c30: 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73  is a label.  Res
2c40: 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65  olve the.** labe
2c50: 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  l by setting the
2c60: 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73   P2 value to its
2c70: 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72   correct non-zer
2c80: 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54  o value..**.** T
2c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2ca0: 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72  alled once after
2cb0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
2cc0: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
2cd0: 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20  .**.** Variable 
2ce0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73  *pMaxFuncArgs is
2cf0: 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69   set to the maxi
2d00: 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79  mum value of any
2d10: 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a   P2 argument .**
2d20: 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69   to an OP_Functi
2d30: 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f  on, OP_AggStep o
2d40: 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63  r OP_VFilter opc
2d50: 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ode. This is use
2d60: 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33  d by .** sqlite3
2d70: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20  VdbeMakeReady() 
2d80: 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 62 65  to size the Vdbe
2d90: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a  .apArg[] array..
2da0: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66  **.** The Op.opf
2db0: 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 73 65  lags field is se
2dc0: 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73  t on all opcodes
2dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
2df0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
2e00: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
2e10: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
2e20: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
2e30: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
2e40: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
2e50: 3d 20 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  = p->aLabel;.  p
2e60: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
2e70: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
2e80: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
2e90: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
2ea0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
2eb0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
2ec0: 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20     pOp->opflags 
2ed0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  = sqlite3OpcodeP
2ee0: 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b  roperty[opcode];
2ef0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2f00: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
2f10: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
2f20: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
2f30: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
2f40: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
2f50: 70 2d 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65  p->p5;.    }else
2f60: 20 69 66 28 20 28 6f 70 63 6f 64 65 3d 3d 4f 50   if( (opcode==OP
2f70: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20  _Transaction && 
2f80: 70 4f 70 2d 3e 70 32 21 3d 30 29 20 7c 7c 20 6f  pOp->p2!=0) || o
2f90: 70 63 6f 64 65 3d 3d 4f 50 5f 56 61 63 75 75 6d  pcode==OP_Vacuum
2fa0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 65 61   ){.      p->rea
2fb0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66 6e 64  dOnly = 0;.#ifnd
2fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2fe0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2ff0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
3000: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
3010: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
3020: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
3030: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3040: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
3050: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
3060: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3070: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
3080: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
3090: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
30a0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
30b0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d       n = pOp[-1]
30c0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
30d0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
30e0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
30f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3100: 70 63 6f 64 65 3d 3d 4f 50 5f 4e 65 78 74 20 7c  pcode==OP_Next |
3110: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 6f 72  | opcode==OP_Sor
3120: 74 65 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  terNext ){.     
3130: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
3140: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
3150: 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 70 2d  Next;.      pOp-
3160: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
3170: 41 4e 43 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ANCE;.    }else 
3180: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50  if( opcode==OP_P
3190: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 4f 70  rev ){.      pOp
31a0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
31b0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
31c0: 69 6f 75 73 3b 0a 20 20 20 20 20 20 70 4f 70 2d  ious;.      pOp-
31d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
31e0: 41 4e 43 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ANCE;.    }..   
31f0: 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61   if( (pOp->opfla
3200: 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  gs & OPFLG_JUMP)
3210: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
3220: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3230: 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e  ( -1-pOp->p2<p->
3240: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20  nLabel );.      
3250: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
3260: 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20  [-1-pOp->p2];.  
3270: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
3280: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
3290: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d 3e  ->aLabel);.  p->
32a0: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a  aLabel = 0;..  *
32b0: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
32c0: 4d 61 78 41 72 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  MaxArgs;.}../*.*
32d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
32e0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
32f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3300: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
3310: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
3320: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
3330: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
3340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
3360: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
3370: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3380: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
3390: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
33a0: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
33b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
33c0: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
33d0: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
33e0: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
33f0: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
3400: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
3410: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
3420: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
3430: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
3440: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
3450: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
3460: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
3470: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
3480: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
3490: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
34a0: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
34b0: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
34c0: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
34d0: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
34e0: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
34f0: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
3500: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
3510: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3520: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
3530: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
3540: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
3550: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
3560: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
3570: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
3580: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
3590: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
35a0: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
35b0: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
35c0: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
35d0: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
35e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
35f0: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
3600: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
3610: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
3620: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
3630: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
3640: 62 74 72 65 65 4d 61 73 6b 3d 3d 30 20 29 3b 0a  btreeMask==0 );.
3650: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
3660: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b  es(p, pnMaxArg);
3670: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f  .  *pnOp = p->nO
3680: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b  p;.  p->aOp = 0;
3690: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d  .  return aOp;.}
36a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68  ../*.** Add a wh
36b0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72  ole list of oper
36c0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70  ations to the op
36d0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20  eration stack.  
36e0: 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64  Return the.** ad
36f0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3700: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64  st operation add
3710: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
3720: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
3730: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70  Vdbe *p, int nOp
3740: 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e  , VdbeOpList con
3750: 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20  st *aOp){.  int 
3760: 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20  addr;.  assert( 
3770: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3780: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3790: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
37a0: 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26  > p->nOpAlloc &&
37b0: 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20   growOpArray(p) 
37c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
37d0: 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d  .  }.  addr = p-
37e0: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c 57 41  >nOp;.  if( ALWA
37f0: 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20 20 20  YS(nOp>0) ){.   
3800: 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65   int i;.    Vdbe
3810: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49  OpList const *pI
3820: 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72  n = aOp;.    for
3830: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
3840: 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  , pIn++){.      
3850: 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32  int p2 = pIn->p2
3860: 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a  ;.      VdbeOp *
3870: 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69  pOut = &p->aOp[i
3880: 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f  +addr];.      pO
3890: 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e  ut->opcode = pIn
38a0: 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20  ->opcode;.      
38b0: 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e  pOut->p1 = pIn->
38c0: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32  p1;.      if( p2
38d0: 3c 30 20 26 26 20 28 73 71 6c 69 74 65 33 4f 70  <0 && (sqlite3Op
38e0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f 75  codeProperty[pOu
38f0: 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46  t->opcode] & OPF
3900: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 7b 0a 20  LG_JUMP)!=0 ){. 
3910: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
3920: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
3930: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3940: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
3950: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
3960: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
3970: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
3980: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
3990: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
39a0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
39b0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
39c0: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
39d0: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
39e0: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
39f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3a00: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
3a10: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
3a20: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
3a30: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
3a40: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
3a50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3a60: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
3a70: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
3a80: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
3a90: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
3aa0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
3ab0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
3ac0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
3ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ae0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
3af0: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
3b00: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
3b10: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
3b20: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
3b30: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
3b40: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
3b50: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
3b60: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
3b70: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
3b80: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3b90: 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  1(Vdbe *p, u32 a
3ba0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
3bb0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3bc0: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
3bd0: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
3be0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
3bf0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
3c00: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
3c10: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
3c20: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
3c30: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
3c40: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
3c50: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
3c60: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
3c70: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
3c80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3c90: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
3ca0: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
3cb0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
3cc0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28   p!=0 );.  if( (
3cd0: 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64  (u32)p->nOp)>add
3ce0: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  r ){.    p->aOp[
3cf0: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
3d00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3d10: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3d20: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
3d30: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3d40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
3d50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3d60: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
3d70: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
3d80: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
3d90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75  !=0 );.  if( ((u
3da0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20  32)p->nOp)>addr 
3db0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
3dc0: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
3dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3de0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3df0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
3e00: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
3e10: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
3e20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
3e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
3e40: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
3e50: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
3e60: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
3e70: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >aOp ){.    asse
3e80: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
3e90: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
3ea0: 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20  p-1].p5 = val;. 
3eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3ec0: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
3ed0: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
3ee0: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
3ef0: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
3f00: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
3f10: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
3f20: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
3f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3f40: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
3f50: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
3f60: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
3f70: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
3f80: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
3f90: 20 61 64 64 72 3e 3d 30 20 29 20 73 71 6c 69 74   addr>=0 ) sqlit
3fa0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
3fb0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
3fc0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
3fd0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
3fe0: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
3ff0: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
4000: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
4010: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
4020: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
4030: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
4040: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
4050: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
4070: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
4080: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
4090: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
40a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
40b0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
40c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40d0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
40e0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
40f0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4100: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
4110: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
4120: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
4130: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
4140: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73  ic void freeP4(s
4150: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
4160: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34  p4type, void *p4
4170: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20  ){.  if( p4 ){. 
4180: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b     assert( db );
4190: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
41a0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
41b0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
41c0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
41d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59        case P4_DY
41e0: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73  NAMIC:.      cas
41f0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20  e P4_KEYINFO:.  
4200: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
4210: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65  RRAY:.      case
4220: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
4230: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
4240: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4250: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72   p4);.        br
4260: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4270: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
4280: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  TF: {.        if
4290: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
42a0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f  ed==0 ) sqlite3_
42b0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20  free(p4);.      
42c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
42d0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56  .      case P4_V
42e0: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20  DBEFUNC: {.     
42f0: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64     VdbeFunc *pVd
4300: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75  beFunc = (VdbeFu
4310: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20  nc *)p4;.       
4320: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
4330: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65  nction(db, pVdbe
4340: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  Func->pFunc);.  
4350: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4360: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4370: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
4380: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
4390: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
43a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
43b0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
43c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
43d0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
43e0: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
43f0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
4400: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
4410: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
4420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4430: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4440: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
4450: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4460: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4480: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
4490: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
44a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
44b0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
44c0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
44d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
44e0: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
44f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
4500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4510: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
4520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4530: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4540: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
4550: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
4560: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
4570: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
4580: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
4590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
45a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
45b0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
45c0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
45d0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
45e0: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
45f0: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
4600: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
4610: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
4620: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
4630: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
4640: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
4650: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
4660: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
4670: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
4680: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
4690: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
46a0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
46b0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
46c0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
46d0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
46e0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
46f0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
4700: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
4710: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
4720: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4730: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
4740: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
4750: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4760: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d  Free(db, aOp);.}
4770: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65  ../*.** Link the
4780: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65   SubProgram obje
4790: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
47a0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
47b0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
47c0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65  .** list at Vdbe
47d0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68  .pSubProgram. Th
47e0: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20  is list is used 
47f0: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75  to delete all su
4800: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a  b-program.** obj
4810: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d  ects when the VM
4820: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65   is no longer re
4830: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  quired..*/.void 
4840: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53  sqlite3VdbeLinkS
4850: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a  ubProgram(Vdbe *
4860: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61  pVdbe, SubProgra
4870: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78  m *p){.  p->pNex
4880: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67  t = pVdbe->pProg
4890: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50  ram;.  pVdbe->pP
48a0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f  rogram = p;.}../
48b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
48c0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
48d0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
48e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
48f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
4900: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
4910: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
4920: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4930: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
4940: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
4950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
4960: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65  p->db;.    while
4970: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66  ( N-- ){.      f
4980: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
4990: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
49a0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
49b0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  pOp, 0, sizeof(p
49c0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70  Op[0]));.      p
49d0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
49e0: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b  Noop;.      pOp+
49f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  +;.    }.  }.}..
4a00: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4a10: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
4a20: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4a30: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4a40: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4a50: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4a60: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4a70: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
4a80: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
4a90: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
4aa0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
4ab0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
4ac0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
4ad0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
4ae0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
4af0: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
4b00: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
4b10: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
4b20: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
4b30: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
4b40: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
4b50: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4b60: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4b70: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
4b80: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
4b90: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
4ba0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
4bb0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
4bc0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
4bd0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
4be0: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a  ytes of zP4..**.
4bf0: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49  ** If n==P4_KEYI
4c00: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61  NFO it means tha
4c10: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74  t zP4 is a point
4c20: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  er to a KeyInfo 
4c30: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20  structure..** A 
4c40: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20  copy is made of 
4c50: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
4c60: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72  cture into memor
4c70: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
4c80: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
4c90: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77  c, to be freed w
4ca0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20  hen the Vdbe is 
4cb0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d  finalized..** n=
4cc0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44  =P4_KEYINFO_HAND
4cd0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68  OFF indicates th
4ce0: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f  at zP4 points to
4cf0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
4d00: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69  ture.** stored i
4d10: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68  n memory that th
4d20: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74  e caller has obt
4d30: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4d40: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a  e3_malloc. The .
4d50: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
4d60: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c   not free the al
4d70: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c  location, it wil
4d80: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  l be freed when 
4d90: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66  the Vdbe is.** f
4da0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a  inalized..** .**
4db0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
4dc0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
4dd0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
4de0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
4df0: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
4e00: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
4e10: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
4e20: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
4e30: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
4e40: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
4e50: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
4e60: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
4e70: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
4e80: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
4e90: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
4ea0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4eb0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
4ec0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
4ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4ee0: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
4ef0: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
4f00: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
4f10: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
4f20: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
4f30: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
4f40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
4f50: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4f60: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4f70: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d  ;.  if( p->aOp==
4f80: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
4f90: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
4fa0: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n!=P4_KEYINFO 
4fb0: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  && n!=P4_VTAB ) 
4fc0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
4fd0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
4fe0: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
4ff0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
5000: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5010: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
5020: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
5030: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5040: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
5050: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
5060: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
5070: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c  r];.  freeP4(db,
5080: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
5090: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
50a0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28  >p4.p = 0;.  if(
50b0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a   n==P4_INT32 ){.
50c0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69      /* Note: thi
50d0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20  s cast is safe, 
50e0: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
50f0: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61  in data point wa
5100: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20  s an int.    ** 
5110: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f  that was cast to
5120: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   a (const char *
5130: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70  ). */.    pOp->p
5140: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  4.i = SQLITE_PTR
5150: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20  _TO_INT(zP4);.  
5160: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5170: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73  P4_INT32;.  }els
5180: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a  e if( zP4==0 ){.
5190: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
51a0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  0;.    pOp->p4ty
51b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
51c0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d  .  }else if( n==
51d0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20  P4_KEYINFO ){.  
51e0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
51f0: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  nfo;.    int nFi
5200: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20  eld, nByte;..   
5210: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49   nField = ((KeyI
5220: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c  nfo*)zP4)->nFiel
5230: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73  d;.    nByte = s
5240: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29  izeof(*pKeyInfo)
5250: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69   + (nField-1)*si
5260: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  zeof(pKeyInfo->a
5270: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c  Coll[0]) + nFiel
5280: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  d;.    pKeyInfo 
5290: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
52a0: 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a  cRaw(0, nByte);.
52b0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79      pOp->p4.pKey
52c0: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
52d0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66  .    if( pKeyInf
52e0: 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  o ){.      u8 *a
52f0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
5300: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70   memcpy((char*)p
5310: 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42  KeyInfo, zP4, nB
5320: 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20  yte - nField);. 
5330: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20       aSortOrder 
5340: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  = pKeyInfo->aSor
5350: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66  tOrder;.      if
5360: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a  ( aSortOrder ){.
5370: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
5380: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
5390: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
53a0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
53b0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20  nField];.       
53c0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f   memcpy(pKeyInfo
53d0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53  ->aSortOrder, aS
53e0: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64  ortOrder, nField
53f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5400: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5410: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d  4_KEYINFO;.    }
5420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64  else{.      p->d
5430: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5440: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  = 1;.      pOp->
5450: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5460: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  SED;.    }.  }el
5470: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
5480: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a  INFO_HANDOFF ){.
5490: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
54a0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
54b0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
54c0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73  _KEYINFO;.  }els
54d0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42  e if( n==P4_VTAB
54e0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
54f0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5500: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5510: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73  = P4_VTAB;.    s
5520: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
5530: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20  VTable *)zP4);. 
5540: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61     assert( ((VTa
5550: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d  ble *)zP4)->db==
5560: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65  p->db );.  }else
5570: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
5580: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
5590: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
55a0: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
55b0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73  d char)n;.  }els
55c0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
55d0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ) n = sqlite3Str
55e0: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20  len30(zP4);.    
55f0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69  pOp->p4.z = sqli
5600: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
5610: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20  db, zP4, n);.   
5620: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
5630: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d  4_DYNAMIC;.  }.}
5640: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5650: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5660: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
5670: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5680: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
5690: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
56a0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
56b0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
56c0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
56d0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
56e0: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
56f0: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
5700: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
5710: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
5720: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
5730: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
5740: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5750: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
5760: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
5770: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
5780: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5790: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
57a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
57b0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
57c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
57d0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
57e0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57f0: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
5800: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5810: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5820: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
5830: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
5840: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
5850: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5860: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
5870: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5880: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a  b, *pz);.    *pz
5890: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
58a0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
58b0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
58c0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  nd(ap);.  }.}.vo
58d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f  id sqlite3VdbeNo
58e0: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  opComment(Vdbe *
58f0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
5900: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
5910: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
5920: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20  ( !p ) return;. 
5930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5940: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(p, OP_Noop);.
5950: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
5960: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
5970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5980: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
5990: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
59a0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
59b0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
59c0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
59d0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
59e0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
59f0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
5a00: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
5a10: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
5a20: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
5a30: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d   *pz);.    *pz =
5a40: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
5a50: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
5a60: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5a70: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
5a80: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
5a90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5aa0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
5ab0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
5ac0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
5ad0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
5ae0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
5af0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
5b00: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
5b10: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
5b20: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
5b30: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
5b40: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
5b50: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
5b60: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
5b70: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
5b80: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
5b90: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
5ba0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
5bb0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
5bc0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
5bd0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
5be0: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
5bf0: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
5c00: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
5c10: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
5c20: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
5c30: 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20  .** after a OOM 
5c40: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61  fault without ha
5c50: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f  ving to check to
5c60: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75   see if the retu
5c70: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73  rn from .** this
5c80: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61   routine is a va
5c90: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75  lid pointer.  Bu
5ca0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75  t because the du
5cb0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c  mmy.opcode is 0,
5cc0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e  .** dummy will n
5cd0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20  ever be written 
5ce0: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72  to.  This is ver
5cf0: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e  ified by code in
5d00: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20  spection and.** 
5d10: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20  by running with 
5d20: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20  Valgrind..**.** 
5d30: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66  About the #ifdef
5d40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5d50: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  CE:  Normally, t
5d60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
5d70: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75  ever called.** u
5d80: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20  nless p->nOp>0. 
5d90: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
5da0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20   in the absense 
5db0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  of SQLITE_OMIT_T
5dc0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54  RACE,.** an OP_T
5dd0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e  race instruction
5de0: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72   is always inser
5df0: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64  ted by sqlite3Vd
5e00: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20  beGet() as soon 
5e10: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45  as.** a new VDBE
5e20: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f   is created.  So
5e30: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20   we are free to 
5e40: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e  set addr to p->n
5e50: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20  Op-1 without.** 
5e60: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65  having to double
5e70: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73  -check to make s
5e80: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73  ure that the res
5e90: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  ult is non-negat
5ea0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53  ive. But.** if S
5eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5ec0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65   is defined, the
5ed0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69   OP_Trace is omi
5ee0: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e  tted and we do n
5ef0: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20  eed to.** check 
5f00: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e  the value of p->
5f10: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e  nOp-1 before con
5f20: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65  tinuing..*/.Vdbe
5f30: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
5f40: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
5f50: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
5f60: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
5f70: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
5f80: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
5f90: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
5fa0: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
5fb0: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
5fc0: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
5fd0: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
5fe0: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
5ff0: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70  tic const VdbeOp
6000: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f   dummy;  /* Igno
6010: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e  re the MSVC warn
6020: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69  ing about no ini
6030: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73  tializer */.  as
6040: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6050: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6060: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6070: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
6080: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20  _OMIT_TRACE.    
6090: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20  if( p->nOp==0 ) 
60a0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
60b0: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20  &dummy;.#endif. 
60c0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
60d0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
60e0: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
60f0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
6100: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
6110: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
6120: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6130: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
6140: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
6150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
6160: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
6170: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  ];.  }.}..#if !d
6180: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6190: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21  IT_EXPLAIN) || !
61a0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
61b0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65  \.     || define
61c0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
61d0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
61e0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43  E_DEBUG)./*.** C
61f0: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
6200: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
6210: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20  he P4 parameter 
6220: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a  for an opcode..*
6230: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20  * Use zTemp for 
6240: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d  any required tem
6250: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70  porary buffer sp
6260: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ace..*/.static c
6270: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f  har *displayP4(O
6280: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54  p *pOp, char *zT
6290: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b  emp, int nTemp){
62a0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a  .  char *zP4 = z
62b0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20  Temp;.  assert( 
62c0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
62d0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79  witch( pOp->p4ty
62e0: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  pe ){.    case P
62f0: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43  4_KEYINFO_STATIC
6300: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45  :.    case P4_KE
6310: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
6320: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
6330: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
6340: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
6350: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
6360: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6370: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e  p, zTemp, "keyin
6380: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  fo(%d", pKeyInfo
6390: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
63a0: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
63b0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
63c0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
63d0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
63e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
63f0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
6400: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
6410: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
6420: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
6430: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
6440: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d  3Strlen30(pColl-
6450: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
6460: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70     if( i+n>nTemp
6470: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
6480: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
6490: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20  i],",...",4);.  
64a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
64b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
64c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
64d0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20  ] = ',';.       
64e0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
64f0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70  >aSortOrder && p
6500: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6510: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6520: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6530: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6540: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6550: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6560: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6570: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6580: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
6590: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
65a0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
65b0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
65c0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
65d0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
65e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
65f0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6600: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6610: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6620: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6630: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6640: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6650: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6660: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6670: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
6680: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
6690: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
66a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
66b0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
66c0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
66d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
66e0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
66f0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6700: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6710: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6720: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6730: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6740: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6750: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6760: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6770: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6780: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
6790: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
67a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
67b0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
67c0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
67d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
67e0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
67f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6800: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6810: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6820: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6830: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6840: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6850: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6860: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6870: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
6880: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
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 4d 45 4d 3a      case P4_MEM:
68b0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
68c0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
68d0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
68e0: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20   (pMem->flags & 
68f0: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a  MEM_Null)==0 );.
6900: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
6910: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
6920: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
6930: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
6940: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
6950: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
6960: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6970: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6980: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22  p, zTemp, "%lld"
6990: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20  , pMem->u.i);.  
69a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
69b0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
69c0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Real ){.        
69d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
69e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
69f0: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29  %.16g", pMem->r)
6a00: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6a10: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6a20: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
6a30: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
6a40: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
6a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6a60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
6a70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6a80: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
6a90: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
6aa0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
6ab0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
6ac0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
6ad0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
6ae0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
6af0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
6b00: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
6b10: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
6b20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
6b40: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
6b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6b60: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6b70: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
6b80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6b90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6ba0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
6bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
6bc0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
6bd0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
6be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6bf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
6c00: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
6c10: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
6c20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6c30: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6c40: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
6c50: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
6c60: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
6c70: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
6c80: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
6c90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6ca0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6cb0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
6cc0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
6cd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
6ce0: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
6cf0: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
6d00: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
6d10: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  ] is used..**.**
6d20: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74   The prepared st
6d30: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f  atements need to
6d40: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65   know in advance
6d50: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65   the complete se
6d60: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64  t of.** attached
6d70: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
6d80: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 75 73 69  they will be usi
6d90: 6e 67 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  ng.  A mask of t
6da0: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
6db0: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
6dc0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20  in p->btreeMask 
6dd0: 61 6e 64 20 69 73 20 75 73 65 64 20 66 6f 72 20  and is used for 
6de0: 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65  locking and othe
6df0: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
6e00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
6e10: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
6e20: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
6e30: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
6e40: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
6e50: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
6e60: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
6e70: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
6e80: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
6e90: 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  );.  p->btreeMas
6ea0: 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31  k |= ((yDbMask)1
6eb0: 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31  )<<i;.  if( i!=1
6ec0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6ed0: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
6ee0: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
6ef0: 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c     p->lockMask |
6f00: 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
6f10: 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  i;.  }.}..#if !d
6f20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6f30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
6f40: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
6f50: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
6f60: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
6f70: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
6f80: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
6f90: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
6fa0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
6fb0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
6fc0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
6fd0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
6fe0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6ff0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
7000: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
7010: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
7020: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
7030: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
7040: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
7050: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
7060: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
7070: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
7080: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
7090: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
70a0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
70b0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
70c0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
70d0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
70e0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
70f0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
7100: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
7110: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
7120: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
7130: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
7140: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
7150: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
7160: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
7170: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
7180: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
7190: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
71a0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
71b0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
71c0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
71d0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
71e0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
71f0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7200: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
7210: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
7220: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
7230: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
7240: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
7250: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
7260: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
7270: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
7280: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
7290: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
72a0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
72b0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
72c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
72d0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
72e0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
72f0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
7300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7310: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
7320: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
7330: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
7340: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
7350: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
7360: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
7370: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
7380: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61   i;.  yDbMask ma
7390: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  sk;.  sqlite3 *d
73a0: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
73b0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70  int nDb;.  if( p
73c0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20  ->lockMask==0 ) 
73d0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
73e0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
73f0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
7400: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
7410: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20  nDb = db->nDb;. 
7420: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31   for(i=0, mask=1
7430: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61  ; i<nDb; i++, ma
7440: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20  sk += mask){.   
7450: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61   if( i!=1 && (ma
7460: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  sk & p->lockMask
7470: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61  )!=0 && ALWAYS(a
7480: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
7490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
74a0: 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e  reeEnter(aDb[i].
74b0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
74c0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
74d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
74e0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
74f0: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
7500: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e  DSAFE>0./*.** Un
7510: 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20  lock all of the 
7520: 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c  btrees previousl
7530: 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61  y locked by a ca
7540: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
7550: 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69  eEnter()..*/.voi
7560: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
7570: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
7580: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
7590: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
75a0: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
75b0: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
75c0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
75d0: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
75e0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
75f0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
7600: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7610: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7620: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7630: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
7640: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
7650: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
7660: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
7670: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
7680: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
7690: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
76a0: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
76b0: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
76c0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
76d0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
76e0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
76f0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
7700: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
7710: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
7720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
7730: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
7740: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
7750: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
7760: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
7770: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
7780: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
7790: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
77a0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
77b0: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
77c0: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
77d0: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
77e0: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
77f0: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
7800: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
7810: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
7820: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
7830: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
7840: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
7850: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
7860: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
7870: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
7880: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
7890: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
78a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
78b0: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
78c0: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
78d0: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
78e0: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
78f0: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
7900: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
7910: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
7920: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
7930: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
7940: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
7950: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
7960: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
7970: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
7980: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
7990: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
79a0: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
79b0: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
79c0: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
79d0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
79e0: 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  d ){.      for(p
79f0: 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e  End=&p[N]; p<pEn
7a00: 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; p++){.       
7a10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7a20: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7a30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
7a40: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
7a50: 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20  for(pEnd=&p[N]; 
7a60: 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20  p<pEnd; p++){.  
7a70: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
7a80: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
7a90: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
7aa0: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
7ab0: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
7ac0: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
7ad0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
7ae0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
7af0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
7b00: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
7b10: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
7b20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
7b30: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
7b40: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
7b50: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
7b60: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
7b70: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
7b80: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
7b90: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
7ba0: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
7bb0: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
7bc0: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
7bd0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
7be0: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
7bf0: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
7c00: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
7c10: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
7c20: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
7c30: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
7c40: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
7c50: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
7c60: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
7c70: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
7c80: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
7c90: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
7ca0: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
7cb0: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
7cc0: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
7cd0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
7ce0: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
7cf0: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
7d00: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
7d10: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
7d20: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
7d30: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
7d40: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
7d50: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
7d60: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
7d70: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7d80: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
7d90: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
7da0: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
7db0: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
7dc0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
7dd0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
7de0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c  else if( p->zMal
7df0: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
7e00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7e10: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
7e20: 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63        p->zMalloc
7e30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
7e40: 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20       p->flags = 
7e50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a  MEM_Null;.    }.
7e60: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7e70: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
7e80: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
7e90: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
7ea0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
7eb0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
7ec0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
7ed0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
7ee0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
7ef0: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
7f00: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
7f10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7f20: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
7f30: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
7f40: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
7f50: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
7f60: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
7f70: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
7f80: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
7f90: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
7fa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7fb0: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
7fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
7fd0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
7fe0: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
7ff0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
8000: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
8010: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
8020: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
8030: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
8040: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
8050: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
8060: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
8070: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
8080: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
8090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
80a0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
80b0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
80c0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
80d0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
80e0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
80f0: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
8100: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
8110: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
8120: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
8130: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
8140: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
8150: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
8160: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
8170: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
8180: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
8190: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
81a0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
81b0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
81c0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
81d0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
81e0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
81f0: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
8200: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
8210: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
8220: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
8230: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
8240: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
8250: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
8260: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
8270: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
8280: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
8290: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
82a0: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
82b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
82c0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
82e0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
82f0: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
8320: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
8330: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
8340: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8370: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
8380: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
8390: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
83a0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
83b0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
83c0: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
83d0: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
8400: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
8410: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
8420: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
8430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8440: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
8450: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8460: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8490: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
84a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
84d0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
84e0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
84f0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f   &p->aMem[1];  /
8500: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8510: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8520: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8530: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
8540: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
8550: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
8560: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
8570: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
8580: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
8590: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
85a0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
85b0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
85c0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
85d0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
85e0: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
85f0: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
8600: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8610: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8620: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8630: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
8640: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
8650: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
8660: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
8670: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
8680: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
8690: 38 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  8);..  if( p->rc
86a0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
86b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
86c0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
86d0: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
86e0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
86f0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
8700: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
8710: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
8720: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
8730: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
8740: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
8750: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
8760: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
8770: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
8780: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
8790: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
87a0: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
87b0: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
87c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
87d0: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
87e0: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
87f0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
8800: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
8810: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
8820: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
8830: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
8840: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
8850: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
8860: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
8870: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
8880: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
8890: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
88a0: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
88b0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
88c0: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
88d0: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
88e0: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
88f0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
8900: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
8910: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
8920: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
8930: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
8940: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
8950: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
8960: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
8970: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
8980: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
8990: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
89a0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
89b0: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
89c0: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
89d0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
89e0: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
89f0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
8a00: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
8a10: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
8a20: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
8a30: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
8a40: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
8a50: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
8a60: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
8a70: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
8a80: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
8a90: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
8aa0: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
8ab0: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
8ac0: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
8ad0: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
8ae0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
8af0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
8b00: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
8b10: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
8b20: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
8b30: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
8b40: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
8b50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8b60: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
8b70: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
8b80: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
8b90: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
8ba0: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
8bb0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
8bc0: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
8bd0: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
8be0: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
8bf0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
8c00: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
8c10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8c20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
8c30: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
8c40: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
8c50: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
8c60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
8c70: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
8c80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8c90: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
8ca0: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
8cb0: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
8cc0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
8cd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
8ce0: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
8cf0: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
8d00: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
8d10: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
8d20: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
8d30: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
8d40: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
8d50: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
8d60: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
8d70: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
8d80: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
8d90: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
8da0: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
8db0: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
8dc0: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
8dd0: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
8de0: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
8df0: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
8e00: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
8e10: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
8e20: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
8e30: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
8e40: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
8e50: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
8e60: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
8e70: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
8e80: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
8e90: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
8ea0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
8eb0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8ec0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
8ed0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
8ee0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
8ef0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
8f30: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
8f40: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
8f50: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
8f60: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
8f70: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
8f80: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
8f90: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8fa0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20  (pOp->opcode);  
8fb0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
8fc0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
8fd0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
8fe0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
8ff0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
9000: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
9010: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9020: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
9030: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
9040: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
9050: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
9060: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
9070: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
9080: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
9090: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
90a0: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
90b0: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
90c0: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
90d0: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
90e0: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
90f0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
9100: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
9110: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
9120: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
9130: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
9140: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
9150: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
9160: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
9170: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
9180: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
9190: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
91a0: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
91b0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
91c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
91d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
91e0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
91f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
9200: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
9210: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
9220: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
9230: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
9240: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
9250: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
9260: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31  w(pSub, nByte, 1
9270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
9280: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
9290: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
92a0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
92b0: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
92c0: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
92d0: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
92e0: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
92f0: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
9300: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
9310: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
9320: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9330: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
9340: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
9350: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
9360: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
9390: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
93a0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
93b0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
93c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
93d0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
93e0: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
9410: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
9420: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
9430: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
9440: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
9450: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
9460: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
9490: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
94a0: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
94b0: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
94c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
94d0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
94e0: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
94f0: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
9500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
9510: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9520: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
9530: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9540: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
9550: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
9560: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
9570: 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61  ;.    z = displa
9580: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
9590: 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a  , 32);.    if( z
95a0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
95b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
95c0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c  mSetStr(pMem, z,
95d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
95e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
95f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9600: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
9610: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
9620: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
9630: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
9640: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
9650: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
9660: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
9670: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d  ITE_TEXT;.    pM
9680: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
9690: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
96a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
96b0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
96c0: 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20  m, 4, 0) ){.    
96d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
96e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
96f0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
9700: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
9710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
9720: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9730: 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  Dyn|MEM_Str|MEM_
9740: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
9750: 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  ->n = 2;.      s
9760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9770: 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32  3, pMem->z, "%.2
9780: 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20  x", pOp->p5);   
9790: 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70  /* P5 */.      p
97a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
97b0: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70  TE_TEXT;.      p
97c0: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
97d0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
97e0: 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20  em++;.  .#ifdef 
97f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
9800: 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d     if( pOp->zCom
9810: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
9820: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9830: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
9840: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20          pMem->z 
9850: 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b  = pOp->zComment;
9860: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  .        pMem->n
9870: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
9880: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
9890: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
98a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
98b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
98c0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
98d0: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
98e0: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
98f0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
9900: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
9930: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
9940: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
9950: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9960: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
9970: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
9980: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
9990: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
99a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
99b0: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
99c0: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
99d0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
99e0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
99f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
9a00: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
9a10: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
9a20: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
9a30: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
9a40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9a50: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
9a60: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
9a70: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
9a80: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
9a90: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9aa0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9ab0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9ac0: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9ad0: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9ae0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9af0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
9b00: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
9b10: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
9b20: 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53  +;.    printf("S
9b30: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
9b40: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
9b50: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9b60: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
9b70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
9b80: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
9b90: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
9ba0: 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20  IOTRACE message 
9bb0: 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74  showing SQL cont
9bc0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9bd0: 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53  ite3VdbeIOTraceS
9be0: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ql(Vdbe *p){.  i
9bf0: 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b  nt nOp = p->nOp;
9c00: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
9c10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54    if( sqlite3IoT
9c20: 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  race==0 ) return
9c30: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
9c40: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
9c50: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9c60: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9c70: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9c80: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
9c90: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
9ca0: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
9cb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9cc0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
9cd0: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
9ce0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
9cf0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9d00: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
9d10: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
9d20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9d30: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
9d40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
9d50: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
9d60: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
9d70: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
9d80: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9d90: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
9da0: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
9db0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
9dc0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
9dd0: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
9de0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9df0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
9e00: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
9e10: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
9e20: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
9e30: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
9e40: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
9e50: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
9e60: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
9e70: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
9e80: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9e90: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
9ea0: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
9eb0: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
9ec0: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
9ed0: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
9ee0: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
9ef0: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
9f00: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
9f10: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
9f20: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
9f30: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
9f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
9f50: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
9f60: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
9f70: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
9f80: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
9f90: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
9fa0: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
9fb0: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
9fc0: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
9fd0: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
9fe0: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
9ff0: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
a000: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
a010: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
a020: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
a030: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
a040: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
a050: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f  ppFrom points to
a060: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
a070: 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73   and pEnd points
a080: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
a090: 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  he.** available 
a0a0: 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61  space.  When spa
a0b0: 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c  ce is allocated,
a0c0: 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61   *ppFrom is adva
a0d0: 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65  nced past.** the
a0e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f   end of the allo
a0f0: 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a  cated space..**.
a100: 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20  ** *pnByte is a 
a110: 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e  counter of the n
a120: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
a130: 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76  f space that hav
a140: 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61  e failed.** to a
a150: 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65  llocate.  If the
a160: 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65  re is insufficie
a170: 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46  nt space in *ppF
a180: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
a190: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
a1a0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
a1b0: 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f  nByte by the amo
a1c0: 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65  unt of the reque
a1d0: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
a1e0: 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a  id *allocSpace(.
a1f0: 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
a200: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
a210: 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77  return pointer w
a220: 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f  ill be stored */
a230: 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
a240: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a250: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c  r of bytes to al
a260: 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a  locate */.  u8 *
a270: 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  *ppFrom,        
a280: 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f   /* IN/OUT: Allo
a290: 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f  cate from *ppFro
a2a0: 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c  m */.  u8 *pEnd,
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a2c0: 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65  ointer to 1 byte
a2d0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a2e0: 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20   *ppFrom buffer 
a2f0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65  */.  int *pnByte
a300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
a310: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
a320: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
a330: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
a340: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
a350: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
a360: 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20  T(*ppFrom) );.  
a370: 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75 72  if( pBuf ) retur
a380: 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20  n pBuf;.  nByte 
a390: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
a3a0: 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d  .  if( &(*ppFrom
a3b0: 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64  )[nByte] <= pEnd
a3c0: 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28   ){.    pBuf = (
a3d0: 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20  void*)*ppFrom;. 
a3e0: 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42     *ppFrom += nB
a3f0: 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  yte;.  }else{.  
a400: 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79    *pnByte += nBy
a410: 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
a420: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
a430: 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20  Rewind the VDBE 
a440: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
a450: 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61  nning in prepara
a460: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e  tion for.** runn
a470: 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ing it..*/.void 
a480: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
a490: 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  d(Vdbe *p){.#if 
a4a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
a4b0: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
a4c0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
a4d0: 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20   int i;.#endif. 
a4e0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
a4f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
a500: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a510: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
a520: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
a530: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
a540: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
a550: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
a560: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
a570: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
a580: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
a590: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
a5a0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
a5b0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
a5c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a5d0: 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  UG.  for(i=1; i<
a5e0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
a5f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
a600: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
a610: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
a620: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
a630: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
a640: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
a650: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
a660: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
a670: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
a680: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
a690: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
a6a0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
a6b0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
a6c0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
a6d0: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
a6e0: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
a6f0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
a700: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a710: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
a720: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
a730: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
a740: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
a750: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
a760: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
a770: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
a780: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
a790: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
a7a0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
a7b0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
a7c0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
a7d0: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
a7e0: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74  as allocating st
a7f0: 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e  ack space and in
a800: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
a810: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
a820: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
a830: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
a840: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
a850: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
a860: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
a870: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a880: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
a890: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
a8a0: 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63  called exact onc
a8b0: 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74  e on a each virt
a8c0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
a8d0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
a8e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
a8f0: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
a900: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
a910: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
a920: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
a930: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
a940: 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a  uther calls to .
a950: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
a960: 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  dOp() functions 
a970: 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20  are prohibited. 
a980: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69   This routine di
a990: 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65  sconnects.** the
a9a0: 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50   Vdbe from the P
a9b0: 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74  arse object that
a9c0: 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65   helped generate
a9d0: 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a   it so that the.
a9e0: 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f  ** the Vdbe beco
a9f0: 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65  mes an independe
aa00: 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68  nt entity and th
aa10: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63  e Parse object c
aa20: 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79  an be.** destroy
aa30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  ed..**.** Use th
aa40: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  e sqlite3VdbeRew
aa50: 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20  ind() procedure 
aa60: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72  to restore a vir
aa70: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63  tual machine bac
aa80: 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74  k.** to its init
aa90: 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20  ial state after 
aaa0: 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e  it has been run.
aab0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
aac0: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
aad0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
ab00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20   Parse *pParse  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ab30: 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  xt */.){.  sqlit
ab40: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
ab50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ab60: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ab70: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56  tion */.  int nV
ab80: 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ar;             
ab90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aba0: 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73  er of parameters
abb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20   */.  int nMem; 
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
abe0: 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69  f VM memory regi
abf0: 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  sters */.  int n
ac00: 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20  Cursor;         
ac10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ac20: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72  ber of cursors r
ac30: 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
ac40: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac60: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ac70: 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d  ts in subprogram
ac80: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
ac90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aca0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
acb0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a  unter */.  u8 *z
acc0: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ace0: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
acf0: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
ad00: 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20    u8 *zEnd;     
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
ad30: 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  ast allocated me
ad40: 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  mory */.  int nB
ad50: 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
ad60: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
ad70: 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72  much extra memor
ad80: 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a  y is needed */..
ad90: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
ada0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
adb0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
adc0: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
add0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
ade0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
adf0: 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  IT );.  db = p->
ae00: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
ae10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
ae20: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
ae30: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
ae40: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
ae50: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
ae60: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
ae70: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
ae80: 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46  axArg;.  .  /* F
ae90: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
aea0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
aeb0: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
aec0: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
aed0: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
aee0: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
aef0: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
af00: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
af10: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
af20: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
af30: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
af40: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
af50: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
af60: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
af70: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
af80: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
af90: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
afa0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
afb0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
afc0: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
afd0: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
afe0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
aff0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
b000: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
b010: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
b020: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
b030: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
b040: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
b050: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
b060: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
b070: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
b080: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
b090: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
b0a0: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
b0b0: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
b0c0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
b0d0: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
b0e0: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
b0f0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
b100: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
b110: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
b120: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e  ocation */.  zEn
b130: 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70  d = (u8*)&p->aOp
b140: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  [p->nOpAlloc];  
b150: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
b160: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
b170: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
b180: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
b190: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
b1a0: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
b1b0: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
b1c0: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
b1d0: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
b1e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
b1f0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
b200: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
b210: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
b220: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
b230: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
b240: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
b250: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
b260: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
b270: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
b280: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
b290: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
b2a0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
b2b0: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
b2c0: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
b2d0: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
b2e0: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
b2f0: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
b300: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
b310: 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20  he .  ** end of 
b320: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
b330: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
b340: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
b350: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72  ll memory.  ** r
b360: 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72  equirements by r
b370: 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64  eusing the opcod
b380: 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68  e array tail, th
b390: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  en the second.  
b3a0: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
b3b0: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
b3c0: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
b3d0: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
b3e0: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
b3f0: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
b400: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
b410: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
b420: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
b430: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
b440: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b450: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
b460: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
b470: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
b480: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
b490: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
b4a0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
b4b0: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e   */.  do {.    n
b4c0: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Byte = 0;.    p-
b4d0: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
b4e0: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
b4f0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
b500: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b510: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  e);.    p->aVar 
b520: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b530: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
b540: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
b550: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b560: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
b570: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
b580: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
b590: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
b5a0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b5b0: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
b5c0: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
b5d0: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
b5e0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b5f0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b600: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
b610: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
b620: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
b630: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c      &zCsr, zEnd,
b660: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66   &nByte);.    if
b670: 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  ( nByte ){.     
b680: 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
b690: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
b6a0: 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
b6b0: 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e  }.    zCsr = p->
b6c0: 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20  pFree;.    zEnd 
b6d0: 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a  = &zCsr[nByte];.
b6e0: 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20    }while( nByte 
b6f0: 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
b700: 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43  iled );..  p->nC
b710: 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43 75  ursor = (u16)nCu
b720: 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 2d 3e 61  rsor;.  if( p->a
b730: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
b740: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
b750: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
b760: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
b770: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
b780: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
b790: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
b7a0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
b7b0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56    }.  if( p->azV
b7c0: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  ar ){.    p->nzV
b7d0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
b7e0: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
b7f0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
b800: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
b810: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
b820: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
b830: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
b840: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
b850: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
b860: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
b870: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
b880: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
b8b0: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
b8c0: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
b8d0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
b8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
b8f0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
b900: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
b910: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
b920: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
b930: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
b940: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
b950: 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aMem[n].db = db;
b960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
b970: 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65  explain = pParse
b980: 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c  ->explain;.  sql
b990: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70  ite3VdbeRewind(p
b9a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
b9b0: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
b9c0: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
b9d0: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
b9e0: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
b9f0: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
ba00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ba10: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
ba20: 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72  e *p, VdbeCursor
ba30: 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43   *pCx){.  if( pC
ba40: 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  x==0 ){.    retu
ba50: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
ba60: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
ba70: 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
ba80: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
ba90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
baa0: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
bab0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d  .    /* The pCx-
bac0: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
bad0: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
bae0: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
baf0: 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ts, by.    ** th
bb00: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
bb10: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78  .  }else if( pCx
bb20: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
bb30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
bb40: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
bb50: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
bb60: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bb70: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
bb80: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
bb90: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
bba0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
bbb0: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
bbc0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
bbd0: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
bbe0: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
bbf0: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
bc00: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
bc10: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
bc20: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
bc30: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
bc40: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
bc50: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
bc60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
bc70: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
bc80: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
bc90: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
bca0: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
bcb0: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
bcc0: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
bcd0: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
bce0: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
bcf0: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
bd00: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
bd10: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
bd20: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
bd30: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
bd40: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
bd50: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
bd60: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61  .  v->aOp = pFra
bd70: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f  me->aOp;.  v->nO
bd80: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b  p = pFrame->nOp;
bd90: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72  .  v->aMem = pFr
bda0: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e  ame->aMem;.  v->
bdb0: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  nMem = pFrame->n
bdc0: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20  Mem;.  v->apCsr 
bdd0: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b  = pFrame->apCsr;
bde0: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  v->nCursor = 
bdf0: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b  pFrame->nCursor;
be00: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f  .  v->db->lastRo
be10: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61  wid = pFrame->la
be20: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43  stRowid;.  v->nC
be30: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
be40: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  nChange;.  retur
be50: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
be60: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
be70: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
be80: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
be90: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
bea0: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
beb0: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
bec0: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
bed0: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
bee0: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
bef0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
bf00: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
bf10: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
bf20: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
bf30: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
bf40: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
bf50: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
bf60: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
bf70: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
bf80: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
bf90: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
bfa0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
bfb0: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
bfc0: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
bfd0: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
bfe0: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
bff0: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
c000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
c010: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
c020: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61  );.  }.  p->pFra
c030: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72  me = 0;.  p->nFr
c040: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
c050: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20  p->apCsr ){.    
c060: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
c070: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72  =0; i<p->nCursor
c080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64  ; i++){.      Vd
c090: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70  beCursor *pC = p
c0a0: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20  ->apCsr[i];.    
c0b0: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20    if( pC ){.    
c0c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
c0d0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29  reeCursor(p, pC)
c0e0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43  ;.        p->apC
c0f0: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  sr[i] = 0;.     
c100: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
c110: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
c120: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
c130: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
c140: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77  ->nMem);.  }.  w
c150: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61  hile( p->pDelFra
c160: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
c170: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70  ame *pDel = p->p
c180: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d  DelFrame;.    p-
c190: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65  >pDelFrame = pDe
c1a0: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20  l->pParent;.    
c1b0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
c1c0: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20  Delete(pDel);.  
c1d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  }.}../*.** Clean
c1e0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
c1f0: 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a   execution..**.*
c200: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
c210: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
c220: 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73  y close any curs
c230: 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f  ors, lists, and/
c240: 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68  or.** sorters th
c250: 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65  at were left ope
c260: 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65  n.  It also dele
c270: 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  tes the values o
c280: 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69  f.** variables i
c290: 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72  n the aVar[] arr
c2a0: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
c2b0: 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20  id Cleanup(Vdbe 
c2c0: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
c2d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66  db = p->db;..#if
c2e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c2f0: 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73  .  /* Execute as
c300: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
c310: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
c320: 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b   the Vdbe.apCsr[
c330: 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65  ] and .  ** Vdbe
c340: 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68  .aMem[] arrays h
c350: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c360: 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f   cleaned up.  */
c370: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
c380: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
c390: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
c3a0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 7c 7c 20 70  p->apCsr==0 || p
c3b0: 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b  ->apCsr[i]==0 );
c3c0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70  .  for(i=1; i<=p
c3d0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
c3e0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20  ert( p->aMem==0 
c3f0: 7c 7c 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  || p->aMem[i].fl
c400: 61 67 73 3d 3d 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  ags==MEM_Null );
c410: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
c420: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
c430: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
c440: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
c450: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
c460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c470: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
c480: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
c490: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
c4a0: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
c4b0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
c4c0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
c4d0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
c4e0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
c4f0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
c500: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
c510: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
c520: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
c530: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
c540: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
c550: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
c560: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
c570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
c580: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
c590: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
c5a0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
c5b0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
c5c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
c5d0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
c5e0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
c5f0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
c600: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
c610: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c620: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
c630: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
c640: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
c650: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
c660: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
c670: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
c680: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
c690: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c6a0: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
c6b0: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
c6c0: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
c6d0: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
c6e0: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
c6f0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
c700: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
c710: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
c720: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
c730: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
c740: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
c750: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
c760: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
c770: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
c780: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
c790: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
c7a0: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
c7b0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
c7c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
c7d0: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
c7e0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
c7f0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
c800: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
c810: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
c820: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
c830: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
c840: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
c850: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
c860: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
c870: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
c880: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
c890: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
c8a0: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
c8b0: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
c8c0: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
c8d0: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
c8e0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
c8f0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
c900: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
c910: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
c920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
c930: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
c940: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
c950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
c960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c970: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
c980: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
c990: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9b0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
c9c0: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
c9d0: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
c9e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
ca00: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
ca10: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
ca20: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
ca30: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
ca40: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
ca50: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
ca60: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
ca70: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
ca80: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
ca90: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
caa0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
cab0: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
cac0: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
cad0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
cae0: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
caf0: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
cb00: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
cb10: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
cb20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cb30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
cb40: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
cb50: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
cb60: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
cb70: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
cb80: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
cb90: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
cba0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
cbb0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
cbc0: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
cbd0: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
cbe0: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
cbf0: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
cc00: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
cc10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
cc20: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
cc30: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
cc40: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
cc50: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
cc60: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
cc70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
cc80: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
cc90: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
cca0: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
ccb0: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
ccc0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
ccd0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
cce0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
ccf0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
cd00: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
cd10: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
cd20: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
cd30: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
cd40: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
cd50: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
cd60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
cd70: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
cd80: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
cd90: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
cda0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cdb0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
cdc0: 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  mit = 0;..#ifdef
cdd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
cde0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57  TUALTABLE.  /* W
cdf0: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c  ith this option,
ce00: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
ce10: 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  () is defined to
ce20: 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a   be simply .  **
ce30: 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20   SQLITE_OK so p 
ce40: 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20  is not used. .  
ce50: 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
ce60: 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66  METER(p);.#endif
ce70: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
ce80: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
ce90: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
cea0: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
ceb0: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
cec0: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
ced0: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
cee0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
cef0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
cf00: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
cf10: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
cf20: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cf30: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
cf40: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
cf50: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
cf60: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
cf70: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
cf80: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
cf90: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
cfa0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
cfb0: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
cfc0: 73 67 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  sg);..  /* This 
cfd0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
cfe0: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
cff0: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
d000: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
d010: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
d020: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
d030: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
d040: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
d050: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
d060: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
d070: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
d080: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
d090: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
d0a0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
d0b0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
d0c0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
d0d0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
d0e0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
d0f0: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
d100: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
d110: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
d120: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
d130: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
d140: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
d150: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d160: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
d170: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
d180: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65  pBt) ){.      ne
d190: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  edXcommit = 1;. 
d1a0: 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20       if( i!=1 ) 
d1b0: 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  nTrans++;.      
d1c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
d1d0: 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73  rExclusiveLock(s
d1e0: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
d1f0: 28 70 42 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  (pBt));.    }.  
d200: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
d210: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
d220: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
d230: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
d240: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
d250: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
d260: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
d270: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
d280: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
d290: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
d2a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d   ){.    rc = db-
d2b0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
d2c0: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
d2d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
d2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
d2f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
d300: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
d310: 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20  The simple case 
d320: 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  - no more than o
d330: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
d340: 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74   (not counting t
d350: 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74  he.  ** TEMP dat
d360: 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61  abase) has a tra
d370: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
d380: 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e     There is no n
d390: 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  eed for the.  **
d3a0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e   master-journal.
d3b0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
d3c0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
d3d0: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  f sqlite3BtreeGe
d3e0: 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61  tFilename() is a
d3f0: 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a   zero length.  *
d400: 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61  * string, it mea
d410: 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ns the main data
d420: 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a  base is :memory:
d430: 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e   or a temp file.
d440: 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20    In .  ** that 
d450: 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73  case we do not s
d460: 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75  upport atomic mu
d470: 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73  lti-file commits
d480: 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20  , so use the .  
d490: 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74  ** simple case t
d4a0: 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  hen too..  */.  
d4b0: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
d4c0: 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74  rlen30(sqlite3Bt
d4d0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
d4e0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a  b->aDb[0].pBt)).
d4f0: 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a     || nTrans<=1.
d500: 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30    ){.    for(i=0
d510: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
d520: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
d530: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
d540: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
d550: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
d560: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
d570: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
d580: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d590: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
d5a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d5b0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c  o the commit onl
d5c0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73  y if all databas
d5d0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  es successfully 
d5e0: 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31  complete phase 1
d5f0: 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65  . .    ** If one
d600: 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d   of the BtreeCom
d610: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61  mitPhaseOne() ca
d620: 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20  lls fails, this 
d630: 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20  indicates an.   
d640: 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69   ** IO error whi
d650: 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  le deleting or t
d660: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
d670: 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20  nal file. It is 
d680: 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a  unlikely,.    **
d690: 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65   but could happe
d6a0: 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  n. In this case 
d6b0: 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69  abandon processi
d6c0: 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ng and return th
d6d0: 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  e error..    */.
d6e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
d6f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
d700: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
d710: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
d720: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
d730: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
d740: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
d750: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
d760: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
d770: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d780: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
d790: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d7a0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
d7b0: 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  it(db);.    }.  
d7c0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70  }..  /* The comp
d7d0: 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65  lex case - There
d7e0: 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   is a multi-file
d7f0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
d800: 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20  on active..  ** 
d810: 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20  This requires a 
d820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d830: 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ile to ensure th
d840: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
d850: 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20  .  ** committed 
d860: 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23  atomicly..  */.#
d870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d880: 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
d890: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
d8a0: 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
d8b0: 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  fs;.    int need
d8c0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68  Sync = 0;.    ch
d8d0: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
d8e0: 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20     /* File-name 
d8f0: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a  for the master j
d900: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68  ournal */.    ch
d910: 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46  ar const *zMainF
d920: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
d930: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
d940: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
d950: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
d960: 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  *pMaster = 0;.  
d970: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
d980: 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a  ;.    int res;..
d990: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
d9a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d9b0: 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
d9c0: 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
d9d0: 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  Random;.      sq
d9e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d9f0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
da00: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
da10: 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
da20: 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
da30: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
da40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
da50: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
da60: 4d 61 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f  MainFile, iRando
da70: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
da80: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
da90: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
daa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
dab0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
dac0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
dad0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d  x3(zMainFile, zM
dae0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63  aster);.      rc
daf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
db00: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
db10: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
db20: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
db30: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
db40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
db50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
db60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
db70: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
db80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
db90: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dba0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
dbb0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
dbc0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
dbd0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
dbe0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
dbf0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
dc00: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
dc10: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
dc20: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
dc30: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
dc40: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
dc50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dc60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
dc70: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
dc80: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
dc90: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
dca0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
dcb0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
dcc0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
dcd0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
dce0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
dcf0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
dd00: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
dd10: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
dd20: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
dd30: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
dd40: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
dd50: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
dd60: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
dd70: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
dd80: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
dd90: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
dda0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
ddb0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
ddc0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
ddd0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
dde0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
ddf0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
de00: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
de10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
de20: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
de30: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
de40: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
de50: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
de60: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
de70: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73  const *zFile = s
de80: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f  qlite3BtreeGetJo
de90: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a  urnalname(pBt);.
dea0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
deb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
dec0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
ded0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20  Ignore TEMP and 
dee0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
def0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  es */.        }.
df00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
df10: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20  zFile[0]!=0 );. 
df20: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64         if( !need
df30: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33  Sync && !sqlite3
df40: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
df50: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  d(pBt) ){.      
df60: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
df70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
df80: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
df90: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
dfa0: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
dfb0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
dfc0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
dfd0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
dfe0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
dff0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
e000: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e020: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
e030: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
e040: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
e050: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e060: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
e070: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
e080: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
e090: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
e0a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
e0b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
e0c0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
e0d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e0e0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
e0f0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
e100: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
e110: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
e120: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
e130: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
e140: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71   .     && 0==(sq
e150: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
e160: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
e170: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
e180: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20  AP_SEQUENTIAL). 
e190: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b      && SQLITE_OK
e1a0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  !=(rc = sqlite3O
e1b0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53  sSync(pMaster, S
e1c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
e1d0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  L)).    ){.     
e1e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
e1f0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
e210: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
e220: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
e230: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e240: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e250: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e260: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
e270: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
e280: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
e290: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
e2a0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
e2b0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
e2c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
e2d0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
e2e0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
e2f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
e300: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
e310: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
e320: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e330: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
e340: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
e350: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
e360: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
e370: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
e380: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
e390: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
e3a0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
e3b0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
e3c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
e3d0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
e3e0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
e3f0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
e400: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
e410: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
e420: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
e430: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e440: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
e450: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
e460: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a   occurred..    *
e470: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
e480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e490: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e4a0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
e4b0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e4c0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e4d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e4e0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e4f0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e500: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  t, zMaster);.   
e510: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
e520: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e530: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e540: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e550: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69  TE_BUSY );.    i
e560: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e570: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e580: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
e590: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
e5a0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
e5b0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
e5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e5d0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
e5e0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
e5f0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
e600: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
e610: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
e620: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
e630: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
e640: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
e650: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
e660: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
e670: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
e680: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
e690: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
e6a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
e6b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
e6c0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
e6d0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e6e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
e6f0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
e700: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
e710: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
e720: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
e730: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
e740: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
e750: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
e760: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
e770: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
e780: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
e790: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
e7a0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
e7b0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
e7c0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
e7d0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
e7e0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
e7f0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
e800: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
e810: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
e820: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
e830: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
e840: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
e850: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
e860: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
e870: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
e880: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
e890: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
e8a0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
e8b0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
e8c0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
e8d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
e8e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
e8f0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
e900: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
e910: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e920: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e930: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e940: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e950: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
e960: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 1);.      }. 
e970: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
e980: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
e990: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
e9a0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
e9b0: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
e9c0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
e9d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
e9e0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
e9f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ea00: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
ea10: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
ea20: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
ea30: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
ea40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
ea50: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
ea60: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
ea70: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
ea80: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
ea90: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
eaa0: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
eab0: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
eac0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
ead0: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
eae0: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
eaf0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
eb00: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
eb10: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
eb20: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
eb30: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
eb40: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
eb50: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
eb60: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
eb70: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
eb80: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
eb90: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
eba0: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20  nWrite = 0;.  p 
ebb0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
ebc0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
ebd0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
ebe0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
ebf0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
ec00: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
ec10: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
ec20: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
ec30: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
ec40: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
ec50: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
ec60: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61  veVdbeCnt );.  a
ec70: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
ec80: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
ec90: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
eca0: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
ecb0: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
ecc0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ./*.** For every
ecd0: 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64   Btree that in d
ece0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ecf0: 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20  on db which .** 
ed00: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
ed10: 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76  d, "trip" or inv
ed20: 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72  alidate each cur
ed30: 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42  sor in.** that B
ed40: 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20  tree might have 
ed50: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
ed60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
ed70: 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65  .** can never be
ed80: 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68   used again.  Th
ed90: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
eda0: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f  a rollback.*** o
edb0: 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20  ccurs.  We have 
edc0: 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20  to trip all the 
edd0: 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65  other cursors, e
ede0: 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72  ven.** cursor fr
edf0: 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20  om other VMs in 
ee00: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
ee10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a  se connections,.
ee20: 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20  ** so that none 
ee30: 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75  of them try to u
ee40: 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77  se the data at w
ee50: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72  hich they.** wer
ee60: 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77  e pointing and w
ee70: 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76  hich now may hav
ee80: 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64  e been changed d
ee90: 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c  ue.** to the rol
eea0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  lback..**.** Rem
eeb0: 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c  ember that a rol
eec0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65  lback can delete
eed0: 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65   tables complete
eee0: 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20   and.** reorder 
eef0: 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69  rootpages.  So i
ef00: 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
ef10: 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65  ent just to save
ef20: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66  .** the state of
ef30: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65   the cursor.  We
ef40: 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64   have to invalid
ef50: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ate the cursor.*
ef60: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  * so that it is 
ef70: 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e  never used again
ef80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ef90: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
efa0: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
efb0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
efc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
efd0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
efe0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
eff0: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
f000: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
f010: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
f020: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
f030: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f040: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
f050: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
f060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
f070: 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
f080: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
f090: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
f0a0: 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
f0b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
f0c0: 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
f0d0: 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
f0e0: 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
f0f0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
f100: 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
f110: 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
f120: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f130: 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
f140: 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
f150: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
f160: 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
f170: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
f180: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
f190: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
f1a0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64  tion is commtted
f1b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
f1c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
f1d0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
f1e0: 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
f1f0: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
f200: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
f210: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
f220: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
f230: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
f240: 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
f250: 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
f260: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
f270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
f280: 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
f290: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
f2a0: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
f2b0: 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
f2c0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
f2d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
f2e0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
f2f0: 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
f300: 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
f310: 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
f320: 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
f330: 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  ured, causing an
f340: 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
f350: 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
f360: 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
f370: 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
f380: 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
f390: 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
f3a0: 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
f3b0: 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
f3c0: 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
f3d0: 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
f3e0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
f3f0: 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
f400: 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
f410: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
f420: 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
f430: 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
f440: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
f450: 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
f460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
f470: 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
f480: 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
f490: 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
f4a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
f4b0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
f4c0: 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
f4d0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
f4e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
f4f0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
f500: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
f510: 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
f520: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
f530: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
f540: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
f550: 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
f560: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
f570: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
f580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f590: 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
f5a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f5b0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
f5c0: 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
f5d0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f5e0: 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
f5f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f600: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f610: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f620: 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
f630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f640: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
f650: 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
f660: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
f670: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f680: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f690: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
f6a0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
f6b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f6c0: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
f6d0: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
f6e0: 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
f6f0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
f700: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f710: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f720: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
f730: 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
f740: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f750: 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
f760: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f770: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
f780: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
f790: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
f7a0: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
f7b0: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
f7c0: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
f7d0: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
f7e0: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
f7f0: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
f800: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
f810: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
f820: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
f830: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
f840: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
f850: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
f860: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
f870: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
f880: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  efCons;.    }.  
f890: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
f8b0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
f8c0: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
f8d0: 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
f8e0: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
f8f0: 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
f900: 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
f910: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
f920: 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
f930: 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
f940: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
f950: 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
f960: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
f970: 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
f980: 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
f990: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
f9a0: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
f9b0: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
f9c0: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
f9d0: 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
f9e0: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
f9f0: 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
fa00: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
fa10: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
fa20: 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
fa30: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 77 72  ONSTRAINT and wr
fa40: 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  ite.** an error 
fa50: 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54  message to it. T
fa60: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
fa70: 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e  E_ERROR..*/.#ifn
fa80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fa90: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20  FOREIGN_KEY.int 
faa0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
fab0: 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Fk(Vdbe *p, int 
fac0: 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c  deferred){.  sql
fad0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
fae0: 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65  ;.  if( (deferre
faf0: 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72 72  d && db->nDeferr
fb00: 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21 64  edCons>0) || (!d
fb10: 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
fb20: 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 29  kConstraint>0) )
fb30: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
fb40: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
fb50: 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
fb60: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
fb70: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
fb80: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
fb90: 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20 6b  , db, "foreign k
fba0: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  ey constraint fa
fbb0: 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
fbc0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
fbd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
fbe0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
fbf0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
fc00: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
fc10: 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
fc20: 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
fc30: 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
fc40: 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
fc50: 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
fc60: 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
fc70: 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
fc80: 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
fc90: 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
fca0: 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
fcb0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
fcc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
fcd0: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
fce0: 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
fcf0: 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
fd00: 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
fd10: 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
fd20: 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
fd30: 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
fd40: 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
fd50: 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
fd60: 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
fd70: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
fd80: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
fd90: 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
fda0: 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
fdb0: 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
fdc0: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
fdd0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
fde0: 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
fdf0: 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
fe00: 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
fe10: 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
fe20: 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
fe30: 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
fe40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fe50: 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
fe60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
fe90: 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
fea0: 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
feb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fec0: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
fed0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
fee0: 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
fef0: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
ff00: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
ff10: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
ff20: 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
ff30: 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
ff40: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
ff50: 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
ff60: 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
ff70: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
ff80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
ff90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
ffa0: 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
ffb0: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
ffc0: 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
ffd0: 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
ffe0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
fff0: 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
10000 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
10010 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
10020 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
10030 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
10040 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
10050 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
10060 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
10070 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
10080 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10090 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
100a0 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
100b0 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
100c0 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
100d0 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
100e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
100f0 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
10100 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
10110 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
10120 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
10130 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
10140 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
10150 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
10160 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
10170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10180 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
10190 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
101a0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
101b0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
101c0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
101d0 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66   started */.  if
101e0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
101f0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
10200 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
10210 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
10220 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
10230 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
10240 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
10250 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
10260 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
10270 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
10280 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
10290 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
102a0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
102b0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
102c0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
102d0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
102e0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
102f0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
10300 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
10310 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65 72 74  0xff;.    assert
10320 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
10330 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
10340 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
10350 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73 74 73  no longer exists
10360 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63 69 61   */.    isSpecia
10370 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
10380 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
10390 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
103a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103b0 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
103c0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
103d0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
103e0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
103f0 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
10400 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65     /* If the que
10410 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79  ry was read-only
10420 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
10430 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e  ode is SQLITE_IN
10440 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20  TERRUPT, .      
10450 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69  ** no rollback i
10460 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68  s necessary. Oth
10470 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74  erwise, at least
10480 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20   a savepoint .  
10490 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
104a0 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65  on must be rolle
104b0 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72  d back to restor
104c0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
104d0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  o a .      ** co
104e0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
104f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10500 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74  * Even if the st
10510 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d  atement is read-
10520 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f  only, it is impo
10530 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d  rtant to perform
10540 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74  .      ** a stat
10550 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  ement or transac
10560 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70  tion rollback op
10570 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  eration. If the 
10580 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  error .      ** 
10590 6f 63 63 75 72 65 64 20 77 68 69 6c 65 20 77 72  occured while wr
105a0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
105b0 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
105c0 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
105d0 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
105e0 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
105f0 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
10600 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
10610 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
10620 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
10630 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
10640 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
10650 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
10660 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
10670 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
10680 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
10690 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
106a0 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
106b0 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
106c0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
106d0 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
106e0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
106f0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
10700 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
10710 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
10720 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
10730 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
10740 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
10750 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
10760 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
10770 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
10780 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
10790 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
107a0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
107b0 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
107c0 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
107d0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
107e0 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
107f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
10800 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
10810 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
10820 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
10830 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
10840 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
10850 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
10860 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
10870 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
10880 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
10890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
108a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
108b0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
108c0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
108d0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
108e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
108f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10900 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
10910 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
10920 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
10930 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
10940 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
10950 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
10960 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
10970 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
10980 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
10990 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
109a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
109b0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
109c0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
109d0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
109e0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
109f0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
10a00 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
10a10 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
10a20 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
10a30 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
10a40 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
10a50 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
10a60 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
10a70 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70  writeVdbeCnt==(p
10a80 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
10a90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
10aa0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
10ab0 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
10ac0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
10ad0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
10ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
10af0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
10b00 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
10b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
10b30 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
10b40 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
10b50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10b60 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
10b70 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10b80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
10b90 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
10ba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10bb0 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
10bc0 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
10bd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
10be0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
10bf0 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
10c00 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
10c10 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
10c20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
10c30 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
10c40 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
10c50 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
10c60 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
10c70 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
10c80 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
10c90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
10ca0 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
10cb0 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
10cc0 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
10cd0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
10ce0 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
10cf0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
10d00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
10d10 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
10d20 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
10d30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10d40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
10d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10d60 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
10d70 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
10d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d90 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
10da0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10db0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
10dc0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
10dd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
10de0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
10df0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   0;.          sq
10e00 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
10e10 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
10e20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10e30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10e40 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10e50 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
10e60 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
10e70 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
10e80 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
10e90 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
10ea0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10eb0 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
10ec0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
10ed0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
10ee0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
10ef0 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
10f00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
10f10 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
10f20 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
10f30 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
10f40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10f50 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
10f60 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
10f70 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
10f80 66 69 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a  fiedBtrees(db);.
10f90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
10fa0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
10fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
10fc0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
10fd0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
10fe0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
10ff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11000 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74  .    /* If eStat
11010 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a  ementOp is non-z
11020 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74  ero, then a stat
11030 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
11040 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  n needs to.    *
11050 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  * be committed o
11060 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43  r rolled back. C
11070 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43  all sqlite3VdbeC
11080 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20  loseStatement() 
11090 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e  to.    ** do so.
110a0 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   If this operati
110b0 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
110c0 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ror, and the cur
110d0 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20  rent statement. 
110e0 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65     ** error code
110f0 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72   is SQLITE_OK or
11100 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11110 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65  NT, then promote
11120 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
11130 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72  ent statement er
11140 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f  ror code..    */
11150 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d  .    if( eStatem
11160 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72  entOp ){.      r
11170 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
11180 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c  loseStatement(p,
11190 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a   eStatementOp);.
111a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
111b0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
111c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
111d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
111e0 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
111f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
11200 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11210 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
11220 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
11230 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
11240 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
11250 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
11260 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69  eCursorsOnModifi
11270 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20  edBtrees(db);.  
11280 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
11290 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
112a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
112b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
112c0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
112d0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
112e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
112f0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
11300 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
11310 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
11320 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
11330 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
11340 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
11350 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
11360 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
11370 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
11380 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
11390 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
113a0 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
113b0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
113c0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
113d0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
113e0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
113f0 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
11400 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
11410 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
11420 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
11430 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
11440 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
11450 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
11460 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
11470 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
11480 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
11490 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
114a0 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
114b0 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
114c0 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
114d0 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
114e0 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
114f0 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
11500 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 64 62 2d  , -1);.      db-
11510 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
11520 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
11530 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
11540 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
11550 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
11560 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
11570 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
11580 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
11590 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
115a0 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
115b0 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
115c0 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
115d0 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
115e0 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d  ->activeVdbeCnt-
115f0 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
11600 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
11610 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
11620 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t--;.    }.    a
11630 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76  ssert( db->activ
11640 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72  eVdbeCnt>=db->wr
11650 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20  iteVdbeCnt );.  
11660 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
11670 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
11680 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
11690 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
116a0 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
116b0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
116c0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
116d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
116e0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
116f0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
11700 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
11710 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
11720 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
11730 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
11740 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
11750 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
11760 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
11770 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
11780 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
11790 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
117a0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
117b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
117c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
117d0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
117e0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
117f0 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
11800 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e  dbeCnt>0 || db->
11810 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
11820 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
11830 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
11840 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
11850 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
11860 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
11870 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
11880 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
11890 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
118a0 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
118b0 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
118c0 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
118d0 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
118e0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
118f0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
11900 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
11910 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
11920 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
11930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11940 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
11950 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
11960 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
11970 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
11980 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
11990 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
119a0 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
119b0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
119c0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
119d0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
119e0 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
119f0 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
11a00 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
11a10 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
11a20 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
11a30 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
11a40 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
11a50 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
11a60 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
11a70 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
11a80 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
11a90 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
11aa0 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
11ab0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
11ac0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11ad0 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
11ae0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
11af0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
11b00 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
11b10 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
11b20 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
11b30 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
11b40 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
11b50 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
11b60 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
11b70 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
11b80 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
11b90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
11ba0 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
11bb0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
11bc0 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
11bd0 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
11be0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
11bf0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
11c00 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
11c10 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
11c20 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
11c30 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
11c40 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
11c50 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
11c60 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
11c70 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
11c80 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
11c90 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
11ca0 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
11cb0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
11cc0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
11cd0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
11ce0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
11cf0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
11d00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11d10 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
11d20 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oc();.      sqli
11d30 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
11d40 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45  b->pErr,-1,p->zE
11d50 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46  rrMsg,SQLITE_UTF
11d60 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  8,SQLITE_TRANSIE
11d70 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  NT);.      sqlit
11d80 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11d90 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  c();.      db->e
11da0 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
11db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11dc0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
11dd0 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45  sg);.      p->zE
11de0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d  rrMsg = 0;.    }
11df0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29  else if( p->rc )
11e00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11e10 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
11e20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
11e30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11e40 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  r(db, SQLITE_OK,
11e50 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
11e60 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  f( p->runOnlyOnc
11e70 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  e ) p->expired =
11e80 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
11e90 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69  p->rc && p->expi
11ea0 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  red ){.    /* Th
11eb0 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20 77  e expired flag w
11ec0 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44  as set on the VD
11ed0 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  BE before the fi
11ee0 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  rst call.    ** 
11ef0 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  to sqlite3_step(
11f00 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e  ). For consisten
11f10 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65  cy (since sqlite
11f20 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20 20  3_step() was.   
11f30 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74   ** called), set
11f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65 72   the database er
11f50 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73 65  ror in this case
11f60 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f   as well..    */
11f70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11f80 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b  r(db, p->rc, 0);
11f90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
11fa0 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
11fb0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
11fc0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
11fd0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11fe0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
11ff0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
12000 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
12010 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
12020 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
12030 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
12040 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
12050 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
12060 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
12070 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
12080 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
12090 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
120a0 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
120b0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
120c0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
120d0 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
120e0 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
120f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
12100 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
12110 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
12120 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
12130 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
12140 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
12150 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
12160 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
12170 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12180 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
12190 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
121a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
121b0 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
121c0 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
121d0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
121e0 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
121f0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
12200 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
12210 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
12220 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
12230 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
12240 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
12250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12260 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
12270 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
12280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
12290 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
122a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
122b0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
122c0 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
122d0 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
122e0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
122f0 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
12300 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
12310 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
12320 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
12330 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
12340 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
12350 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
12360 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
12370 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
12380 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
12390 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
123a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
123b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
123c0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
123d0 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
123e0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
123f0 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
12400 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12410 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
12420 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
12430 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
12440 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
12450 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
12460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12470 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
12480 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
12490 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
124a0 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
124b0 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
124c0 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
124d0 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
124e0 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
124f0 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
12500 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
12510 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
12520 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
12530 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
12540 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
12550 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
12560 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
12570 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
12580 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
12590 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
125a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
125b0 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
125c0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
125d0 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
125e0 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
125f0 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
12600 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28 75  1 || !(mask&(((u
12610 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20 70  32)1)<<i))) && p
12620 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20  Aux->pAux ){.   
12630 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
12640 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
12650 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
12660 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
12670 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70   }.      pAux->p
12680 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
12690 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
126a0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
126b0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
126c0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
126d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
126e0 6e 74 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  nt..** The diffe
126f0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
12700 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
12710 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
12720 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
12730 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
12740 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
12750 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
12760 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
12770 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
12780 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12790 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
127a0 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65  e3VdbeDeleteObje
127b0 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
127c0 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
127d0 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
127e0 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
127f0 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
12800 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
12810 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
12820 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
12830 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
12840 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
12850 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
12860 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
12870 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
12880 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
12890 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
128a0 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
128b0 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
128c0 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
128d0 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
128e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
128f0 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
12900 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
12910 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
12920 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
12930 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
12940 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
12950 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
12960 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
12970 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12980 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
12990 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
129a0 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
129b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
129c0 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
129d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
129e0 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74  >pFree);.  sqlit
129f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
12a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
12a10 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e   an entire VDBE.
12a20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12a30 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20  VdbeDelete(Vdbe 
12a40 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
12a50 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  db;..  if( NEVER
12a60 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (p==0) ) return;
12a70 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
12a80 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
12a90 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
12aa0 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
12ab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
12ac0 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
12ad0 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
12ae0 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
12af0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
12b00 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
12b10 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
12b20 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
12b30 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
12b40 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
12b50 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  = 0;.  sqlite3Vd
12b60 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 64  beDeleteObject(d
12b70 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
12b80 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
12b90 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
12ba0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
12bb0 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
12bc0 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
12bd0 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
12be0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
12bf0 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
12c00 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
12c10 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
12c20 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
12c30 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
12c40 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
12c50 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
12c60 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
12c70 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
12c80 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
12c90 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
12ca0 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
12cb0 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
12cc0 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
12cd0 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
12ce0 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
12cf0 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
12d00 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
12d10 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
12d20 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
12d30 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
12d40 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
12d50 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
12d60 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
12d70 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
12d80 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
12d90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
12da0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
12db0 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
12dc0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
12de0 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
12df0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
12e00 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
12e10 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
12e20 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
12e30 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
12e40 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
12e50 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
12e60 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
12e70 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
12e80 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
12e90 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
12ea0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
12eb0 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
12ec0 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
12ed0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
12ee0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
12ef0 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 2d  ->lastRowid = p-
12f00 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b 0a 20  >movetoTarget;. 
12f10 20 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20     if( res!=0 ) 
12f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
12f30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
12f40 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
12f50 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
12f60 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69  TE_TEST.    sqli
12f70 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
12f80 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  ++;.#endif.    p
12f90 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
12fa0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63   = 0;.    p->cac
12fb0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
12fc0 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20  _STALE;.  }else 
12fd0 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70 43  if( ALWAYS(p->pC
12fe0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e  ursor) ){.    in
12ff0 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20  t hasMoved;.    
13000 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
13010 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
13020 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ved(p->pCursor, 
13030 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20  &hasMoved);.    
13040 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13050 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d  rc;.    if( hasM
13060 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d  oved ){.      p-
13070 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
13080 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20  ACHE_STALE;.    
13090 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31    p->nullRow = 1
130a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
130b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
130c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
130d0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
130e0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
130f0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
13100 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
13110 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
13120 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
13130 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
13140 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
13150 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
13160 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
13170 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
13180 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
13190 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
131a0 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
131b0 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
131c0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
131d0 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
131e0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
131f0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
13200 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
13210 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
13220 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
13230 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
13240 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
13250 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
13260 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
13270 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
13280 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
13290 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
132a0 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
132b0 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
132c0 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
132d0 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
132e0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
132f0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
13300 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
13310 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
13320 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
13330 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
13340 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
13350 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
13360 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
13370 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
13380 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
13390 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
133a0 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
133b0 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
133c0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
133d0 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
133e0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
133f0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
13400 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
13410 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
13420 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
13430 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
13440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
13450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
13460 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
13470 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
13480 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
13490 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
134a0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
134b0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
134c0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
134d0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
134e0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
134f0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
13500 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
13510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13520 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
13530 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13540 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
13550 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
13560 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13570 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
135a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
135b0 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
135d0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
135e0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
135f0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
13600 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
13610 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
13620 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
13640 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
13650 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
13660 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
13670 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
13680 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
13690 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
136a0 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136c0 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
136d0 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
136e0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
136f0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
13700 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
13710 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
13720 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
13730 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
13740 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
13750 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
13760 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
13770 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
13780 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
13790 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
137a0 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
137b0 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
137c0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
137d0 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
137e0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
137f0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
13800 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13810 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
13820 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
13830 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
13840 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
13850 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
13860 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
13870 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
13880 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
13890 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
138a0 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
138b0 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
138c0 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
138d0 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
138e0 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
138f0 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
13900 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
13910 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
13920 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
13930 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
13940 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
13950 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
13960 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20  +(u32)i;.    }. 
13970 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
13980 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f      if( i<(-MAX_
13990 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e 20  6BYTE) ) return 
139a0 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 76  6;.      /* Prev
139b0 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 6e  ious test preven
139c0 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 33  ts:  u = -(-9223
139d0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 29  372036854775808)
139e0 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d 69   */.      u = -i
139f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13a00 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
13a10 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
13a20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
13a30 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
13a40 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
13a50 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
13a60 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
13a70 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
13a80 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
13a90 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
13aa0 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
13ab0 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
13ac0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
13ad0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
13ae0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
13af0 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
13b00 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
13b10 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
13b20 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d  b) );.  n = pMem
13b30 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
13b40 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
13b50 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
13b60 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 73  nZero;.  }.  ass
13b70 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
13b80 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
13b90 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
13ba0 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
13bb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
13bc0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
13bd0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
13be0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
13bf0 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
13c00 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
13c10 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
13c20 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
13c30 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
13c40 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
13c50 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
13c60 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
13c70 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13c80 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
13c90 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
13ca0 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
13cb0 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
13cc0 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
13cd0 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
13ce0 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
13cf0 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
13d00 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
13d10 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
13d20 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
13d30 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
13d40 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
13d50 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
13d60 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
13d70 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
13d80 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
13d90 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
13da0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
13db0 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
13dc0 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
13dd0 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
13de0 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
13df0 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
13e00 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
13e10 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
13e20 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
13e30 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
13e40 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
13e50 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
13e60 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
13e70 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
13e80 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
13e90 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
13ea0 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
13eb0 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
13ec0 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
13ed0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
13ee0 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
13ef0 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
13f00 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
13f10 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
13f20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
13f30 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
13f40 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
13f50 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
13f60 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
13f70 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
13f80 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
13f90 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
13fa0 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
13fb0 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
13fc0 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
13fd0 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
13fe0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
13ff0 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
14000 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
14010 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
14020 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
14030 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
14040 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
14050 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
14060 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
14070 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
14080 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
14090 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
140a0 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
140b0 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
140c0 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
140d0 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
140e0 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
140f0 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
14100 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
14110 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
14120 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
14130 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
14140 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
14150 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
14160 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
14170 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
14180 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
14190 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
141a0 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
141b0 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
141c0 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
141d0 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
141e0 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
141f0 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
14200 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
14210 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
14220 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
14230 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
14240 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
14250 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
14260 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
14270 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
14280 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
14290 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
142a0 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
142b0 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
142c0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
142d0 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
142e0 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
142f0 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
14300 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
14310 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
14320 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
14330 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
14340 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
14350 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
14360 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
14370 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
14380 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
14390 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
143a0 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
143b0 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
143c0 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
143d0 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
143e0 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
143f0 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
14400 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
14410 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
14420 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
14430 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
14440 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
14450 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
14460 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
14470 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
14480 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
14490 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
144a0 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
144b0 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
144c0 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
144d0 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
144e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
144f0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
14500 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
14510 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
14520 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
14530 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
14540 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
14550 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
14560 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
14570 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
14580 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
14590 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
145a0 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
145b0 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
145c0 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
145d0 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
145e0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
145f0 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
14600 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
14610 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
14620 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
14630 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
14640 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
14650 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
14660 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
14670 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
14680 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
14690 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
146a0 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
146b0 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
146c0 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
146d0 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
146e0 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
146f0 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
14700 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
14710 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
14720 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
14730 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
14740 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14750 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
14760 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
14770 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
14780 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
14790 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
147a0 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
147b0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
147c0 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
147d0 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
147e0 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
147f0 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
14800 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
14810 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
14820 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
14830 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
14840 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
14850 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14860 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
14870 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20 6c  format);.  u32 l
14880 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
14890 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
148a0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
148b0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
148c0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
148d0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
148e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
148f0 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
14900 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
14910 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
14920 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14930 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
14940 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
14950 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
14960 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
14970 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
14980 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
14990 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
149a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
149b0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
149c0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
149d0 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20 29  len<=(u32)nBuf )
149e0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d  ;.    while( i--
149f0 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d   ){.      buf[i]
14a00 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
14a10 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
14a20 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
14a30 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
14a40 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
14a50 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14a60 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
14a70 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
14a80 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
14a90 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
14aa0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
14ab0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
14ac0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
14ad0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14ae0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
14af0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
14b00 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
14b10 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
14b20 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
14b30 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
14b40 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
14b50 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
14b60 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
14b70 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73 73  nZero;.      ass
14b80 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b 0a  ert( nBuf>=0 );.
14b90 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e 20        if( len > 
14ba0 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20 20  (u32)nBuf ){.   
14bb0 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32 29       len = (u32)
14bc0 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nBuf;.      }.  
14bd0 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b      memset(&buf[
14be0 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e  pMem->n], 0, len
14bf0 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d  -pMem->n);.    }
14c00 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
14c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20  .  }..  /* NULL 
14c20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f  or constants 0 o
14c30 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  r 1 */.  return 
14c40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  0;.}../*.** Dese
14c50 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
14c60 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
14c70 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
14c80 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
14c90 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
14ca0 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
14cb0 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
14cc0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
14cd0 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  read..*/ .u32 sq
14ce0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
14cf0 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
14d00 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
14d10 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
14d20 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
14d30 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
14d40 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
14d50 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
14d60 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
14d70 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
14d80 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
14d90 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
14da0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
14db0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
14dc0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
14dd0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
14de0 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
14df0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
14e00 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
14e10 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
14e20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
14e30 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
14e40 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
14e50 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
14e60 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
14e70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14e80 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
14e90 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
14ea0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
14eb0 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64  m->u.i = (signed
14ec0 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20   char)buf[0];.  
14ed0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
14ee0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
14ef0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
14f00 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
14f10 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
14f20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
14f30 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28   pMem->u.i = (((
14f40 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
14f50 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
14f60 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
14f70 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
14f80 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
14f90 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
14fa0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
14fb0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
14fc0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
14fd0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
14fe0 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28  buf[0])<<16) | (
14ff0 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[1]<<8) | buf
15000 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [2];.      pMem-
15010 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
15020 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
15030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
15040 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
15050 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
15060 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
15070 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  i = (buf[0]<<24)
15080 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
15090 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
150a0 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[3];.      pM
150b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
150c0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
150d0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
150e0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
150f0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
15100 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78  r */.      u64 x
15110 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61   = (((signed cha
15120 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20  r)buf[0])<<8) | 
15130 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33  buf[1];.      u3
15140 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32  2 y = (buf[2]<<2
15150 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36  4) | (buf[3]<<16
15160 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20  ) | (buf[4]<<8) 
15170 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20  | buf[5];.      
15180 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
15190 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
151a0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
151b0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
151c0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
151d0 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
151e0 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
151f0 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
15200 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
15210 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
15220 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15230 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a  */.      u64 x;.
15240 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66        u32 y;.#if
15250 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
15260 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15270 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
15280 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20  NG_POINT).      
15290 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69  /* Verify that i
152a0 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61  ntegers and floa
152b0 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
152c0 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20  s use the same. 
152d0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64       ** byte ord
152e0 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
152f0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
15300 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
15310 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66   is.      ** def
15320 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
15330 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
15340 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
15350 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a  e mixed.      **
15360 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a   endian..      *
15370 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
15380 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28  onst u64 t1 = ((
15390 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c  u64)0x3ff00000)<
153a0 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69  <32;.      stati
153b0 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
153c0 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75  1 = 1.0;.      u
153d0 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
153e0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
153f0 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20  nFloat(t2);.    
15400 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15410 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
15420 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
15430 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
15440 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ==0 );.#endif.. 
15450 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d       x = (buf[0]
15460 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
15470 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
15480 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
15490 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c     y = (buf[4]<<
154a0 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31  24) | (buf[5]<<1
154b0 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29  6) | (buf[6]<<8)
154c0 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20   | buf[7];.     
154d0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
154e0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
154f0 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
15500 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
15510 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
15520 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15530 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
15540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15550 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
15560 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
15570 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20  pMem->r)==8 );. 
15580 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64         swapMixed
15590 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
155a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
155b0 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
155c0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20  eof(x));.       
155d0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73   pMem->flags = s
155e0 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d  qlite3IsNaN(pMem
155f0 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20  ->r) ? MEM_Null 
15600 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20  : MEM_Real;.    
15610 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
15620 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   8;.    }.    ca
15630 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
15640 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
15650 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
15660 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d  er 1 */.      pM
15670 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
15680 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
15690 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
156a0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
156b0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
156c0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
156d0 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72 69   u32 len = (seri
156e0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
156f0 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
15700 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
15710 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b    pMem->n = len;
15720 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65  .      pMem->xDe
15730 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  l = 0;.      if(
15740 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30   serial_type&0x0
15750 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  1 ){.        pMe
15760 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
15770 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a  tr | MEM_Ephem;.
15780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15790 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
157a0 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45   = MEM_Blob | ME
157b0 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
157c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65  .      return le
157d0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
157e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
157f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15800 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
15810 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
15820 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
15830 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
15840 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
15850 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
15860 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
15870 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
15880 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
15890 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
158a0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
158b0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
158c0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
158d0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
158e0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
158f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
15900 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
15910 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
15920 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
15930 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
15940 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
15950 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
15960 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
15970 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
15980 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
15990 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
159a0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
159b0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
159c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
159d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
159e0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
159f0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
15a00 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
15a10 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
15a20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
15a30 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
15a40 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
15a50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
15a60 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
15a70 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
15a80 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
15a90 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
15aa0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
15ab0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
15ac0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
15ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
15ae0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
15af0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
15b00 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
15b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
15b20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
15b30 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
15b40 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15b60 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
15b70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
15b80 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15ba0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
15bb0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
15bc0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
15bd0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
15be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
15bf0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
15c00 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
15c10 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c30 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
15c40 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
15c50 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
15c60 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15c80 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15c90 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
15ca0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
15cb0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
15cc0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
15cd0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
15ce0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
15cf0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
15d00 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
15d10 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
15d20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
15d30 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
15d40 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
15d50 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
15d60 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
15d70 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
15d80 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
15d90 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
15da0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
15db0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
15dc0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
15dd0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
15de0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
15df0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
15e00 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
15e10 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
15e20 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
15e30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
15e40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15e50 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
15e60 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
15e70 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
15e80 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
15e90 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
15ea0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
15eb0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
15ec0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
15ed0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
15ee0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
15ef0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
15f00 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
15f10 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 70  edRecord))];.  p
15f20 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
15f30 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65  yInfo;.  p->nFie
15f40 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ld = pKeyInfo->n
15f50 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74  Field + 1;.  ret
15f60 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
15f70 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
15f80 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
15f90 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
15fa0 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  [], populate the
15fb0 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63   .** UnpackedRec
15fc0 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e  ord structure in
15fd0 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66  dicated by the f
15fe0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77  ourth argument w
15ff0 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ith the.** conte
16000 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64  nts of the decod
16010 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76  ed record..*/ .v
16020 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
16030 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b  ecordUnpack(.  K
16040 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
16050 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61  ,     /* Informa
16060 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72  tion about the r
16070 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a  ecord format */.
16080 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20    int nKey,     
16090 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
160a0 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72   of the binary r
160b0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
160c0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20   void *pKey,    
160d0 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20    /* The binary 
160e0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61  record */.  Unpa
160f0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20  ckedRecord *p   
16100 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
16110 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65  his structure be
16120 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
16130 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
16140 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
16150 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
16160 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
16170 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32  .  int d; .  u32
16180 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161a0 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d  Offset in aKey[]
161b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
161c0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20  .  u16 u;       
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
161f0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
16200 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65   u32 szHdr;.  Me
16210 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65  m *pMem = p->aMe
16220 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d  m;..  p->flags =
16230 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
16240 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
16250 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
16260 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
16270 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
16280 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
16290 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
162a0 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
162b0 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
162c0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
162d0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
162e0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
162f0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
16300 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
16310 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
16320 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
16330 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
16340 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
16350 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
16360 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
16370 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
16380 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
16390 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
163a0 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
163b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
163c0 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
163d0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
163e0 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
163f0 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
16400 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
16410 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
16420 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
16430 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  u;.}../*.** This
16440 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
16450 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
16460 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
16470 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
16480 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
16490 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
164a0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
164b0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
164c0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
164d0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
164e0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
164f0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
16500 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
16510 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
16520 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
16530 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
16540 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
16550 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
16560 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
16570 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
16580 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
16590 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
165a0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
165b0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
165c0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
165d0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
165e0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
165f0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
16600 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b  fields..** The k
16610 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69  ey with fewer fi
16620 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20  elds is usually 
16630 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68  compares less th
16640 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65  an the .** longe
16650 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20  r key.  However 
16660 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
16670 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e  INCRKEY flags in
16680 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a   pPKey2 is set.*
16690 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e  * and the common
166a0 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71   prefixes are eq
166b0 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69  ual, then key1 i
166c0 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32  s less than key2
166d0 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55  ..** Or if the U
166e0 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52  NPACKED_MATCH_PR
166f0 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74  EFIX flag is set
16700 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65   and the prefixe
16710 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20  s are.** equal, 
16720 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72  then the keys ar
16730 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
16740 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20  be equal and.** 
16750 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64  the parts beyond
16760 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66   the common pref
16770 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a  ix are ignored..
16780 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50  **.** If the UNP
16790 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57  ACKED_IGNORE_ROW
167a0 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ID flag is set, 
167b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79  then the last by
167c0 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61  te of.** the hea
167d0 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20  der of pKey1 is 
167e0 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20  ignored.  It is 
167f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65  assumed that pKe
16800 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65  y1 is.** an inde
16810 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20  x key, and thus 
16820 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77 69  ends with a rowi
16830 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61  d value.  The la
16840 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68  st byte.** of th
16850 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68  e header will th
16860 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20 73  erefore be the s
16870 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
16880 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20  e rowid:.** one 
16890 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35  of 1, 2, 3, 4, 5
168a0 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74  , 6, 8, or 9 - t
168b0 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69 61  he integer seria
168c0 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20  l types..** The 
168d0 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  serial type of t
168e0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77  he final rowid w
168f0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20  ill always be a 
16900 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20  single byte..** 
16910 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73  By ignoring this
16920 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68   last byte of th
16930 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72  e header, we for
16940 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
16950 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74  n.** to ignore t
16960 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
16970 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a  end of key1..*/.
16980 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
16990 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
169a0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
169b0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
169c0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
169d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
169e0 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
169f0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
16a00 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20    int d1;       
16a10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
16a20 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
16a30 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
16a40 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
16a50 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
16a60 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
16a70 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
16a80 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
16a90 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
16aa0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16ab0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
16ac0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
16ad0 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63  nField;.  int rc
16ae0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
16af0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
16b00 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
16b10 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
16b20 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
16b30 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
16b40 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
16b50 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
16b60 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d  fo;.  mem1.enc =
16b70 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
16b80 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
16b90 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d  Info->db;.  /* m
16ba0 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20  em1.flags = 0;  
16bb0 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69  // Will be initi
16bc0 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alized by sqlite
16bd0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
16be0 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20   */.  VVA_ONLY( 
16bf0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  mem1.zMalloc = 0
16c00 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
16c10 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
16c20 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
16c30 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
16c40 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
16c50 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
16c60 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
16c70 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
16c80 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
16c90 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
16ca0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
16cb0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
16cc0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
16cd0 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
16ce0 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
16cf0 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
16d00 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
16d10 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
16d20 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
16d30 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
16d40 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
16d50 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
16d60 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
16d70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
16d80 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
16d90 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
16da0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
16db0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
16dc0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
16dd0 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
16de0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
16df0 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
16e00 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
16e10 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
16e20 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
16e30 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
16e40 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
16e50 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
16e60 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
16e70 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32  r1;.  if( pPKey2
16e80 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
16e90 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
16ea0 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b  ){.    szHdr1--;
16eb0 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20  .  }.  nField = 
16ec0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16ed0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
16ee0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
16ef0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
16f00 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
16f10 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
16f20 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
16f30 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
16f40 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
16f50 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
16f60 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
16f70 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
16f80 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
16f90 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
16fa0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16fb0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16fc0 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
16fd0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
16fe0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
16ff0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
17000 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
17010 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17020 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
17030 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
17040 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
17050 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
17060 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
17070 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
17080 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
17090 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
170c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
170d0 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
170e0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
170f0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
17100 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
17110 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
17120 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w */..      /* I
17130 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
17140 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67   if we are using
17150 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
17160 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
17170 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
17180 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20  der && i<nField 
17190 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
171a0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
171b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
171c0 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20        }.    .   
171d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45     /* If the PRE
171e0 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
171f0 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66  is set and all f
17200 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65  ields except the
17210 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20   final.      ** 
17220 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65  rowid field were
17230 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65   equal, then cle
17240 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45  ar the PREFIX_SE
17250 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65  ARCH flag and se
17260 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65  t .      ** pPKe
17270 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65  y2->rowid to the
17280 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f   value of the ro
17290 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b  wid field in (pK
172a0 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20  ey1, nKey1)..   
172b0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73     ** This is us
172c0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55  ed by the OP_IsU
172d0 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20  nique opcode..  
172e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
172f0 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20   (pPKey2->flags 
17300 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17310 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d  X_SEARCH) && i==
17320 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d  (pPKey2->nField-
17330 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  1) ){.        as
17340 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64  sert( idx1==szHd
17350 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20  r1 && rc );.    
17360 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
17370 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  .flags & MEM_Int
17380 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65   );.        pPKe
17390 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e  y2->flags &= ~UN
173a0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45  PACKED_PREFIX_SE
173b0 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50  ARCH;.        pP
173c0 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65  Key2->rowid = me
173d0 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a  m1.u.i;.      }.
173e0 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72      .      retur
173f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17400 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  i++;.  }..  /* N
17410 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
17420 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
17430 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
17440 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
17450 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17460 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
17470 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
17480 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
17490 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
174a0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
174b0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
174c0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
174d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
174e0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
174f0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
17500 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
17510 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
17520 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
17530 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
17540 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
17550 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
17560 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e  equal. If the UN
17570 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20  PACKED_INCRKEY. 
17580 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
17590 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20   then break the 
175a0 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20  tie by treating 
175b0 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a  key2 as larger..
175c0 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
175d0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
175e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
175f0 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
17600 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a  mon prefixes.  *
17610 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
17620 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
17630 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
17640 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
17650 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41  .  ** larger.  A
17660 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
17670 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
17680 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
17690 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65  er.  ** if there
176a0 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65   is a difference
176b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
176c0 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20   rc==0 );.  if( 
176d0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
176e0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
176f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b   ){.    rc = -1;
17700 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
17710 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
17720 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54  ACKED_PREFIX_MAT
17730 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61  CH ){.    /* Lea
17740 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65  ve rc==0 */.  }e
17750 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48  lse if( idx1<szH
17760 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  dr1 ){.    rc = 
17770 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
17780 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
17790 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
177a0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
177b0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
177c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
177d0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
177e0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
177f0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
17800 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
17810 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
17820 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
17830 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
17840 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
17850 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
17860 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
17870 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
17880 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
17890 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
178a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
178b0 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
178c0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
178d0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
178e0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
178f0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
17900 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
17910 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
17920 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
17930 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
17940 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
17950 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
17960 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
17970 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17980 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
17990 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
179a0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
179b0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
179c0 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
179d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
179e0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
179f0 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
17a00 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
17a10 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
17a20 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
17a30 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
17a40 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
17a50 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
17a60 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
17a70 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
17a80 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
17a90 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
17aa0 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
17ab0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
17ac0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
17ad0 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
17ae0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
17af0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
17b00 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
17b10 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
17b20 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
17b30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17b40 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
17b50 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
17b60 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
17b70 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
17b80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
17b90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17ba0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17bb0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17bc0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17bd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17be0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17bf0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17c00 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17c10 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17c20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
17c30 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17c40 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
17c50 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
17c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
17c70 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
17c80 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
17c90 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17ca0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17cb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17cc0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17cd0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17ce0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17cf0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17d00 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17d10 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17d20 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
17d30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
17d40 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
17d50 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
17d60 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
17d70 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
17d80 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17d90 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17da0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17db0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17dc0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17dd0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17de0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17df0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17e00 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17e10 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17e20 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17e30 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
17e40 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
17e50 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17e60 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
17e70 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17e80 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
17e90 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17ea0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17eb0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17ec0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17ed0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17ee0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17ef0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17f00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17f10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17f20 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
17f30 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
17f40 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
17f50 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
17f60 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
17f70 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17f80 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
17f90 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17fa0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17fb0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17fc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17fd0 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17fe0 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17ff0 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
18000 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
18010 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
18020 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
18030 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
18040 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
18050 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
18060 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
18070 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
18080 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
18090 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
180a0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
180b0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
180c0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
180d0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
180e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
180f0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
18100 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
18110 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
18120 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
18130 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
18140 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
18150 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
18160 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18170 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
18180 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
18190 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
181a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
181b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
181c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
181d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
181e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
181f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
18200 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18210 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
18220 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
18230 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
18240 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
18250 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
18260 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
18270 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
18280 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
18290 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
182a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
182b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
182c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
182d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
182e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
182f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
18300 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
18310 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
18320 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
18330 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
18340 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
18350 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
18360 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
18370 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
18380 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
18390 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
183a0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
183b0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
183c0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
183d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
183e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
183f0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
18400 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
18410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18420 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
18430 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
18440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18450 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
18460 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
18470 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
18480 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
18490 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
184a0 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
184b0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
184c0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
184e0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
184f0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
18500 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
18510 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
18520 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
18530 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
18540 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
18550 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18560 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
18570 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
18580 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
18590 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
185a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
185b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
185c0 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
185d0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
185e0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
185f0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
18600 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
18610 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
18620 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
18630 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
18640 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  say.  ** that bt
18650 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
18660 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
18670 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
18680 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
18690 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
186a0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
186b0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
186c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
186d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
186e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
186f0 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
18700 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
18710 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
18720 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
18730 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  or, 0, (int)nCel
18740 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
18750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
18760 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
18770 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64  ssert( pUnpacked
18780 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b  ->flags & UNPACK
18790 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20  ED_IGNORE_ROWID 
187a0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69  );.  *res = sqli
187b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
187c0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70  pare(m.n, m.z, p
187d0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c  Unpacked);.  sql
187e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
187f0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
18800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18810 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18820 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
18830 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
18840 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
18850 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
18860 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
18870 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18880 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
18890 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
188a0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
188b0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
188c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
188d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
188e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
188f0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
18900 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
18910 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
18920 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
18930 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
18940 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
18950 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
18960 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
18970 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
18980 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
18990 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
189a0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
189b0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
189c0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
189d0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
189e0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
189f0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
18a00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
18a10 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
18a20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
18a30 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
18a40 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
18a50 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
18a60 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
18a70 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
18a80 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
18a90 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
18aa0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
18ab0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
18ac0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
18ad0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
18ae0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
18af0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
18b00 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
18b10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
18b20 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
18b30 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
18b40 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
18b50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
18b60 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
18b70 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
18b80 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
18b90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
18ba0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
18bb0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
18bc0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
18bd0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
18be0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
18bf0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
18c00 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
18c10 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
18c20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
18c30 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
18c40 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
18c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
18c60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
18c70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
18c80 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
18c90 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
18ca0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
18cb0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
18cc0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
18cd0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
18ce0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
18cf0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
18d00 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
18d10 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
18d20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
18d30 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
18d40 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
18d50 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
18d60 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
18d70 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
18d80 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
18d90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
18da0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
18db0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
18dc0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
18dd0 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64  3VdbeGetValue(Vd
18de0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
18df0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
18e00 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
18e10 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
18e20 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
18e30 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
18e40 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
18e50 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
18e60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
18e70 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
18e80 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
18e90 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
18ea0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
18eb0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
18ec0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
18ed0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
18ee0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
18ef0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
18f00 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
18f10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18f20 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70  3VdbeMemStoreTyp
18f30 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a  e((Mem *)pRet);.
18f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
18f50 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
18f60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
18f70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
18f80 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
18f90 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
18fa0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
18fb0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
18fc0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
18fd0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
18fe0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
18ff0 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
19000 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
19010 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
19020 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19030 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
19040 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
19050 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
19060 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
19070 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
19080 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
19090 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
190a0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
190b0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
190c0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a              -1));.  }.}.