/ Hex Artifact Content
Login

Artifact 84bd15358329f4005a7bceefafc1e798592e987d:


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 6e 65 65 64 73 20 74 6f 20 6d 61  also needs to ma
13a0: 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a  rk all btrees.**
13b0: 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20   as having been 
13c0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
13d0: 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75  zWhere string mu
13e0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
13f0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1400: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
1410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1420: 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70  l take ownership
1430: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
1440: 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69  d memory..*/.voi
1450: 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  d sqlite3VdbeAdd
1460: 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64  ParseSchemaOp(Vd
1470: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20  be *p, int iDb, 
1480: 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20  char *zWhere){. 
1490: 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64   int j;.  int ad
14a0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
14b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72  AddOp3(p, OP_Par
14c0: 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30  seSchema, iDb, 0
14d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 0);.  sqlite3V
14e0: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
14f0: 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f  ddr, zWhere, P4_
1500: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28  DYNAMIC);.  for(
1510: 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44  j=0; j<p->db->nD
1520: 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56  b; j++) sqlite3V
1530: 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20  dbeUsesBtree(p, 
1540: 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  j);.}../*.** Add
1550: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1560: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1570: 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65  value as an inte
1580: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1590: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
15a0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
15b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
15c0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
15d0: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
15e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15f0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1600: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1620: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1630: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1640: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1650: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1660: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1670: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1680: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20   */.  int p4    
1690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16a0: 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61   P4 operand as a
16b0: 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a  n integer */.){.
16c0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
16d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
16e0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
16f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1700: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1710: 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
1720: 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33  PTR(p4), P4_INT3
1730: 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  2);.  return add
1740: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1750: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1760: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1770: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1780: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1790: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
17a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
17b0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
17c0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
17d0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
17e0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
17f0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1800: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1810: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1820: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1830: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1840: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1850: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1860: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1870: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1880: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1890: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
18a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
18b0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
18c0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
18d0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
18e0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
18f0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1900: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1910: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1920: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1930: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1940: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1950: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1960: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1970: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1980: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1990: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
19a0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
19b0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
19c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
19d0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
19e0: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e  ){.  int i = p->
19f0: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65  nLabel++;.  asse
1a00: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
1a10: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1a20: 0a 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31  .  if( (i & (i-1
1a30: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ))==0 ){.    p->
1a40: 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33  aLabel = sqlite3
1a50: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
1a60: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
1a70: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
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 28 69 2a 32 2b 31            (i*2+1
1aa0: 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62  )*sizeof(p->aLab
1ab0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  el[0]));.  }.  i
1ac0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1ad0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1ae0: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1af0: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1b00: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1b10: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
1b40: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
1b50: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
1b60: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
1b70: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1b80: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1b90: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1ba0: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1bb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1bc0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1bd0: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1be0: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1bf0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1c00: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1c10: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1c20: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
1c30: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
1c40: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
1c50: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
1c60: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
1c70: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61   Mark the VDBE a
1c80: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f  s one that can o
1c90: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74  nly be run one t
1ca0: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ime..*/.void sql
1cb0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f  ite3VdbeRunOnlyO
1cc0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  nce(Vdbe *p){.  
1cd0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d  p->runOnlyOnce =
1ce0: 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51   1;.}..#ifdef SQ
1cf0: 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71  LITE_DEBUG /* sq
1d00: 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62  lite3AssertMayAb
1d10: 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a  ort() logic */..
1d20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1d30: 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e  ing type and fun
1d40: 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74  ction are used t
1d50: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1d60: 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a  h all opcodes.**
1d70: 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20   in a Vdbe main 
1d80: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68  program and each
1d90: 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67   of the sub-prog
1da0: 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20  rams (triggers) 
1db0: 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b  it may .** invok
1dc0: 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e  e directly or in
1dd0: 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f  directly. It sho
1de0: 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66  uld be used as f
1df0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1e00: 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64  Op *pOp;.**   Vd
1e10: 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a  beOpIter sIter;.
1e20: 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26  **.**   memset(&
1e30: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
1e40: 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73  (sIter));.**   s
1e50: 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20  Iter.v = v;     
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e70: 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f         // v is o
1e80: 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a  f type Vdbe* .**
1e90: 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d     while( (pOp =
1ea0: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
1eb0: 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f  er)) ){.**     /
1ec0: 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  / Do something w
1ed0: 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a  ith pOp.**   }.*
1ee0: 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  *   sqlite3DbFre
1ef0: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
1f00: 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79  pSub);.** .*/.ty
1f10: 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62  pedef struct Vdb
1f20: 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74  eOpIter VdbeOpIt
1f30: 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f  er;.struct VdbeO
1f40: 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a  pIter {.  Vdbe *
1f50: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
1f60: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20       /* Vdbe to 
1f70: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1f80: 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a  the opcodes of *
1f90: 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  /.  SubProgram *
1fa0: 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f  *apSub;        /
1fb0: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72  * Array of subpr
1fc0: 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20  ograms */.  int 
1fd0: 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20  nSub;           
1fe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ff0: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2000: 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41  pSub */.  int iA
2010: 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddr;            
2020: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2030: 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  of next instruct
2040: 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ion to return */
2050: 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20  .  int iSub;    
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2070: 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61   0 = main progra
2080: 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62  m, 1 = first sub
2090: 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f  -program etc. */
20a0: 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f  .};.static Op *o
20b0: 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70  pIterNext(VdbeOp
20c0: 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65  Iter *p){.  Vdbe
20d0: 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70   *v = p->v;.  Op
20e0: 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70   *pRet = 0;.  Op
20f0: 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70   *aOp;.  int nOp
2100: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62  ;..  if( p->iSub
2110: 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20  <=p->nSub ){..  
2120: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30    if( p->iSub==0
2130: 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20   ){.      aOp = 
2140: 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  v->aOp;.      nO
2150: 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20  p = v->nOp;.    
2160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70  }else{.      aOp
2170: 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69   = p->apSub[p->i
2180: 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20  Sub-1]->aOp;.   
2190: 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75     nOp = p->apSu
21a0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f  b[p->iSub-1]->nO
21b0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  p;.    }.    ass
21c0: 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f  ert( p->iAddr<nO
21d0: 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d  p );..    pRet =
21e0: 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b   &aOp[p->iAddr];
21f0: 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b  .    p->iAddr++;
2200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64  .    if( p->iAdd
2210: 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  r==nOp ){.      
2220: 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20  p->iSub++;.     
2230: 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20   p->iAddr = 0;. 
2240: 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
2250: 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34  pRet->p4type==P4
2260: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
2270: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
2280: 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a   (p->nSub+1)*siz
2290: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
22a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
22b0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
22c0: 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20  p->nSub; j++){. 
22d0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70         if( p->ap
22e0: 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34  Sub[j]==pRet->p4
22f0: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
2300: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2310: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20   if( j==p->nSub 
2320: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70  ){.        p->ap
2330: 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52  Sub = sqlite3DbR
2340: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e  eallocOrFree(v->
2350: 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42  db, p->apSub, nB
2360: 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  yte);.        if
2370: 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20  ( !p->apSub ){. 
2380: 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20           pRet = 
2390: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
23a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  {.          p->a
23b0: 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20  pSub[p->nSub++] 
23c0: 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67  = pRet->p4.pProg
23d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ram;.        }. 
23e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
23f0: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
2400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
2410: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73  if the program s
2420: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20  tored in the VM 
2430: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2440: 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68  pParse may.** th
2450: 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63  row an ABORT exc
2460: 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20  eption (causing 
2470: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  the statement, b
2480: 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72  ut not entire tr
2490: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20  ansaction.** to 
24a0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e  be rolled back).
24b0: 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20   This condition 
24c0: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d  is true if the m
24d0: 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61  ain program or a
24e0: 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61  ny.** sub-progra
24f0: 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  ms contains any 
2500: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2510: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
2520: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
2530: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2540: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2550: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49  **   *  OP_HaltI
2560: 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51  fNull with P1=SQ
2570: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
2580: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
2590: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
25a0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
25b0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
25c0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a  P_VRename.**   *
25d0: 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77    OP_FkCounter w
25e0: 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64  ith P2==0 (immed
25f0: 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
2600: 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a   constraint).**.
2610: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
2620: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
2630: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
2640: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
2650: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
2660: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
2670: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
2680: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
2690: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
26a0: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
26b0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
26c0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
26d0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
26e0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
26f0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
2700: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
2710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
2720: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
2730: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
2740: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
2750: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
2760: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2770: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
2780: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
2790: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
27a0: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f  asAbort = 0;.  O
27b0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p *pOp;.  VdbeOp
27c0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65  Iter sIter;.  me
27d0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
27e0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
27f0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a    sIter.v = v;..
2800: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2810: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2820: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  r))!=0 ){.    in
2830: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e  t opcode = pOp->
2840: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20  opcode;.    if( 
2850: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
2860: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  oy || opcode==OP
2870: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f  _VUpdate || opco
2880: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a  de==OP_VRename .
2890: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28a0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
28b0: 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d       || (opcode=
28c0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
28d0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
28e0: 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64  Op->p2==1) .#end
28f0: 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63  if.     || ((opc
2900: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20  ode==OP_Halt || 
2910: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49  opcode==OP_HaltI
2920: 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26  fNull) .      &&
2930: 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54   (pOp->p1==SQLIT
2940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
2950: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
2960: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
2970: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
2980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2990: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  }.  }.  sqlite3D
29a0: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
29b0: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
29c0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29d0: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
29e0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
29f0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2a00: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
2a10: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
2a20: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
2a30: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
2a40: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
2a50: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
2a60: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
2a70: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
2a80: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
2a90: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
2aa0: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
2ab0: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
2ac0: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
2ad0: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
2ae0: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
2af0: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
2b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
2b10: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2b20: 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rt );.}.#endif /
2b30: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
2b40: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
2b50: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
2b60: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
2b70: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
2b80: 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67   program looking
2b90: 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74   for P2 values t
2ba0: 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  hat are negative
2bb0: 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74  .** on jump inst
2bc0: 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  ructions.  Each 
2bd0: 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20  such value is a 
2be0: 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20  label.  Resolve 
2bf0: 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20  the.** label by 
2c00: 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76  setting the P2 v
2c10: 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72  alue to its corr
2c20: 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  ect non-zero val
2c30: 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ue..**.** This r
2c40: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2c50: 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20   once after all 
2c60: 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65  opcodes have bee
2c70: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
2c80: 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78  * Variable *pMax
2c90: 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20  FuncArgs is set 
2ca0: 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76  to the maximum v
2cb0: 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61  alue of any P2 a
2cc0: 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61  rgument .** to a
2cd0: 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f  n OP_Function, O
2ce0: 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f  P_AggStep or OP_
2cf0: 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20  VFilter opcode. 
2d00: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
2d10: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d  .** sqlite3VdbeM
2d20: 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69  akeReady() to si
2d30: 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72  ze the Vdbe.apAr
2d40: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  g[] array..**.**
2d50: 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 20   The Op.opflags 
2d60: 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e 20  field is set on 
2d70: 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a  all opcodes..*/.
2d80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
2d90: 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65  lveP2Values(Vdbe
2da0: 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75   *p, int *pMaxFu
2db0: 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69  ncArgs){.  int i
2dc0: 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73  ;.  int nMaxArgs
2dd0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73   = *pMaxFuncArgs
2de0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
2df0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
2e00: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
2e10: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f 72  dOnly = 1;.  for
2e20: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
2e30: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
2e40: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
2e50: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
2e60: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 4f  >opcode;..    pO
2e70: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
2e80: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
2e90: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
2ea0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  if( opcode==OP_F
2eb0: 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64  unction || opcod
2ec0: 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 7b  e==OP_AggStep ){
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
2ee0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
2ef0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
2f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f10: 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e  (opcode==OP_Tran
2f20: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
2f30: 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 65  p2!=0) || opcode
2f40: 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a 20  ==OP_Vacuum ){. 
2f50: 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79       p->readOnly
2f60: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
2f70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f80: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
2f90: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
2fa0: 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20  VUpdate ){.     
2fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
2fc0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
2fd0: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
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 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
3000: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
3010: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
3020: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
3030: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
3040: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
3050: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
3060: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
3070: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
3080: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3090: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
30a0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
30b0: 3d 3d 4f 50 5f 4e 65 78 74 20 7c 7c 20 6f 70 63  ==OP_Next || opc
30c0: 6f 64 65 3d 3d 4f 50 5f 53 6f 72 74 65 72 4e 65  ode==OP_SorterNe
30d0: 78 74 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  xt ){.      pOp-
30e0: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
30f0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b  qlite3BtreeNext;
3100: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3110: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3120: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
3130: 70 63 6f 64 65 3d 3d 4f 50 5f 50 72 65 76 20 29  pcode==OP_Prev )
3140: 7b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e  {.      pOp->p4.
3150: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3160: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
3170: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3180: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3190: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
31a0: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
31b0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
31c0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
31d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
31e0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
31f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
3200: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
3210: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
3220: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3230: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
3240: 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65  bel);.  p->aLabe
3250: 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46  l = 0;..  *pMaxF
3260: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
3270: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  gs;.}../*.** Ret
3280: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
3290: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
32a0: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
32b0: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
32c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
32d0: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
32e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
32f0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3300: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
3310: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
3320: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
3330: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
3340: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
3350: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
3360: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
3370: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
3380: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3390: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
33a0: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
33b0: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
33c0: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
33d0: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
33e0: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
33f0: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
3400: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
3410: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
3420: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
3430: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
3440: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
3450: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
3460: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
3470: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
3480: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
3490: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
34a0: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
34b0: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
34c0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
34d0: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
34e0: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
34f0: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
3500: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
3510: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
3520: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
3530: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
3540: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
3550: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
3560: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
3570: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
3580: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
3590: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
35a0: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
35b0: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
35c0: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
35d0: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
35e0: 61 73 73 65 72 74 28 20 70 2d 3e 62 74 72 65 65  assert( p->btree
35f0: 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20 72 65  Mask==0 );..  re
3600: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
3610: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
3620: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
3630: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
3640: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
3650: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
3660: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
3670: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
3680: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
3690: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73  n the.** address
36a0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70   of the first op
36b0: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  eration added..*
36c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
36d0: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20  eAddOpList(Vdbe 
36e0: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62  *p, int nOp, Vdb
36f0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
3700: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  Op){.  int addr;
3710: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3720: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3730: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3740: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3750: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77  nOpAlloc && grow
3760: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
3770: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
3780: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b    addr = p->nOp;
3790: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f  .  if( ALWAYS(nO
37a0: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  p>0) ){.    int 
37b0: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73  i;.    VdbeOpLis
37c0: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61  t const *pIn = a
37d0: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  Op;.    for(i=0;
37e0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e   i<nOp; i++, pIn
37f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ++){.      int p
3800: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20  2 = pIn->p2;.   
3810: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20     VdbeOp *pOut 
3820: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72  = &p->aOp[i+addr
3830: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f  ];.      pOut->o
3840: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63  pcode = pIn->opc
3850: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  ode;.      pOut-
3860: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20  >p1 = pIn->p1;. 
3870: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26       if( p2<0 &&
3880: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50   (sqlite3OpcodeP
3890: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
38a0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
38b0: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  MP)!=0 ){.      
38c0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
38d0: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
38e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38f0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
3900: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3910: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
3920: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
3930: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3940: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
3950: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
3960: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
3970: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
3980: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
3990: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
39a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
39b0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
39c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
39d0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
39e0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
39f0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
3a00: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3a10: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
3a20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
3a30: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
3a40: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3a50: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
3a60: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3a70: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3a80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3a90: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3aa0: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3ab0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
3ac0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
3ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ae0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
3af0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
3b00: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
3b10: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3b20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b30: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
3b40: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
3b50: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
3b60: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
3b70: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
3b80: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
3b90: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
3ba0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
3bb0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
3bc0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
3bd0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
3be0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
3bf0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3c00: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
3c10: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
3c20: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
3c30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
3c40: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
3c50: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
3c60: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
3c70: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
3c80: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
3c90: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
3ca0: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
3cb0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3cc0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3cd0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
3ce0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3cf0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
3d00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
3d10: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
3d20: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
3d30: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3d40: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
3d50: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
3d60: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
3d70: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
3d80: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3d90: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
3da0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
3db0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
3dc0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
3dd0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3de0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
3df0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
3e00: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
3e10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
3e20: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3e30: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
3e40: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
3e50: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
3e60: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
3e70: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
3e80: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
3e90: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
3ea0: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
3eb0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
3ec0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
3ed0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
3ee0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
3ef0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
3f00: 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65  nt addr){.  asse
3f10: 72 74 28 20 61 64 64 72 3e 3d 30 20 7c 7c 20 70  rt( addr>=0 || p
3f20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3f30: 65 64 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  ed );.  if( addr
3f40: 3e 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  >=0 ) sqlite3Vdb
3f50: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
3f60: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a  r, p->nOp);.}...
3f70: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  /*.** If the inp
3f80: 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  ut FuncDef struc
3f90: 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61  ture is ephemera
3fa0: 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e  l, then free it.
3fb0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63    If.** the Func
3fc0: 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72  Def is not epher
3fd0: 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  mal, then do not
3fe0: 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hing..*/.static 
3ff0: 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72  void freeEphemer
4000: 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74  alFunction(sqlit
4010: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
4020: 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c  *pDef){.  if( AL
4030: 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 70  WAYS(pDef) && (p
4040: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
4050: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
4060: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4070: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
4080: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
4090: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
40a0: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c  Array(sqlite3 *,
40b0: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a   Op *, int);../*
40c0: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20  .** Delete a P4 
40d0: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61  value if necessa
40e0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
40f0: 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65  id freeP4(sqlite
4100: 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70  3 *db, int p4typ
4110: 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20  e, void *p4){.  
4120: 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73  if( p4 ){.    as
4130: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20  sert( db );.    
4140: 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29  switch( p4type )
4150: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  {.      case P4_
4160: 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  REAL:.      case
4170: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20   P4_INT64:.     
4180: 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43   case P4_DYNAMIC
4190: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
41a0: 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63  KEYINFO:.      c
41b0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
41c0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
41d0: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a 20  EYINFO_HANDOFF: 
41e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
41f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 3b  3DbFree(db, p4);
4200: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4220: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b  se P4_MPRINTF: {
4230: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
4240: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4250: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
4260: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
4270: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4280: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
4290: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
42a0: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
42b0: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
42c0: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
42d0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
42e0: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
42f0: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
4300: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4310: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4320: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
4330: 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30  ata(pVdbeFunc, 0
4340: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4350: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 64  e3DbFree(db, pVd
4360: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
4370: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4380: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
4390: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
43a0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
43b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63  nction(db, (Func
43c0: 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  Def*)p4);.      
43d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
43e0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
43f0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  EM: {.        if
4400: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4410: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
4420: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4430: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
4440: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
4450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4460: 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a    Mem *p = (Mem*
4470: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73  )p4;.          s
4480: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4490: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
44a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
44b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
44c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
44d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
44e0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
44f0: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
4500: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
4510: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
4520: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
4530: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
4540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4550: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
4560: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
4570: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
4580: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
4590: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
45a0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
45b0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
45c0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
45d0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
45e0: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
45f0: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
4600: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
4610: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
4620: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
4630: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
4640: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
4650: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
4660: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
4670: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
4680: 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  +){.      freeP4
4690: 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  (db, pOp->p4type
46a0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69  , pOp->p4.p);.#i
46b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
46c0: 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  G.      sqlite3D
46d0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
46e0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
46f0: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
4700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4710: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
4720: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
4730: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
4740: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
4750: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
4760: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
4770: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
4780: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
4790: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
47a0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
47b0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
47c0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
47d0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
47e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
47f0: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
4800: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
4810: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
4820: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
4830: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
4840: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
4850: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
4860: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
4870: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
4880: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
4890: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
48a0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
48b0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
48c0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56   p->aOp ){.    V
48d0: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
48e0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
48f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
4900: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
4910: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
4920: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
4930: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
4940: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
4950: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
4960: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a   = OP_Noop;.  }.
4970: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
4980: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
4990: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
49a0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
49b0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
49c0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
49d0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
49e0: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
49f0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
4a00: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
4a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
4a20: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
4a30: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
4a40: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
4a50: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
4a60: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
4a70: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
4a80: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
4a90: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
4aa0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
4ab0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
4ac0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4ad0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4ae0: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
4af0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
4b00: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
4b10: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
4b20: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
4b30: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
4b40: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
4b50: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
4b60: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
4b70: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
4b80: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
4b90: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
4ba0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
4bb0: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
4bc0: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
4bd0: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
4be0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4bf0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
4c00: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
4c10: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
4c20: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
4c30: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
4c40: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
4c50: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
4c60: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
4c70: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
4c80: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
4c90: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
4ca0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4cb0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
4cc0: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
4cd0: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
4ce0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
4cf0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
4d00: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
4d10: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
4d20: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
4d30: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
4d40: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
4d50: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
4d60: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
4d70: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
4d80: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
4d90: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
4da0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
4db0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
4dc0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
4dd0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
4de0: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
4df0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
4e00: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
4e10: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
4e20: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
4e30: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
4e40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
4e50: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
4e60: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
4e70: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
4e80: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
4e90: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4ea0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
4eb0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
4ec0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4ed0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4ee0: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
4ef0: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
4f00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
4f10: 69 66 20 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e  if ( n!=P4_KEYIN
4f20: 46 4f 20 26 26 20 6e 21 3d 50 34 5f 56 54 41 42  FO && n!=P4_VTAB
4f30: 20 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50   ) {.      freeP
4f40: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
4f50: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
4f60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4f70: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4f80: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  p->nOp>0 );.  as
4f90: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
4fa0: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
4fb0: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
4fc0: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a  p->nOp - 1;.  }.
4fd0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
4fe0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28  addr];.  freeP4(
4ff0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
5000: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70   pOp->p4.p);.  p
5010: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
5020: 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20  if( n==P4_INT32 
5030: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20  ){.    /* Note: 
5040: 74 68 69 73 20 63 61 73 74 20 69 73 20 73 61 66  this cast is saf
5050: 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 6f  e, because the o
5060: 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74  rigin data point
5070: 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20   was an int.    
5080: 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 73 74  ** that was cast
5090: 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61   to a (const cha
50a0: 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70  r *). */.    pOp
50b0: 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f  ->p4.i = SQLITE_
50c0: 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b  PTR_TO_INT(zP4);
50d0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
50e0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d   = P4_INT32;.  }
50f0: 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20  else if( zP4==0 
5100: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5110: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70   = 0;.    pOp->p
5120: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5130: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
5140: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b  n==P4_KEYINFO ){
5150: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
5160: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  eyInfo;.    int 
5170: 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a  nField, nByte;..
5180: 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b      nField = ((K
5190: 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46  eyInfo*)zP4)->nF
51a0: 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20  ield;.    nByte 
51b0: 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e  = sizeof(*pKeyIn
51c0: 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29  fo) + (nField-1)
51d0: 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f  *sizeof(pKeyInfo
51e0: 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46  ->aColl[0]) + nF
51f0: 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e  ield;.    pKeyIn
5200: 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  fo = sqlite3DbMa
5210: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 42 79 74 65  llocRaw(0, nByte
5220: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  );.    pOp->p4.p
5230: 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
5240: 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  fo;.    if( pKey
5250: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38  Info ){.      u8
5260: 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20   *aSortOrder;.  
5270: 20 20 20 20 6d 65 6d 63 70 79 28 28 63 68 61 72      memcpy((char
5280: 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c  *)pKeyInfo, zP4,
5290: 20 6e 42 79 74 65 20 2d 20 6e 46 69 65 6c 64 29   nByte - nField)
52a0: 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64  ;.      aSortOrd
52b0: 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  er = pKeyInfo->a
52c0: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  SortOrder;.     
52d0: 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20   if( aSortOrder 
52e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49  ){.        pKeyI
52f0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
5300: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5310: 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  *)&pKeyInfo->aCo
5320: 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20  ll[nField];.    
5330: 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49      memcpy(pKeyI
5340: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c  nfo->aSortOrder,
5350: 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69   aSortOrder, nFi
5360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eld);.      }.  
5370: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5380: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
5390: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
53a0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
53b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f  ed = 1;.      pO
53c0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
53d0: 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  OTUSED;.    }.  
53e0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
53f0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
5400: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
5410: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
5420: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5430: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d   P4_KEYINFO;.  }
5440: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56  else if( n==P4_V
5450: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  TAB ){.    pOp->
5460: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50  p4.p = (void*)zP
5470: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  4;.    pOp->p4ty
5480: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20  pe = P4_VTAB;.  
5490: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63    sqlite3VtabLoc
54a0: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29  k((VTable *)zP4)
54b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
54c0: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64  VTable *)zP4)->d
54d0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65  b==p->db );.  }e
54e0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
54f0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5500: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
5510: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69  Op->p4type = (si
5520: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d  gned char)n;.  }
5530: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
5540: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33  =0 ) n = sqlite3
5550: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20  Strlen30(zP4);. 
5560: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
5570: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5580: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
5590: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
55a0: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
55b0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
55c0: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
55d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
55e0: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
55f0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
5600: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
5610: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
5620: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
5630: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
5640: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
5650: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
5660: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
5670: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
5680: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
5690: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
56a0: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
56b0: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
56c0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
56d0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
56e0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
56f0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
5700: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
5710: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
5720: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
5730: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
5740: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
5750: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
5760: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
5770: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
5780: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
5790: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
57a0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
57b0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57c0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
57d0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
57e0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
57f0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
5800: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
5810: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5820: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
5830: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5840: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
5850: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
5860: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
5870: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
5880: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
5890: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
58a0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
58b0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
58c0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
58d0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
58e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
58f0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
5900: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
5910: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
5920: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
5930: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
5940: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
5950: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
5960: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
5970: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
5980: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
5990: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
59a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
59b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
59c0: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
59d0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
59e0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
59f0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
5a00: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
5a10: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
5a20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
5a30: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
5a40: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
5a50: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
5a60: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
5a70: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
5a80: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
5a90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
5aa0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
5ab0: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
5ac0: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
5ad0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
5ae0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
5af0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
5b00: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
5b10: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
5b20: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
5b30: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
5b40: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
5b50: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
5b60: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
5b70: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
5b80: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
5b90: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
5ba0: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
5bb0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
5bc0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
5bd0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
5be0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
5bf0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
5c00: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
5c10: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
5c20: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
5c30: 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62  lgrind..**.** Ab
5c40: 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 20 53  out the #ifdef S
5c50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
5c60: 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  :  Normally, thi
5c70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
5c80: 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c  er called.** unl
5c90: 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54  ess p->nOp>0.  T
5ca0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
5cb0: 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66  n the absense of
5cc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
5cd0: 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61  CE,.** an OP_Tra
5ce0: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ce instruction i
5cf0: 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65  s always inserte
5d00: 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
5d10: 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73  Get() as soon as
5d20: 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69  .** a new VDBE i
5d30: 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77  s created.  So w
5d40: 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 73 65  e are free to se
5d50: 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70  t addr to p->nOp
5d60: 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61  -1 without.** ha
5d70: 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63  ving to double-c
5d80: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
5d90: 65 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  e that the resul
5da0: 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  t is non-negativ
5db0: 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c  e. But.** if SQL
5dc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69  ITE_OMIT_TRACE i
5dd0: 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f  s defined, the O
5de0: 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74  P_Trace is omitt
5df0: 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65  ed and we do nee
5e00: 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68  d to.** check th
5e10: 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f  e value of p->nO
5e20: 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  p-1 before conti
5e30: 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70  nuing..*/.VdbeOp
5e40: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
5e50: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
5e60: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
5e70: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
5e80: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
5e90: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
5ea0: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
5eb0: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
5ec0: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
5ed0: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
5ee0: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
5ef0: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
5f00: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
5f10: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
5f20: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
5f30: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
5f40: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
5f50: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
5f60: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
5f70: 20 61 64 64 72 3c 30 20 29 7b 0a 23 69 66 64 65   addr<0 ){.#ifde
5f80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
5f90: 41 43 45 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  ACE.    if( p->n
5fa0: 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28  Op==0 ) return (
5fb0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
5fc0: 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 20  #endif.    addr 
5fd0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5fe0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
5ff0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6000: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
6010: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6020: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
6030: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6040: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
6050: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
6060: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
6070: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
6080: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6090: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
60a0: 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  IN) || !defined(
60b0: 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c  NDEBUG) \.     |
60c0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
60d0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
60e0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
60f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
6100: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
6110: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
6120: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
6130: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
6140: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
6150: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
6160: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
6170: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
6180: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
6190: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
61a0: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
61b0: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
61c0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
61d0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
61e0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
61f0: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
6200: 4f 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61  O_STATIC:.    ca
6210: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b  se P4_KEYINFO: {
6220: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  .      int i, j;
6230: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
6240: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
6250: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
6260: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6270: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6280: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
6290: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
62a0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
62b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
62c0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
62d0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
62e0: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
62f0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6300: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6310: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6320: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
6330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
6340: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6350: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
6360: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6370: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
6380: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
6390: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
63a0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
63c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
63d0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
63e0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
63f0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6400: 64 65 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d  der && pKeyInfo-
6410: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29  >aSortOrder[j] )
6420: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
6430: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a  emp[i++] = '-';.
6440: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6450: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
6460: 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a  emp[i], pColl->z
6470: 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20  Name,n+1);.     
6480: 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20       i += n;.   
6490: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
64a0: 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +4<nTemp-6 ){.  
64b0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
64c0: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c  zTemp[i],",nil",
64d0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  4);.          i 
64e0: 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
6500: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
6510: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
6520: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
6530: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
6540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6550: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
6560: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
6570: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
6580: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
6590: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
65a0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
65b0: 2c 20 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73  , "collseq(%.20s
65c0: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
65d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
65e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
65f0: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
6600: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
6610: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
6620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6630: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
6640: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
6650: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
6660: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
6670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6680: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
6690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
66a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
66b0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
66c0: 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a  *pOp->p4.pI64);.
66d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49   }.    case P4_I
66f0: 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71  NT32: {.      sq
6700: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6710: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
6720: 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20  ", pOp->p4.i);. 
6730: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6740: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45  }.    case P4_RE
6750: 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AL: {.      sqli
6760: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6770: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
6780: 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65  g", *pOp->p4.pRe
6790: 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
67a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
67b0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
67c0: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70   Mem *pMem = pOp
67d0: 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20  ->p4.pMem;.     
67e0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
67f0: 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
6800: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d        zP4 = pMem
6810: 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ->z;.      }else
6820: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6830: 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
6840: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6850: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6860: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65  emp, "%lld", pMe
6870: 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d  m->u.i);.      }
6880: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
6890: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
68b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
68c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67  p, zTemp, "%.16g
68d0: 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20  ", pMem->r);.   
68e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
68f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
6900: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ull ){.        s
6910: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6920: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e  nTemp, zTemp, "N
6930: 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ULL");.      }el
6940: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
6950: 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  rt( pMem->flags 
6960: 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
6970: 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c        zP4 = "(bl
6980: 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ob)";.      }.  
6990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
69a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
69b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
69c0: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
69d0: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
69e0: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
69f0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d  = pOp->p4.pVtab-
6a00: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71  >pVtab;.      sq
6a10: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6a20: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74  Temp, zTemp, "vt
6a30: 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 62  ab:%p:%p", pVtab
6a40: 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  , pVtab->pModule
6a50: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6a60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6a70: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41   case P4_INTARRA
6a80: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y: {.      sqlit
6a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
6aa0: 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72  p, zTemp, "intar
6ab0: 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ray");.      bre
6ac0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ad0: 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  se P4_SUBPROGRAM
6ae0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
6af0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6b00: 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 61  , zTemp, "progra
6b10: 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  m");.      break
6b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6b30: 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20   P4_ADVANCE: {. 
6b40: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6b50: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
6b60: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6b70: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d  t: {.      zP4 =
6b80: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
6b90: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a    if( zP4==0 ){.
6ba0: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54          zP4 = zT
6bb0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65  emp;.        zTe
6bc0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61   }.    }.  }.  a
6be0: 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b  ssert( zP4!=0 );
6bf0: 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d  .  return zP4;.}
6c00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
6c10: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
6c20: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
6c30: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
6c40: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
6c50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
6c60: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
6c70: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
6c80: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
6c90: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
6ca0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
6cb0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
6cc0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
6cd0: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
6ce0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
6cf0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
6d00: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
6d10: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
6d20: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
6d30: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
6d40: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
6d50: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
6d60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6d70: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
6d80: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
6d90: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
6da0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
6db0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
6dc0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
6dd0: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
6de0: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
6df0: 38 20 29 3b 0a 20 20 70 2d 3e 62 74 72 65 65 4d  8 );.  p->btreeM
6e00: 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
6e10: 29 31 29 3c 3c 69 3b 0a 20 20 69 66 28 20 69 21  )1)<<i;.  if( i!
6e20: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
6e30: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
6e40: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
6e50: 0a 20 20 20 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  .    p->lockMask
6e60: 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29   |= ((yDbMask)1)
6e70: 3c 3c 69 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  <<i;.  }.}..#if 
6e80: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6e90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
6ea0: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
6eb0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
6ec0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  If SQLite is com
6ed0: 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74  piled to support
6ee0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
6ef0: 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72  de and to be thr
6f00: 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73  eadsafe,.** this
6f10: 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73   routine obtains
6f20: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
6f30: 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
6f40: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
6f50: 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62  re.** that may b
6f60: 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68  e accessed by th
6f70: 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
6f80: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64  n argument. In d
6f90: 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a  oing so it also.
6fa0: 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68  ** sets the BtSh
6fb0: 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f  ared.db member o
6fc0: 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74  f each of the Bt
6fd0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
6fe0: 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74  s, ensuring.** t
6ff0: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
7000: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
7010: 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64  lback is invoked
7020: 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   if required..**
7030: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73  .** If SQLite is
7040: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20   not threadsafe 
7050: 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74  but does support
7060: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
7070: 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69  de, then.** sqli
7080: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20  te3BtreeEnter() 
7090: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65  is invoked to se
70a0: 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64  t the BtShared.d
70b0: 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f  b variables.** o
70c0: 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65  f all of BtShare
70d0: 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63  d structures acc
70e0: 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20  essible via the 
70f0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
7100: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
7110: 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a  ith the VM..**.*
7120: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
7130: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e  ot threadsafe an
7140: 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  d does not suppo
7150: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  rt shared-cache 
7160: 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75  mode, this.** fu
7170: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7180: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e  p..**.** The p->
7190: 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20  btreeMask field 
71a0: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
71b0: 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20  all btrees that 
71c0: 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a  the prepared .**
71d0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c   statement p wil
71e0: 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74  l ever use.  Let
71f0: 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72   N be the number
7200: 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62   of bits in p->b
7210: 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72  treeMask.** corr
7220: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72  esponding to btr
7230: 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61  ees that use sha
7240: 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e  red cache.  Then
7250: 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a   the runtime of.
7260: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
7270: 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20  is N*N.  But as 
7280: 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65  N is rarely more
7290: 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68   than 1, this sh
72a0: 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61  ould not.** be a
72b0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69   problem..*/.voi
72c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74  d sqlite3VdbeEnt
72d0: 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  er(Vdbe *p){.  i
72e0: 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20  nt i;.  yDbMask 
72f0: 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20  mask;.  sqlite3 
7300: 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a  *db;.  Db *aDb;.
7310: 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28    int nDb;.  if(
7320: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20   p->lockMask==0 
7330: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
7340: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
7350: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
7360: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
7370: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
7380: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b  .  for(i=0, mask
7390: 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20  =1; i<nDb; i++, 
73a0: 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20  mask += mask){. 
73b0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 28     if( i!=1 && (
73c0: 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61  mask & p->lockMa
73d0: 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53  sk)!=0 && ALWAYS
73e0: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
73f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7400: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69  BtreeEnter(aDb[i
7410: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
7420: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
7430: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7440: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
7450: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
7460: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20  EADSAFE>0./*.** 
7470: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68  Unlock all of th
7480: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75  e btrees previou
7490: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20  sly locked by a 
74a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
74b0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76  dbeEnter()..*/.v
74c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
74d0: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
74e0: 20 69 6e 74 20 69 3b 0a 20 20 79 44 62 4d 61 73   int i;.  yDbMas
74f0: 6b 20 6d 61 73 6b 3b 0a 20 20 73 71 6c 69 74 65  k mask;.  sqlite
7500: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62  3 *db;.  Db *aDb
7510: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69  ;.  int nDb;.  i
7520: 66 28 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d  f( p->lockMask==
7530: 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
7540: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
7550: 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  */.  db = p->db;
7560: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
7570: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
7580: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61  b;.  for(i=0, ma
7590: 73 6b 3d 31 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  sk=1; i<nDb; i++
75a0: 2c 20 6d 61 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b  , mask += mask){
75b0: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
75c0: 20 28 6d 61 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b   (mask & p->lock
75d0: 4d 61 73 6b 29 21 3d 30 20 26 26 20 41 4c 57 41  Mask)!=0 && ALWA
75e0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30  YS(aDb[i].pBt!=0
75f0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7600: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62  e3BtreeLeave(aDb
7610: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a  [i].pBt);.    }.
7620: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
7630: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
7640: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
7650: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7660: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
7670: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
7680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7690: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
76a0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
76b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
76c0: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
76d0: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
76e0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
76f0: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
7700: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
7710: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
7720: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
7730: 64 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20  d %4d %-4s %.2X 
7740: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
7750: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
7760: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
7770: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
7780: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
7790: 3b 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  ;.  fprintf(pOut
77a0: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
77b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
77c0: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
77d0: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
77e0: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
77f0: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
7800: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7810: 42 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a  BUG.      pOp->z
7820: 43 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a  Comment ? pOp->z
7830: 43 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c  Comment : "".#el
7840: 73 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64  se.      "".#end
7850: 69 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  if.  );.  fflush
7860: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
7870: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
7880: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
7890: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
78a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
78b0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
78c0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
78d0: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
78e0: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
78f0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7900: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
7910: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
7920: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
7930: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
7940: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
7950: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
7960: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
7970: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7980: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
7990: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
79a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
79b0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
79c0: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
79d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
79e0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
79f0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
7a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
7a10: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
7a20: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
7a30: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
7a40: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
7a50: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
7a60: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
7a70: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
7a80: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
7a90: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
7aa0: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
7ab0: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
7ac0: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
7ad0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
7ae0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
7af0: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
7b00: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
7b10: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
7b20: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
7b30: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
7b40: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
7b50: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
7b60: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
7b70: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
7b80: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
7b90: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
7ba0: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
7bb0: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
7bc0: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
7bd0: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
7be0: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
7bf0: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
7c00: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
7c10: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
7c20: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
7c30: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
7c40: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
7c50: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
7c60: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
7c70: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
7c80: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
7c90: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
7ca0: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
7cb0: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
7cc0: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
7cd0: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
7ce0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
7cf0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
7d00: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
7d10: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
7d20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
7d30: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
7d40: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
7d50: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
7d60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7d70: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
7d80: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
7d90: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
7da0: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
7db0: 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20  = MEM_Invalid;. 
7dc0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
7dd0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
7de0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
7df0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
7e00: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
7e10: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
7e20: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
7e30: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
7e40: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
7e50: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
7e60: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
7e70: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
7e80: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
7e90: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
7ea0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
7eb0: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
7ec0: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
7ed0: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
7ee0: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
7ef0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
7f00: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
7f10: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
7f20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
7f30: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7f40: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
7f50: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7f60: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
7f70: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
7f80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7f90: 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23  >v->db, p);.}..#
7fa0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7fb0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7fc0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
7fd0: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
7fe0: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7ff0: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
8000: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
8010: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
8020: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
8030: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
8040: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
8050: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
8060: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
8070: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
8080: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
8090: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
80a0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
80b0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
80c0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
80d0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
80e0: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
80f0: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
8100: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
8110: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
8120: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
8130: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
8140: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
8150: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
8160: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
8170: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
8180: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8190: 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  AN..**.** When p
81a0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69  ->explain==1, fi
81b0: 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f  rst the main pro
81c0: 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20  gram is listed, 
81d0: 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20  then each of.** 
81e0: 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70  the trigger subp
81f0: 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74  rograms are list
8200: 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a  ed one by one..*
8210: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
8220: 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70  eList(.  Vdbe *p
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a     /* The VDBE *
8250: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b  /.){.  int nRow;
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8270: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8280: 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75  top when row cou
8290: 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20  nt reaches this 
82a0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20  */.  int nSub = 
82b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
82c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
82d0: 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73  ber of sub-vdbes
82e0: 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a   seen so far */.
82f0: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
8300: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
8310: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
8320: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a  of sub-vdbes */.
8330: 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b    Mem *pSub = 0;
8340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8350: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
8360: 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79   cell hold array
8370: 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a   of subprogs */.
8380: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8390: 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20  p->db;          
83a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
83b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
83c0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  n */.  int i;   
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
83f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
8400: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8410: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
8420: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8430: 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  code */.  Mem *p
8440: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Mem = &p->aMem[1
8450: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
8460: 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72  * First Mem of r
8470: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
8480: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
8490: 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  in );.  assert( 
84a0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
84b0: 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73  AGIC_RUN );.  as
84c0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
84d0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
84e0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
84f0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8500: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
8510: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
8520: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
8530: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
8540: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
8550: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
8560: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
8570: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
8580: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
8590: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
85a0: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
85b0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
85c0: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
85d0: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
85e0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
85f0: 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74  8);.  p->pResult
8600: 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Set = 0;..  if( 
8610: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
8620: 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  MEM ){.    /* Th
8630: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
8640: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
8650: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
8660: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
8670: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8680: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
8690: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
86a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
86b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
86c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
86d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
86e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
86f0: 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65  tput rows reache
8700: 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61  s nRow, that mea
8710: 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74  ns the.  ** list
8720: 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64  ing has finished
8730: 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65   and sqlite3_ste
8740: 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72  p() should retur
8750: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20  n SQLITE_DONE.. 
8760: 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20   ** nRow is the 
8770: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
8780: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
8790: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70   main program, p
87a0: 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d  lus.  ** the sum
87b0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
87c0: 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72  f rows in all tr
87d0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
87e0: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
87f0: 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20  ** so far.  The 
8800: 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20  nRow value will 
8810: 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20  increase as new 
8820: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8830: 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63  ams are.  ** enc
8840: 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d  ountered, but p-
8850: 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61  >pc will eventua
8860: 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20  lly catch up to 
8870: 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f  nRow..  */.  nRo
8880: 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  w = p->nOp;.  if
8890: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
88a0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
88b0: 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c  rst 8 memory cel
88c0: 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20  ls are used for 
88d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
88e0: 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20   So we will.    
88f0: 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68  ** commandeer th
8900: 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73  e 9th cell to us
8910: 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72  e as storage for
8920: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
8930: 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20  nters.    ** to 
8940: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
8950: 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69  ams.  The VDBE i
8960: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
8970: 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a  have at least 9.
8980: 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a      ** cells.  *
8990: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
89a0: 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70  >nMem>9 );.    p
89b0: 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39  Sub = &p->aMem[9
89c0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d  ];.    if( pSub-
89d0: 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20  >flags&MEM_Blob 
89e0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74  ){.      /* On t
89f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
8a00: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c   sqlite3_step(),
8a10: 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20   pSub will hold 
8a20: 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20  a NULL.  It is. 
8a30: 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69       ** initiali
8a40: 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79  zed to a BLOB by
8a50: 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52   the P4_SUBPROGR
8a60: 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  AM processing lo
8a70: 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  gic below */.   
8a80: 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e     nSub = pSub->
8a90: 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b  n/sizeof(Vdbe*);
8aa0: 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28  .      apSub = (
8ab0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
8ac0: 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20  ub->z;.    }.   
8ad0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
8ae0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52  ; i++){.      nR
8af0: 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e  ow += apSub[i]->
8b00: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nOp;.    }.  }..
8b10: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
8b20: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
8b30: 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78   i<nRow && p->ex
8b40: 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61  plain==2 && p->a
8b50: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50  Op[i].opcode!=OP
8b60: 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  _Explain );.  if
8b70: 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20  ( i>=nRow ){.   
8b80: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
8b90: 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  OK;.    rc = SQL
8ba0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
8bb0: 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49  e if( db->u1.isI
8bc0: 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20  nterrupted ){.  
8bd0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
8be0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20  _INTERRUPT;.    
8bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
8c00: 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  R;.    sqlite3Se
8c10: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
8c20: 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20 73  Msg, db, "%s", s
8c30: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
8c40: 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rc));.  }else{. 
8c50: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
8c60: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28  Op *pOp;.    if(
8c70: 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20   i<p->nOp ){.   
8c80: 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
8c90: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20   line number is 
8ca0: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61  small enough tha
8cb0: 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69  t we are still i
8cc0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d  n the.      ** m
8cd0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a  ain program. */.
8ce0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e        pOp = &p->
8cf0: 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73  aOp[i];.    }els
8d00: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61  e{.      /* We a
8d10: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73  re currently lis
8d20: 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73  ting subprograms
8d30: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
8d40: 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20  ich one and.    
8d50: 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65    ** pick up the
8d60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63   appropriate opc
8d70: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ode. */.      in
8d80: 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20  t j;.      i -= 
8d90: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f  p->nOp;.      fo
8da0: 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b  r(j=0; i>=apSub[
8db0: 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20  j]->nOp; j++){. 
8dc0: 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75         i -= apSu
8dd0: 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  b[j]->nOp;.     
8de0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26   }.      pOp = &
8df0: 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d  apSub[j]->aOp[i]
8e00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8e10: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
8e20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
8e30: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
8e40: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
8e50: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b   SQLITE_INTEGER;
8e60: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
8e70: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
8ea0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
8eb0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
8ec0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
8ed0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
8ee0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
8ef0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
8f00: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
8f10: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
8f20: 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a  e);  /* Opcode *
8f30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
8f40: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
8f50: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
8f60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
8f70: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
8f80: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
8f90: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
8fa0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
8fb0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
8fc0: 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  m++;..      /* W
8fd0: 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61  hen an OP_Progra
8fe0: 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f  m opcode is enco
8ff0: 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20  unter (the only 
9000: 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a  opcode that has.
9010: 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55        ** a P4_SU
9020: 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e  BPROGRAM argumen
9030: 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73  t), expand the s
9040: 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
9050: 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a   of subprograms.
9060: 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e        ** kept in
9070: 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f   p->aMem[9].z to
9080: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72   hold the new pr
9090: 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67  ogram - assuming
90a0: 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d   this subprogram
90b0: 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  .      ** has no
90c0: 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  t already been s
90d0: 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  een..      */.  
90e0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74      if( pOp->p4t
90f0: 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52  ype==P4_SUBPROGR
9100: 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  AM ){.        in
9110: 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b  t nByte = (nSub+
9120: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
9130: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
9140: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
9150: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20  or(j=0; j<nSub; 
9160: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
9170: 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f  if( apSub[j]==pO
9180: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29  p->p4.pProgram )
9190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
91a0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  }.        if( j=
91b0: 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f  =nSub && SQLITE_
91c0: 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d  OK==sqlite3VdbeM
91d0: 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79  emGrow(pSub, nBy
91e0: 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a  te, nSub!=0) ){.
91f0: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20            apSub 
9200: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
9210: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20  )pSub->z;.      
9220: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b      apSub[nSub++
9230: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  ] = pOp->p4.pPro
9240: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  gram;.          
9250: 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d  pSub->flags |= M
9260: 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20  EM_Blob;.       
9270: 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75     pSub->n = nSu
9280: 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  b*sizeof(SubProg
9290: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ram*);.        }
92a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
92b0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
92c0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
92d0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
92e0: 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p1;             
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P1 */.    pMem->
9310: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9320: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9330: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
9340: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
9350: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
9360: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
9390: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
93a0: 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70  E_INTEGER;.    p
93b0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
93c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
93d0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
93e0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20   = pOp->p3;     
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20       /* P3 */.  
9410: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9420: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9430: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9440: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
9450: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
9460: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
9470: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
9480: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
9490: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
94a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
94b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
94c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
94d0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
94e0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
94f0: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
9500: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
9510: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
9520: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
9530: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
9540: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
9550: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
9560: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9570: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
9580: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
9590: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
95a0: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
95b0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
95c0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
95d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
95e0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
95f0: 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  EXT;.    pMem++;
9600: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
9610: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
9620: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
9630: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
9640: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
9650: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
9660: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9680: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
9690: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
96a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
96b0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
96c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
96d0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
96e0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
96f0: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
9700: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
9710: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
9720: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
9730: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
9740: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
9750: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
9760: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
9770: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
9780: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
9790: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
97a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
97b0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
97c0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
97d0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
97e0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
97f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
9800: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
9810: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
9820: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
9830: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
9840: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
9850: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
9860: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
9870: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
9880: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
9890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
98a0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
98b0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
98c0: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
98d0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
98e0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
98f0: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
9900: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
9910: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
9920: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
9930: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9940: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
9950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9960: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
9970: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
9980: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
9990: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
99a0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
99b0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
99c0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
99d0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
99e0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
99f0: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
9a00: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
9a10: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
9a20: 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20  ;.  if( nOp<1 ) 
9a30: 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20  return;.  pOp = 
9a40: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66  &p->aOp[0];.  if
9a50: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
9a60: 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e  P_Trace && pOp->
9a70: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63  p4.z!=0 ){.    c
9a80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
9a90: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68  Op->p4.z;.    wh
9aa0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
9ab0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
9ac0: 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20     printf("SQL: 
9ad0: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  [%s]\n", z);.  }
9ae0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9af0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9b00: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
9b10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9b20: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
9b30: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
9b40: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
9b50: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
9b60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9b70: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
9b80: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
9b90: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
9ba0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
9bb0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
9bc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
9bd0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
9be0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
9bf0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
9c00: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  p->opcode==OP_Tr
9c10: 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  ace && pOp->p4.z
9c20: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
9c30: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
9c40: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
9c50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
9c60: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
9c70: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
9c80: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
9c90: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
9ca0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
9cb0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
9cc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9cd0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
9ce0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
9cf0: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
9d00: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
9d10: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
9d20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9d30: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
9d40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d50: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
9d60: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
9d70: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
9d80: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
9d90: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
9da0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
9db0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
9dc0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9dd0: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
9de0: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
9df0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
9e00: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
9e10: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
9e20: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
9e30: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
9e40: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
9e50: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
9e60: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
9e70: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
9e80: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
9e90: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
9ea0: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
9eb0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
9ec0: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
9ed0: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
9ee0: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
9ef0: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
9f00: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
9f10: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
9f20: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
9f30: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
9f40: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
9f50: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
9f60: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
9f70: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
9f80: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
9f90: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
9fa0: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
9fb0: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
9fc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
9fd0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
9fe0: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
9ff0: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
a000: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
a010: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
a020: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
a030: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
a040: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
a050: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
a060: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
a070: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
a080: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
a090: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
a0a0: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
a0b0: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
a0c0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
a0d0: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
a0e0: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
a0f0: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
a100: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
a110: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
a120: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
a130: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
a140: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
a150: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
a160: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
a170: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
a180: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
a190: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
a1a0: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
a1b0: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
a1c0: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
a1d0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
a1e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a1f0: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
a200: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
a210: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
a220: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
a230: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
a240: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
a260: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
a270: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
a280: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
a290: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
a2a0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
a2b0: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
a2c0: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
a2d0: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
a2e0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
a2f0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
a300: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
a310: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
a320: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
a330: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
a340: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
a350: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
a360: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
a370: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
a380: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
a390: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
a3a0: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
a3b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
a3c0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
a3d0: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
a3e0: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
a3f0: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
a400: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
a410: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
a420: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
a430: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
a440: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
a460: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
a470: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
a480: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
a490: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
a4a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
a4b0: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
a4c0: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
a4d0: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
a4e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
a4f0: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
a500: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
a510: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
a520: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
a530: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
a540: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
a550: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
a560: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a570: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
a580: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
a590: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
a5a0: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
a5b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
a5c0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
a5d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
a5e0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
a5f0: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d  OE_Abort;.  p->m
a600: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
a610: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
a620: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
a630: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
a640: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
a650: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
a660: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
a670: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
a680: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
a690: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
a6a0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
a6b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
a6c0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
a6d0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
a6e0: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
a6f0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
a700: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
a710: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
a720: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
a730: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
a740: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
a750: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
a760: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
a770: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
a780: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
a790: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
a7a0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
a7b0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
a7c0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
a7d0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
a7e0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
a7f0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
a800: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
a810: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
a820: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
a830: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
a840: 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e  ed exact once on
a850: 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20   a each virtual 
a860: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65  machine..** Afte
a870: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
a880: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20  s called the VM 
a890: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67  has been "packag
a8a0: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79  ed" and is ready
a8b0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74  .** to run.  Aft
a8c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
a8d0: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65  is called, futhe
a8e0: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
a8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a900: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
a910: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
a920: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
a930: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
a940: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
a950: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
a960: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
a970: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
a980: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
a990: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
a9a0: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
a9b0: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
a9c0: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
a9d0: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
a9e0: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
a9f0: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
aa00: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
aa10: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
aa20: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
aa30: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
aa40: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
aa50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa60: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
aa70: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
aa90: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
aaa0: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
aac0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
aad0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
aae0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
aaf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
ab00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
ab10: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ab40: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
ab50: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
ab80: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
ab90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
aba0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
abb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
abc0: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
abd0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
abe0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
abf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ac00: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
ac10: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
ac20: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
ac50: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
ac60: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ac90: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
aca0: 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20  *zCsr;          
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
acc0: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
acd0: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
ace0: 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20  /.  u8 *zEnd;   
acf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad00: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
ad10: 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20   past allocated 
ad20: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
ad30: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
ad40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
ad50: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
ad60: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
ad70: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
ad80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ad90: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
ada0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
adb0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
adc0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
add0: 49 4e 49 54 20 29 3b 0a 20 20 64 62 20 3d 20 70  INIT );.  db = p
ade0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
adf0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ae00: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
ae10: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
ae20: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
ae30: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
ae40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
ae50: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
ae60: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
ae70: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
ae80: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
ae90: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
aea0: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
aeb0: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
aec0: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
aed0: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
aee0: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
aef0: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
af00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
af10: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
af20: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
af30: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
af40: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
af50: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
af60: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
af70: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
af80: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
af90: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
afa0: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
afb0: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
afc0: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
afd0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
afe0: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
aff0: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
b000: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
b010: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
b020: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
b030: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
b040: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
b050: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
b060: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
b070: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
b080: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
b090: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
b0a0: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
b0b0: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
b0c0: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
b0d0: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
b0e0: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
b0f0: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
b100: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
b110: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
b120: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
b130: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
b140: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 2f 2a 20  >nOp];       /* 
b150: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
b160: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
b170: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
b180: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 41  )&p->aOp[p->nOpA
b190: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74  lloc];  /* First
b1a0: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f   byte past end o
b1b0: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72  f zCsr[] */..  r
b1c0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
b1d0: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75  , &nArg);.  p->u
b1e0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
b1f0: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73   (u8)(pParse->is
b200: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50  MultiWrite && pP
b210: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b  arse->mayAbort);
b220: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
b230: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
b240: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20  0 ){.    nMem = 
b250: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  10;.  }.  memset
b260: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a  (zCsr, 0, zEnd-z
b270: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20  Csr);.  zCsr += 
b280: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26  (zCsr - (u8*)0)&
b290: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  7;.  assert( EIG
b2a0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
b2b0: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e  T(zCsr) );.  p->
b2c0: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
b2d0: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
b2e0: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
b2f0: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
b300: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
b310: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
b320: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
b330: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
b340: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
b350: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
b360: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
b370: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
b380: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
b390: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
b3a0: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
b3b0: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
b3c0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
b3d0: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
b3e0: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
b3f0: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
b400: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
b410: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
b420: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
b430: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
b440: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
b450: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
b460: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
b470: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
b480: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
b490: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
b4a0: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
b4b0: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
b4c0: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
b4d0: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
b4e0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
b4f0: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
b500: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
b510: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
b520: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
b530: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
b540: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e  Mem), &zCsr, zEn
b550: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
b560: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53  p->aVar = allocS
b570: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56  pace(p->aVar, nV
b580: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  ar*sizeof(Mem), 
b590: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
b5a0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
b5b0: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
b5c0: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
b5d0: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43  izeof(Mem*), &zC
b5e0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b5f0: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
b600: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b610: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
b620: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72  of(char*), &zCsr
b630: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
b640: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20  .    p->apCsr = 
b650: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70  allocSpace(p->ap
b660: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a  Csr, nCursor*siz
b670: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
b680: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b690: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73              &zCs
b6a0: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
b6b0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c  ;.    p->aOnceFl
b6c0: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ag = allocSpace(
b6d0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
b6e0: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  nce, &zCsr, zEnd
b6f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  , &nByte);.    i
b700: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
b710: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
b720: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
b730: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
b740: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
b750: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64  >pFree;.    zEnd
b760: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b   = &zCsr[nByte];
b770: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65  .  }while( nByte
b780: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
b790: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e  ailed );..  p->n
b7a0: 43 75 72 73 6f 72 20 3d 20 28 75 31 36 29 6e 43  Cursor = (u16)nC
b7b0: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63  ursor;.  p->nOnc
b7c0: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20  eFlag = nOnce;. 
b7d0: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a   if( p->aVar ){.
b7e0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79      p->nVar = (y
b7f0: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66  nVar)nVar;.    f
b800: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
b810: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
b820: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
b830: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70  EM_Null;.      p
b840: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
b850: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  b;.    }.  }.  i
b860: 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20  f( p->azVar ){. 
b870: 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50     p->nzVar = pP
b880: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20  arse->nzVar;.   
b890: 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72   memcpy(p->azVar
b8a0: 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  , pParse->azVar,
b8b0: 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66   p->nzVar*sizeof
b8c0: 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a  (p->azVar[0]));.
b8d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73      memset(pPars
b8e0: 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61  e->azVar, 0, pPa
b8f0: 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  rse->nzVar*sizeo
b900: 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  f(pParse->azVar[
b910: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
b920: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70  p->aMem ){.    p
b930: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b950: 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72  * aMem[] goes fr
b960: 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20  om 1..nMem */.  
b970: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
b980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b990: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
b9a0: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
b9b0: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c  .    for(n=1; n<
b9c0: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
b9d0: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
b9e0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 76 61 6c 69  ags = MEM_Invali
b9f0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d  d;.      p->aMem
ba00: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
ba10: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c   }.  }.  p->expl
ba20: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78  ain = pParse->ex
ba30: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
ba40: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d  VdbeRewind(p);.}
ba50: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
ba60: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
ba70: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
ba80: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
ba90: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
baa0: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
bab0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
bac0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
bad0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
bae0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
baf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
bb00: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
bb10: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 43 78  eSorterClose(pCx
bb20: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42  );.  if( pCx->pB
bb30: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
bb40: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
bb50: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
bb60: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
bb70: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
bb80: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
bb90: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
bba0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
bbb0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
bbc0: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
bbd0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
bbe0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
bbf0: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
bc00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bc10: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
bc20: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
bc30: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
bc40: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
bc50: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
bc60: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
bc70: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
bc80: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
bc90: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
bca0: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
bcb0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
bcc0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
bcd0: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
bce0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
bcf0: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
bd00: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  endif.}../*.** C
bd10: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
bd20: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
bd30: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
bd40: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
bd50: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
bd60: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
bd70: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
bd80: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
bd90: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
bda0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
bdb0: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
bdc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
bdd0: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
bde0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
bdf0: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
be00: 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65  e->v;.  v->aOnce
be10: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Flag = pFrame->a
be20: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e  OnceFlag;.  v->n
be30: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
be40: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->nOnceFlag;.  
be50: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
be60: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
be70: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
be80: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
be90: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
bea0: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
beb0: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
bec0: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
bed0: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
bee0: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
bef0: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
bf00: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
bf10: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
bf20: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
bf30: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70  ange;.  return p
bf40: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a  Frame->pc;.}../*
bf50: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
bf60: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  rsors..**.** Als
bf70: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79  o release any dy
bf80: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c  namic memory hel
bf90: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74  d by the VM in t
bfa0: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d  he Vdbe.aMem mem
bfb0: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72  ory .** cell arr
bfc0: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65  ay. This is nece
bfd0: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d  ssary as the mem
bfe0: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d  ory cell array m
bff0: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f  ay contain.** po
c000: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72  inters to VdbeFr
c010: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69  ame objects, whi
c020: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63  ch may in turn c
c030: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20  ontain pointers 
c040: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f  to.** open curso
c050: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
c060: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  id closeAllCurso
c070: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
c080: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a  f( p->pFrame ){.
c090: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
c0a0: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70  Frame;.    for(p
c0b0: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b  Frame=p->pFrame;
c0c0: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74   pFrame->pParent
c0d0: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d  ; pFrame=pFrame-
c0e0: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73  >pParent);.    s
c0f0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
c100: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a  estore(pFrame);.
c110: 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20    }.  p->pFrame 
c120: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65  = 0;.  p->nFrame
c130: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
c140: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74  apCsr ){.    int
c150: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
c160: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
c170: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43  ++){.      VdbeC
c180: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
c190: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69  pCsr[i];.      i
c1a0: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20  f( pC ){.       
c1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
c1c0: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
c1d0: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b         p->apCsr[
c1e0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
c1f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c200: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
c210: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
c220: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
c230: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
c240: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
c250: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
c260: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
c270: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
c280: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
c290: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
c2a0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
c2b0: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d  ete(pDel);.  }.}
c2c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
c2d0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
c2e0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
c2f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c300: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
c310: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
c320: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
c330: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
c340: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
c350: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
c360: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
c370: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
c380: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
c390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3a0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
c3b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c3c0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
c3d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
c3e0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
c3f0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
c400: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
c410: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
c420: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
c430: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
c440: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
c450: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
c460: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
c470: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
c480: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
c490: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
c4a0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
c4b0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
c4c0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
c4d0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
c4e0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
c4f0: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c  flags==MEM_Inval
c500: 69 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  id );.  }.#endif
c510: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
c520: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c530: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
c540: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
c550: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
c560: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
c570: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
c580: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
c590: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
c5a0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
c5b0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
c5c0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
c5d0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
c5e0: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
c5f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
c600: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
c610: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c620: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
c630: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
c640: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
c650: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
c660: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
c670: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
c680: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
c690: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
c6a0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
c6b0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
c6c0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
c6d0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
c6e0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
c6f0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
c700: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
c710: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
c720: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
c730: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c740: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
c750: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
c760: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
c770: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
c780: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
c790: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c7a0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
c7b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
c7c0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
c7d0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
c7e0: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
c7f0: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
c800: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
c810: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
c820: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
c830: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
c840: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c850: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
c860: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
c870: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
c880: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
c890: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c8a0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
c8b0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
c8c0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
c8d0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
c8e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
c8f0: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
c900: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
c910: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
c920: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
c930: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
c940: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
c950: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
c960: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
c970: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
c980: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
c990: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
c9a0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
c9b0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
c9c0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
c9d0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
c9e0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
c9f0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
ca00: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
ca10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca20: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
ca30: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
ca40: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
ca70: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
ca80: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
ca90: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cab0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
cac0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
cad0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
cae0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
caf0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
cb00: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
cb10: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
cb20: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
cb30: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
cb40: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
cb50: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
cb60: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
cb70: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
cb80: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
cb90: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
cba0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
cbb0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
cbc0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
cbd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cbe0: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
cbf0: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
cc00: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
cc10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cc20: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
cc30: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
cc40: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
cc50: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
cc60: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
cc70: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
cc80: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
cc90: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
cca0: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
ccb0: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
ccc0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
ccd0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
cce0: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
ccf0: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
cd00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cd10: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
cd20: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
cd30: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
cd40: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
cd50: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
cd60: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
cd70: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
cd80: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
cd90: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
cda0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
cdb0: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
cdc0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
cdd0: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
cde0: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
cdf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ce00: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
ce10: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
ce20: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
ce30: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
ce40: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
ce50: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
ce60: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
ce70: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
ce80: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
ce90: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
cea0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ceb0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
cec0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ced0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
cee0: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
cef0: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
cf00: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
cf10: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
cf20: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
cf30: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
cf40: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
cf50: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
cf60: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
cf70: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
cf80: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
cf90: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
cfa0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
cfb0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
cfc0: 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
cfd0: 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
cfe0: 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
cff0: 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
d000: 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
d010: 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
d020: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
d030: 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
d040: 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
d050: 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
d060: 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
d070: 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
d080: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
d090: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
d0a0: 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
d0b0: 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20  &p->zErrMsg);.. 
d0c0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
d0d0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
d0e0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
d0f0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
d100: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
d110: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
d120: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
d130: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
d140: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
d150: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
d160: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
d170: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
d180: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
d190: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
d1a0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
d1b0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
d1c0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
d1d0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
d1e0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
d1f0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
d200: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
d210: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
d220: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
d230: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
d240: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d250: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
d260: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
d270: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
d280: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
d290: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
d2a0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
d2b0: 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  +;.      rc = sq
d2c0: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
d2d0: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
d2e0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
d2f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d300: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d310: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
d320: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
d330: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
d340: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
d350: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
d360: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
d370: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
d380: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
d390: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
d3a0: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
d3b0: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
d3c0: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
d3d0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
d3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
d3f0: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
d400: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
d410: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
d420: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
d430: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
d440: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
d450: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
d460: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
d470: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
d480: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
d490: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
d4a0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
d4b0: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
d4c0: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
d4d0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d4e0: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
d4f0: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
d500: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
d510: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
d520: 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
d530: 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
d540: 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
d550: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
d560: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
d570: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
d580: 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
d590: 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
d5a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
d5b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d5c0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
d5d0: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
d5e0: 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
d5f0: 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
d600: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
d610: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
d620: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
d630: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
d640: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
d650: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
d660: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
d670: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
d680: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
d690: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d6a0: 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
d6b0: 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
d6c0: 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
d6d0: 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
d6e0: 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
d6f0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
d700: 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
d710: 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
d720: 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
d730: 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
d740: 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
d750: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
d760: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
d770: 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
d780: 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
d790: 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
d7a0: 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
d7b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
d7c0: 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
d7d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
d7e0: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d7f0: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d800: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d810: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d820: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d830: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d840: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d850: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d860: 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
d870: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
d880: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d890: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d8a0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
d8b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d8c0: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
d8d0: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
d8e0: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
d8f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
d900: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
d910: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
d920: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
d930: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
d940: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
d950: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
d960: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
d970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
d980: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
d990: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d9a0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
d9b0: 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
d9c0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
d9d0: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
d9e0: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
d9f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
da00: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
da10: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
da20: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
da30: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
da40: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
da50: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
da60: 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
da70: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
da80: 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
da90: 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
daa0: 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
dab0: 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
dac0: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
dad0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
dae0: 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
daf0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
db00: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
db10: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
db20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
db30: 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
db40: 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
db50: 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
db60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
db70: 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20  OMEM;.    do {. 
db80: 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d       u32 iRandom
db90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72  ;.      if( retr
dba0: 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  yCount ){.      
dbb0: 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
dbc0: 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >100 ){.        
dbd0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
dbe0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64  LITE_FULL, "MJ d
dbf0: 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73  elete: %s", zMas
dc00: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
dc10: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
dc20: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
dc30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
dc40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
dc50: 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74  e if( retryCount
dc60: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==1 ){.         
dc70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
dc80: 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f  ITE_FULL, "MJ co
dc90: 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73  llide: %s", zMas
dca0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
dcb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
dcc0: 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20  tryCount++;.    
dcd0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
dce0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e  ness(sizeof(iRan
dcf0: 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b  dom), &iRandom);
dd00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
dd10: 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61  nprintf(13, &zMa
dd20: 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c  ster[nMainFile],
dd30: 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c   "-mj%06X9%02X",
dd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66  (iRandom>>8)&0xf
dd70: 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30  fffff, iRandom&0
dd80: 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  xff);.      /* T
dd90: 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61  he antipenultima
dda0: 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20  te character of 
ddb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ddc0: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20  al name must.   
ddd0: 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20     ** be "9" to 
dde0: 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69  avoid name colli
ddf0: 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67  sions when using
de00: 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20   8+3 filenames. 
de10: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
de20: 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33   zMaster[sqlite3
de30: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72  Strlen30(zMaster
de40: 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20  )-3]=='9' );.   
de50: 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75     sqlite3FileSu
de60: 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c  ffix3(zMainFile,
de70: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
de80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
de90: 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73  ccess(pVfs, zMas
dea0: 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ter, SQLITE_ACCE
deb0: 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29  SS_EXISTS, &res)
dec0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
ded0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
dee0: 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  es );.    if( rc
def0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
df00: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
df10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
df20: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
df30: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c  qlite3OsOpenMall
df40: 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  oc(pVfs, zMaster
df50: 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20  , &pMaster, .   
df60: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
df70: 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
df80: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
df90: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
dfa0: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
dfb0: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
dfc0: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
dfd0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
dfe0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dff0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
e000: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e010: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e020: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e030: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
e040: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
e050: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
e060: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e070: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
e080: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
e090: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
e0a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
e0b0: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
e0c0: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
e0d0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
e0e0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
e0f0: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
e100: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
e110: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
e120: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
e130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
e140: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
e150: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
e160: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
e170: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
e180: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
e190: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
e1a0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
e1b0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
e1c0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
e1d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
e1e0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
e1f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  t) ){.        ch
e200: 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20  ar const *zFile 
e210: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
e220: 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74  tJournalname(pBt
e230: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
e240: 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  File==0 ){.     
e250: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
e260: 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61  /* Ignore TEMP a
e270: 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  nd :memory: data
e280: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
e290: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
e2a0: 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29  t( zFile[0]!=0 )
e2b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e  ;.        if( !n
e2c0: 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69  eedSync && !sqli
e2d0: 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
e2e0: 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20  bled(pBt) ){.   
e2f0: 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
e300: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
e310: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
e320: 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74  te3OsWrite(pMast
e330: 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74  er, zFile, sqlit
e340: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
e350: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
e360: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
e370: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
e380: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
e390: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e3a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
e3b0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
e3c0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
e3d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
e3e0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
e3f0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
e400: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
e410: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
e420: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
e430: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
e440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
e450: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
e460: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e470: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
e480: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
e490: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
e4a0: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
e4b0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
e4c0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
e4d0: 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d  ync .     && 0==
e4e0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
e4f0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
e500: 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f  pMaster)&SQLITE_
e510: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
e520: 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45  ).     && SQLITE
e530: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
e540: 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72  e3OsSync(pMaster
e550: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  , SQLITE_SYNC_NO
e560: 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20  RMAL)).    ){.  
e570: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
e580: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
e590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
e5a0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
e5b0: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
e5c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e5d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e5e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
e5f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
e600: 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73  all the db files
e610: 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
e620: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
e630: 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20  e same call.    
e640: 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74  ** sets the mast
e650: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
e660: 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76  er in each indiv
e670: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49  idual journal. I
e680: 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f  f.    ** an erro
e690: 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64  r occurs here, d
e6a0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
e6b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e6c0: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
e6d0: 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72   ** If the error
e6e0: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
e6f0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e700: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
e710: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
e720: 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65  ne(), then there
e730: 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61   is a chance tha
e740: 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73  t the.    ** mas
e750: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e760: 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65   will be orphane
e770: 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74  d. But we cannot
e780: 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20   delete it,.    
e790: 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d  ** in case the m
e7a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e7b0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74  le name was writ
e7c0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
e7d0: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
e7e0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c   before the fail
e7f0: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
e800: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
e810: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
e820: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
e830: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
e840: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
e850: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
e860: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
e870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
e880: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
e890: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
e8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e8b0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
e8c0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
e8d0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e8e0: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20  QLITE_BUSY );.  
e8f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e900: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
e910: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e920: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
e930: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
e940: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
e950: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e960: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
e970: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
e980: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
e990: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
e9a0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
e9b0: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
e9c0: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
e9d0: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
e9e0: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
e9f0: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
ea00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ea10: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ea20: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
ea30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ea40: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
ea50: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
ea60: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ea70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ea80: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
ea90: 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
eaa0: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
eab0: 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
eac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
ead0: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
eae0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
eaf0: 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
eb00: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
eb10: 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
eb20: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
eb30: 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
eb40: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
eb50: 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
eb60: 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
eb70: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
eb80: 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
eb90: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
eba0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
ebb0: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
ebc0: 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
ebd0: 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
ebe0: 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
ebf0: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
ec00: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
ec10: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
ec20: 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
ec30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
ec40: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
ec50: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
ec60: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
ec70: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
ec80: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
ec90: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
eca0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
ecb0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ecc0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
ecd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ece0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
ecf0: 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  (pBt, 1);.      
ed00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
ed10: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
ed20: 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  oc();.    enable
ed30: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
ed40: 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c  rors();..    sql
ed50: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
ed60: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
ed70: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ed80: 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
ed90: 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20  ine checks that 
eda0: 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69  the sqlite3.acti
edb0: 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20  veVdbeCnt count 
edc0: 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
edd0: 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
ede0: 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
edf0: 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
ee00: 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
ee10: 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
ee20: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
ee30: 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
ee40: 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
ee50: 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
ee60: 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
ee70: 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
ee80: 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
ee90: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
eea0: 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
eeb0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
eec0: 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
eed0: 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
eee0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
eef0: 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
ef00: 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
ef10: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
ef20: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
ef30: 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
ef40: 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a   p = db->pVdbe;.
ef50: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
ef60: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
ef70: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26  VDBE_MAGIC_RUN &
ef80: 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & p->pc>=0 ){.  
ef90: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
efa0: 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
efb0: 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
efc0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
efd0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73  >pNext;.  }.  as
efe0: 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61  sert( cnt==db->a
eff0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a  ctiveVdbeCnt );.
f000: 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
f010: 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  ==db->writeVdbeC
f020: 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  nt );.}.#else.#d
f030: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
f040: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
f050: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
f060: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
f070: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
f080: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
f090: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
f0a0: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
f0b0: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
f0c0: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
f0d0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f0e0: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
f0f0: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
f100: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
f110: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
f120: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
f130: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
f140: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
f150: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
f160: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
f170: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
f180: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
f190: 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mmtted..**.** If
f1a0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
f1b0: 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49  urs, an SQLITE_I
f1c0: 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63  OERR_XXX error c
f1d0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
f1e0: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53   .** Otherwise S
f1f0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
f200: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
f210: 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20  eStatement(Vdbe 
f220: 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20  *p, int eOp){.  
f230: 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64  sqlite3 *const d
f240: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
f250: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
f260: 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74  ..  /* If p->iSt
f270: 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74  atement is great
f280: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
f290: 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65  en this Vdbe ope
f2a0: 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74  ned a .  ** stat
f2b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
f2c0: 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  n that should be
f2d0: 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68   closed here. Th
f2e0: 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e  e only exception
f2f0: 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e  .  ** is that an
f300: 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61   IO error may ha
f310: 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73  ve occured, caus
f320: 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  ing an emergency
f330: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20   rollback..  ** 
f340: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62  In this case (db
f350: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29  ->nStatement==0)
f360: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
f370: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20  othing to do..  
f380: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74  */.  if( db->nSt
f390: 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53  atement && p->iS
f3a0: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
f3b0: 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
f3c0: 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20   int iSavepoint 
f3d0: 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d  = p->iStatement-
f3e0: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
f3f0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
f400: 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d  OLLBACK || eOp==
f410: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f420: 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E);.    assert( 
f430: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30  db->nStatement>0
f440: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f450: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28  p->iStatement==(
f460: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64  db->nStatement+d
f470: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29  b->nSavepoint) )
f480: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
f490: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
f4a0: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20   .      int rc2 
f4b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
f4c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
f4d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
f4e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
f4f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
f500: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
f510: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
f520: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
f530: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
f540: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  t, SAVEPOINT_ROL
f550: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
f560: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
f570: 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53        if( rc2==S
f580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f590: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
f5a0: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
f5b0: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54  t(pBt, SAVEPOINT
f5c0: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70  _RELEASE, iSavep
f5d0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
f5e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
f5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f600: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
f610: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f620: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62    }.    }.    db
f630: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a  ->nStatement--;.
f640: 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e      p->iStatemen
f650: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
f660: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f670: 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  .      if( eOp==
f680: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f690: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
f6a0: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
f6b0: 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
f6c0: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
f6d0: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
f6e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
f6f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f700: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f710: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
f720: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
f730: 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
f740: 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
f750: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
f760: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
f770: 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  nsaction is bein
f780: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61  g rolled back, a
f790: 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20  lso restore the 
f7a0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f7b0: 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65   handles deferre
f7c0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75  d constraint cou
f7d0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75  nter to the valu
f7e0: 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20  e it had when . 
f7f0: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
f800: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
f810: 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a  was opened.  */.
f820: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f830: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f840: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  ){.      db->nDe
f850: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e  ferredCons = p->
f860: 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20  nStmtDefCons;.  
f870: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
f880: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
f890: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
f8a0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
f8b0: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
f8c0: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
f8d0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
f8e0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
f8f0: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
f900: 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
f910: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
f920: 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
f930: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
f940: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
f950: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
f960: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
f970: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
f980: 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
f990: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
f9a0: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
f9b0: 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
f9c0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
f9d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
f9e0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
f9f0: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
fa00: 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
fa10: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
fa20: 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20  and write.** an 
fa30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
fa40: 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e   it. Then return
fa50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
fa60: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
fa70: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
fa80: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  Y.int sqlite3Vdb
fa90: 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70  eCheckFk(Vdbe *p
faa0: 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b  , int deferred){
fab0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fac0: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64   p->db;.  if( (d
fad0: 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e  eferred && db->n
fae0: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20  DeferredCons>0) 
faf0: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
fb00: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
fb10: 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72  t>0) ){.    p->r
fb20: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
fb30: 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72  RAINT;.    p->er
fb40: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
fb50: 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
fb60: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a  3SetString(&p->z
fb70: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72  ErrMsg, db, "for
fb80: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61  eign key constra
fb90: 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
fba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbb0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
fbc0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fbd0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
fbe0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
fbf0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
fc00: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
fc10: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
fc20: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
fc30: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
fc40: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
fc50: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
fc60: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
fc70: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
fc80: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
fc90: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
fca0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fcb0: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
fcc0: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
fcd0: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
fce0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
fcf0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
fd00: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
fd10: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
fd20: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
fd30: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
fd40: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
fd50: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
fd60: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
fd70: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
fd80: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
fd90: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
fda0: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
fdb0: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
fdc0: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
fdd0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
fde0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
fdf0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
fe00: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
fe10: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
fe20: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
fe30: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
fe40: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
fe50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
fe60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
fe70: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
fe80: 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
fe90: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
fea0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
feb0: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
fec0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
fed0: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
fee0: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
fef0: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
ff00: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
ff10: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
ff20: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
ff30: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
ff40: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
ff50: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
ff60: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
ff70: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
ff80: 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
ff90: 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
ffa0: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
ffb0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
ffc0: 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
ffd0: 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
ffe0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
fff0: 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
10000 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
10010 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
10020 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
10030 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
10040 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
10050 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
10060 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
10070 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
10080 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
10090 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
100a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
100b0 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
100c0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
100d0 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d  ..  */..  if( p-
100e0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
100f0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
10100 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10110 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63   }.  if( p->aOnc
10120 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70  eFlag ) memset(p
10130 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20  ->aOnceFlag, 0, 
10140 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20  p->nOnceFlag);. 
10150 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
10160 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
10170 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
10180 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
10190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
101a0 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
101b0 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
101c0 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
101d0 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
101e0 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
101f0 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  er started */.  
10200 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
10210 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
10220 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
10230 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
10240 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  */.    int eStat
10250 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20  ementOp = 0;.   
10260 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
10270 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
10280 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
10290 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72  f a 'special' er
102a0 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  ror */..    /* L
102b0 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
102c0 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
102d0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
102e0 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
102f0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
10300 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
10310 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
10320 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
10330 26 20 30 78 66 66 3b 0a 20 20 20 20 61 73 73 65  & 0xff;.    asse
10340 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
10350 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
10360 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f  );  /* This erro
10370 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 78 69 73  r no longer exis
10380 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 70 65 63  ts */.    isSpec
10390 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
103a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
103b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
103c0 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
103d0 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
103e0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
103f0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
10400 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
10410 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
10420 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
10430 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
10440 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
10450 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
10460 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
10470 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
10480 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
10490 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
104a0 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
104b0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
104c0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
104d0 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
104e0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
104f0 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
10500 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
10510 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
10520 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
10530 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
10540 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
10550 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
10560 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
10570 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
10580 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
10590 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
105a0 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
105b0 2a 20 6f 63 63 75 72 65 64 20 77 68 69 6c 65 20  * occured while 
105c0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
105d0 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72  ournal, sub-jour
105e0 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a  nal or database.
105f0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73        ** file as
10600 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f   part of an effo
10610 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61  rt to free up ca
10620 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66  che space (see f
10630 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
10640 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69   pagerStress() i
10650 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20  n pager.c), the 
10660 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75  rollback is requ
10670 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ired to restore 
10680 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61  .      ** the pa
10690 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74  ger to a consist
106a0 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20  ent state..     
106b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
106c0 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  ->readOnly || mr
106d0 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
106e0 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
106f0 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f  f( (mrc==SQLITE_
10700 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51  NOMEM || mrc==SQ
10710 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d  LITE_FULL) && p-
10720 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
10730 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53   ){.          eS
10740 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56  tatementOp = SAV
10750 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b  EPOINT_ROLLBACK;
10760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
10780 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f  are forced to ro
10790 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69  ll back the acti
107a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ve transaction. 
107b0 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20  Before doing.   
107c0 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62         ** so, ab
107d0 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74  ort any other st
107e0 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61  atements this ha
107f0 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68  ndle currently h
10800 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20  as active..     
10810 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
10820 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10830 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
10840 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
10850 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10860 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
10870 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
10880 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
10890 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
108a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
108b0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
108c0 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
108d0 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
108e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
108f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10900 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10910 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
10920 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
10930 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
10940 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
10950 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
10960 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
10970 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
10980 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
10990 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
109a0 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
109b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
109c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
109d0 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
109e0 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
109f0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
10a00 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
10a10 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
10a20 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
10a30 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
10a40 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
10a50 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
10a60 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
10a70 20 26 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62   && db->writeVdb
10a80 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  eCnt==(p->readOn
10a90 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
10aa0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
10ab0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
10ac0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
10ad0 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
10ae0 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
10af0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10b00 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
10b10 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10b30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
10b40 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
10b50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
10b60 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
10b70 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
10b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
10ba0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
10bb0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
10bc0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  INT;.        }el
10bd0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
10be0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
10bf0 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
10c00 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
10c10 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
10c20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
10c30 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
10c40 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
10c50 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
10c60 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
10c70 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
10c80 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
10c90 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
10ca0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
10cb0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
10cc0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
10cd0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
10ce0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
10cf0 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
10d00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
10d20 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
10d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
10d40 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
10d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
10d60 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
10d70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10d80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
10da0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
10db0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
10dc0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
10dd0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  E_OK);.        }
10de0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10df0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
10e00 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
10e10 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
10e20 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
10e30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10e50 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10e60 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
10e70 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OK);.      }.   
10e80 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10e90 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
10ea0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
10eb0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
10ec0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10ed0 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
10ee0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
10ef0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
10f00 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
10f10 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
10f20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
10f30 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
10f40 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
10f50 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
10f60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
10f70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
10f80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
10f90 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
10fa0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
10fb0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
10fc0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
10fd0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
10fe0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
10ff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
11000 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
11010 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
11020 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
11030 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
11040 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
11050 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
11060 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
11070 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
11080 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
11090 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
110a0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
110b0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
110c0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
110d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
110e0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
110f0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
11100 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
11110 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
11120 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
11130 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
11140 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
11150 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
11160 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
11170 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11180 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
11190 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
111a0 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
111b0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
111c0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
111d0 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
111e0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
111f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
11200 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
11210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11220 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
11230 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
11240 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
11250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
11260 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
11270 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
11280 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
11290 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
112a0 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
112b0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
112c0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
112d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
112e0 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
112f0 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
11300 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
11310 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
11320 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
11330 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
11340 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
11350 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11360 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
11370 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
11380 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
11390 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
113a0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
113b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
113c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
113d0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
113e0 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
113f0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
11400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11410 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
11420 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
11430 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
11440 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
11450 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
11460 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
11470 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
11480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
11490 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
114a0 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
114b0 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
114c0 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
114d0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
114e0 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
114f0 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69  VdbeCnt--;.    i
11500 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
11510 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69  ){.      db->wri
11520 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  teVdbeCnt--;.   
11530 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
11540 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
11550 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  >=db->writeVdbeC
11560 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt );.  }.  p->m
11570 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
11580 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
11590 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
115a0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
115b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
115c0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
115d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
115e0 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
115f0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
11600 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
11610 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
11620 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
11630 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
11640 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
11650 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
11660 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
11670 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
11680 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
11690 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
116a0 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
116b0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
116c0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
116d0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
116e0 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
116f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
11700 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30  >activeVdbeCnt>0
11710 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   || db->autoComm
11720 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74  it==0 || db->nSt
11730 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20  atement==0 );.  
11740 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53  return (p->rc==S
11750 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c  QLITE_BUSY ? SQL
11760 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54  ITE_BUSY : SQLIT
11770 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  E_OK);.}.../*.**
11780 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
11790 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
117a0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
117b0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
117c0 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
117d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
117e0 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
117f0 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
11800 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11810 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
11820 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
11830 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11840 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  OK;.}../*.** Cop
11850 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  y the error code
11860 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
11870 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
11880 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a  the VDBE passed.
11890 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
118a0 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20  argument to its 
118b0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
118c0 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69  (so that they wi
118d0 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e  ll be .** return
118e0 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
118f0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29  qlite3_errcode()
11900 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72   and sqlite3_err
11910 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  msg())..**.** Th
11920 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
11930 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56   not clear the V
11940 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  DBE error code o
11950 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a  r message, just.
11960 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74  ** copies them t
11970 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  o the database h
11980 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
11990 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65  lite3VdbeTransfe
119a0 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b  rError(Vdbe *p){
119b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
119c0 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63   p->db;.  int rc
119d0 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20   = p->rc;.  if( 
119e0 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  p->zErrMsg ){.  
119f0 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65    u8 mallocFaile
11a00 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
11a10 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65  iled;.    sqlite
11a20 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
11a30 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
11a40 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
11a50 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
11a60 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
11a70 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
11a80 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
11a90 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
11aa0 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  c();.    db->mal
11ab0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
11ac0 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62  ocFailed;.    db
11ad0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
11ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
11af0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
11b00 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
11b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11b20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
11b30 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
11b40 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
11b50 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
11b60 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
11b70 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
11b80 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
11b90 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
11ba0 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
11bb0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
11bc0 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
11bd0 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
11be0 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
11bf0 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
11c00 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
11c10 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
11c20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
11c30 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
11c40 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
11c50 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
11c60 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
11c70 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
11c80 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
11c90 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
11ca0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
11cb0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
11cc0 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
11cd0 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
11ce0 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
11cf0 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
11d00 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
11d10 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
11d20 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
11d30 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
11d40 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
11d50 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
11d60 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
11d70 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
11d80 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
11d90 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e   VDBE has be run
11da0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c   even partially,
11db0 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74   then transfer t
11dc0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  he error code.  
11dd0 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  ** and error mes
11de0 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44  sage from the VD
11df0 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  BE into the main
11e00 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
11e10 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69  ure.  But.  ** i
11e20 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a  f the VDBE has j
11e30 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20  ust been set to 
11e40 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20  run but has not 
11e50 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65  actually execute
11e60 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72  d any.  ** instr
11e70 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61  uctions yet, lea
11e80 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ve the main data
11e90 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72  base error infor
11ea0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  mation unchanged
11eb0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
11ec0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  pc>=0 ){.    sql
11ed0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
11ee0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
11ef0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11f00 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
11f10 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
11f20 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
11f30 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
11f40 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
11f50 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
11f60 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
11f70 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
11f80 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
11f90 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
11fa0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
11fb0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
11fc0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
11fd0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
11fe0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
11ff0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
12000 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
12010 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
12020 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
12030 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
12040 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
12050 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  c, 0);.    sqlit
12060 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
12070 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
12080 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
12090 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
120a0 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
120b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
120c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
120d0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
120e0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d   }..  /* Reclaim
120f0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64   all memory used
12100 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a   by the VDBE.  *
12110 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a  /.  Cleanup(p);.
12120 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69  .  /* Save profi
12130 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ling information
12140 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20   from this VDBE 
12150 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  run..  */.#ifdef
12160 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20   VDBE_PROFILE.  
12170 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
12180 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72  = fopen("vdbe_pr
12190 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29  ofile.out", "a")
121a0 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b  ;.    if( out ){
121b0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
121c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
121d0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20   "---- ");.     
121e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
121f0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
12200 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
12210 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d  %02x", p->aOp[i]
12220 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20  .opcode);.      
12230 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  }.      fprintf(
12240 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  out, "\n");.    
12250 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
12260 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
12270 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12280 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c  "%6d %10lld %8ll
12290 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d ",.           
122a0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
122b0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
122c0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
122d0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
122e0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
122f0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
12300 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
12310 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73      );.        s
12320 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
12330 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
12340 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
12350 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
12360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
12370 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  if.  p->magic = 
12380 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
12390 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
123a0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
123b0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
123c0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
123d0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
123e0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
123f0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12400 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
12410 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
12420 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
12430 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
12440 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
12450 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
12460 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
12470 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12480 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
12490 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
124a0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
124b0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
124c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
124d0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
124e0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
124f0 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
12500 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
12510 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
12520 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12530 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
12540 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
12550 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
12560 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
12570 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
12580 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
12590 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
125a0 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
125b0 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
125c0 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
125d0 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
125e0 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
125f0 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
12600 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
12610 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
12620 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
12630 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
12640 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
12650 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
12660 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12670 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
12680 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
12690 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
126a0 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
126b0 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
126c0 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
126d0 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29  k&(((u32)1)<<i))
126e0 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
126f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
12700 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
12710 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
12720 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
12730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12740 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
12750 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12760 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
12770 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
12780 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
12790 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
127a0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65  argument..** The
127b0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
127c0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  een this functio
127d0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62  n and sqlite3Vdb
127e0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61  eDelete() is tha
127f0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28  t.** VdbeDelete(
12800 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74  ) also unlinks t
12810 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
12820 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73   list of VMs ass
12830 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
12840 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
12850 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
12860 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
12870 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  teObject(sqlite3
12880 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
12890 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
128a0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
128b0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
128c0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
128d0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
128e0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
128f0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
12900 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
12910 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
12920 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
12930 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
12940 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
12950 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
12960 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
12970 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
12980 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
12990 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
129a0 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
129b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
129c0 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
129d0 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
129e0 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
129f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
12a00 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46  Var[i]);.  vdbeF
12a10 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
12a20 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
12a30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12a40 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
12a50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12a60 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
12a70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
12a80 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
12a90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
12aa0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
12ab0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
12ac0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
12ad0 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33  PLAIN).  sqlite3
12ae0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
12af0 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74  xplain);.  sqlit
12b00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
12b10 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69  pExplain);.#endi
12b20 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
12b30 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
12b40 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
12b50 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
12b60 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
12b70 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
12b80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
12b90 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
12ba0 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
12bb0 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
12bc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12bd0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
12be0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
12bf0 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
12c00 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
12c10 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
12c20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
12c30 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
12c40 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
12c50 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
12c60 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
12c70 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12c80 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
12c90 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12ca0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
12cb0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
12cc0 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65  e3VdbeDeleteObje
12cd0 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ct(db, p);.}../*
12ce0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
12cf0 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65  e cursor p is re
12d00 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ady to read or w
12d10 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20  rite the row to 
12d20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20  which it.** was 
12d30 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e  last positioned.
12d40 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
12d50 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d  r code if an OOM
12d60 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72   fault or I/O er
12d70 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20  ror.** prevents 
12d80 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e  us from position
12d90 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
12da0 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f  o its correct po
12db0 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  sition..**.** If
12dc0 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
12dd0 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
12de0 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
12df0 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
12e00 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
12e10 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70   If no move is p
12e20 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f  ending, check to
12e30 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20   see if the row 
12e40 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65  has been.** dele
12e50 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
12e60 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e  er the cursor an
12e70 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72  d if it has, mar
12e80 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20  k the row as.** 
12e90 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a  a NULL row..**.*
12ea0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
12eb0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
12ec0 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ing to the corre
12ed0 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20  ct row and that 
12ee0 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62  row has.** not b
12ef0 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
12f00 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
12f10 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73  ursor, then this
12f20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
12f30 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
12f40 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
12f50 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
12f60 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
12f70 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
12f80 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
12f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
12fa0 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
12fb0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
12fc0 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
12fd0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
12fe0 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
12ff0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
13000 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
13010 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
13020 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
13030 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
13040 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13050 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
13060 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
13070 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d  t;.    if( res!=
13080 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
13090 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
130a0 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61      p->rowidIsVa
130b0 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lid = 1;.#ifdef 
130c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
130d0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
130e0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  ount++;.#endif. 
130f0 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f     p->deferredMo
13100 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d  veto = 0;.    p-
13110 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
13120 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65  ACHE_STALE;.  }e
13130 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70  lse if( ALWAYS(p
13140 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  ->pCursor) ){.  
13150 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
13160 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
13170 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
13180 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
13190 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
131a0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
131b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
131c0 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
131d0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
131e0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
131f0 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
13200 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
13210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13220 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
13230 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
13240 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
13250 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
13260 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
13270 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
13280 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
13290 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
132a0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
132b0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
132c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
132d0 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
132e0 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
132f0 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
13300 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
13310 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
13320 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
13330 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
13340 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
13350 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
13360 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
13370 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
13380 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
13390 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
133a0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
133b0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
133c0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
133d0 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
133e0 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
133f0 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
13400 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
13410 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
13420 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
13430 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
13440 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
13450 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
13460 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
13470 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
13480 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
13490 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
134a0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
134b0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
134c0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
134d0 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
134e0 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
134f0 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
13500 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
13510 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
13520 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
13530 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
13540 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
13550 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
13560 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
13570 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
13580 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
13590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
135a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
135b0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
135c0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
135d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135e0 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
135f0 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13610 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
13620 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
13630 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
13640 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
13650 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
13660 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
13690 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
136a0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
136b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
136c0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
136d0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
136e0 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
136f0 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
13700 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
13710 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
13740 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
13750 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
13760 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
13770 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
13780 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
13790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137a0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
137b0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
137c0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
137f0 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
13800 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
13830 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
13840 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
13850 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
13860 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
13870 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
13880 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
13890 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
138a0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
138b0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
138c0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
138d0 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
138e0 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
138f0 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
13900 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
13910 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
13920 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
13930 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
13940 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
13950 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
13960 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
13970 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
13980 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
13990 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
139a0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
139b0 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
139c0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
139d0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
139e0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
139f0 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
13a00 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
13a10 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
13a20 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
13a30 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
13a40 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
13a50 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
13a60 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
13a70 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
13a80 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
13a90 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
13aa0 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
13ab0 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
13ac0 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20  rn 8+(u32)i;.   
13ad0 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29   }.    if( i<0 )
13ae0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d  {.      if( i<(-
13af0 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65 74  MAX_6BYTE) ) ret
13b00 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20  urn 6;.      /* 
13b10 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70 72  Previous test pr
13b20 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d  events:  u = -(-
13b30 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
13b40 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20  808) */.      u 
13b50 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -i;.    }else{
13b60 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
13b70 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
13b80 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
13b90 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
13ba0 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
13bb0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
13bc0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
13bd0 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
13be0 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
13bf0 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
13c00 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
13c10 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
13c20 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
13c30 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
13c40 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
13c50 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
13c60 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
13c70 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
13c80 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
13c90 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
13ca0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
13cb0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
13cc0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
13cd0 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b   assert( n>=0 );
13ce0 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29  .  return ((n*2)
13cf0 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26   + 12 + ((flags&
13d00 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d  MEM_Str)!=0));.}
13d10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
13d20 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
13d30 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64   data correspond
13d40 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
13d50 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e  ied serial-type.
13d60 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
13d70 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
13d80 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
13d90 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  ){.  if( serial_
13da0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
13db0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
13dc0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
13dd0 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  se{.    static c
13de0 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20  onst u8 aSize[] 
13df0 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20  = { 0, 1, 2, 3, 
13e00 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30  4, 6, 8, 8, 0, 0
13e10 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65  , 0, 0 };.    re
13e20 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61  turn aSize[seria
13e30 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a  l_type];.  }.}..
13e40 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
13e50 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
13e60 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
13e70 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
13e80 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
13e90 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
13ea0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
13eb0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
13ec0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
13ed0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
13ee0 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
13ef0 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
13f00 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
13f10 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
13f20 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
13f30 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
13f40 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
13f50 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
13f60 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
13f70 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
13f80 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
13f90 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
13fa0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
13fb0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
13fc0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
13fd0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
13fe0 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
13ff0 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
14000 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
14010 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
14020 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
14030 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
14040 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
14050 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
14060 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
14070 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
14080 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
14090 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
140a0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
140b0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
140c0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
140d0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
140e0 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
140f0 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
14100 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
14110 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
14120 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
14130 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
14140 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
14150 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
14160 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
14170 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
14180 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
14190 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
141a0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
141b0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
141c0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
141d0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
141e0 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
141f0 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
14200 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
14210 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
14220 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
14230 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
14240 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
14250 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
14260 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
14270 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
14280 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
14290 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
142a0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
142b0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
142c0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
142d0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
142e0 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
142f0 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
14300 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
14310 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
14320 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
14330 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
14340 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
14350 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
14360 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
14370 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
14380 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
14390 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
143a0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
143b0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
143c0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
143d0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
143e0 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
143f0 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
14400 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
14410 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
14420 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
14430 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
14440 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
14450 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
14460 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
14470 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
14480 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
14490 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
144a0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
144b0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
144c0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
144d0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
144e0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
144f0 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
14500 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
14510 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
14520 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
14530 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
14540 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
14550 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
14560 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
14570 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
14580 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
14590 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
145a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
145b0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
145c0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
145d0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
145e0 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
145f0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
14600 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
14610 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
14620 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
14630 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
14640 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
14650 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
14660 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
14670 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
14680 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
14690 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
146a0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
146b0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
146c0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
146d0 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73  buf[].  nBuf mus
146e0 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c  t always be.** l
146f0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
14700 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
14710 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ield.  Except, i
14720 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a  f the field is.*
14730 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20  * a blob with a 
14740 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
14750 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67  , then buf[] mig
14760 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72  ht be just the r
14770 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20  ight.** size to 
14780 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20  hold everything 
14790 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a  except for the z
147a0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e  ero-filled tail.
147b0 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73    If buf[].** is
147c0 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68   only big enough
147d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e   to hold the non
147e0 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68  -zero prefix, th
147f0 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  en only write th
14800 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74  at.** prefix int
14810 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66  o buf[].  But if
14820 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20   buf[] is large 
14830 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62  enough to hold b
14840 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69  oth the.** prefi
14850 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74  x and the tail t
14860 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72  hen write the pr
14870 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65  efix and set the
14880 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20   tail to all.** 
14890 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  zeros..**.** Ret
148a0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
148b0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
148c0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
148d0 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
148e0 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
148f0 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
14900 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
14910 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
14920 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
14930 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
14940 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
14950 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
14960 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
14970 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66  8 *buf, int nBuf
14980 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  , Mem *pMem, int
14990 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
149a0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
149b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
149c0 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66  rialType(pMem, f
149d0 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75  ile_format);.  u
149e0 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
149f0 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
14a00 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
14a10 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
14a20 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
14a30 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
14a40 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
14a50 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
14a60 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14a70 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
14a80 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  >r) );.      mem
14a90 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72  cpy(&v, &pMem->r
14aa0 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
14ab0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
14ac0 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
14ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
14ae0 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
14af0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
14b00 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14b10 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
14b20 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
14b30 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42  rt( len<=(u32)nB
14b40 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
14b50 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
14b60 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
14b70 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
14b80 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
14b90 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
14ba0 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
14bb0 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
14bc0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
14bd0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
14be0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
14bf0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
14c00 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
14c10 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
14c20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
14c30 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
14c40 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
14c50 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
14c60 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
14c70 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
14c80 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
14c90 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
14ca0 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
14cb0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
14cc0 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
14cd0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20  ->u.nZero;.     
14ce0 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30   assert( nBuf>=0
14cf0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65   );.      if( le
14d00 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b  n > (u32)nBuf ){
14d10 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28  .        len = (
14d20 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20  u32)nBuf;.      
14d30 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  }.      memset(&
14d40 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c  buf[pMem->n], 0,
14d50 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20   len-pMem->n);. 
14d60 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
14d70 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
14d80 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
14d90 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
14da0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14db0 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
14dc0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
14dd0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
14de0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
14df0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
14e00 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
14e10 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
14e20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14e30 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33  tes read..*/ .u3
14e40 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
14e50 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
14e60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
14e70 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
14e80 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
14e90 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
14ea0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
14eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
14ec0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
14ed0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
14ee0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
14ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
14f00 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
14f10 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
14f20 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
14f30 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
14f40 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
14f50 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
14f60 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
14f70 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
14f80 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
14f90 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
14fa0 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
14fb0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
14fc0 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
14fd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14fe0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
14ff0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
15000 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
15010 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69   pMem->u.i = (si
15020 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
15030 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15040 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15050 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15060 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
15070 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
15080 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15090 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
150a0 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
150b0 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
150c0 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
150d0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
150e0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
150f0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
15100 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
15110 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15120 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15130 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
15140 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29  har)buf[0])<<16)
15150 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c   | (buf[1]<<8) |
15160 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70   buf[2];.      p
15170 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
15180 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
15190 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
151a0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
151b0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
151c0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
151d0 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  ->u.i = (buf[0]<
151e0 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
151f0 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
15200 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
15210 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
15220 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
15230 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
15240 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
15250 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
15260 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
15270 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
15280 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
15290 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
152a0 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
152b0 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
152c0 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
152d0 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
152e0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
152f0 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
15300 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
15310 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
15320 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
15330 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
15340 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
15350 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
15360 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
15370 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
15380 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
15390 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
153a0 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
153b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
153c0 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
153d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
153e0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
153f0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
15400 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
15410 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
15420 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
15430 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
15440 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
15450 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
15460 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
15470 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
15480 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
15490 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
154a0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
154b0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
154c0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
154d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
154e0 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
154f0 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
15500 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
15510 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
15520 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
15530 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
15540 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
15550 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
15560 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
15570 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
15580 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
15590 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
155a0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
155b0 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
155c0 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
155d0 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
155e0 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
155f0 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
15600 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
15610 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
15620 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
15630 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
15640 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
15650 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
15660 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
15670 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
15680 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15690 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
156a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
156b0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
156c0 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
156d0 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
156e0 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
156f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
15700 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
15710 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
15720 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
15730 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
15740 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
15750 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e  pMem->r) ? MEM_N
15760 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
15770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
15780 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
15790 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
157a0 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
157b0 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
157c0 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
157d0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
157e0 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
157f0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15800 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
15810 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
15820 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
15830 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28       u32 len = (
15840 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
15850 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
15860 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
15870 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
15880 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
15890 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
158a0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
158b0 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
158c0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
158d0 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
158e0 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
158f0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
15900 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
15910 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
15920 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15930 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
15940 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
15950 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
15960 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
15970 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
15980 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
15990 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
159a0 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
159b0 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
159c0 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
159d0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
159e0 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
159f0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
15a00 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
15a10 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
15a20 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
15a30 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
15a40 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
15a50 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15a60 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
15a70 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
15a80 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
15a90 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
15aa0 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
15ab0 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
15ac0 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
15ad0 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
15ae0 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
15af0 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
15b00 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
15b10 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
15b20 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
15b30 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
15b40 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
15b50 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
15b60 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
15b70 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
15b80 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
15b90 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
15ba0 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
15bb0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
15bc0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
15bd0 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
15be0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
15bf0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
15c00 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
15c10 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
15c20 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c40 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
15c50 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
15c60 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15c80 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
15c90 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
15ca0 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
15cd0 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
15ce0 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
15d10 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
15d20 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
15d30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
15d40 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
15d50 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
15d60 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
15d70 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
15da0 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
15db0 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
15dc0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
15dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15de0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
15df0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
15e00 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
15e10 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
15e20 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
15e30 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
15e40 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
15e50 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
15e60 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
15e70 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
15e80 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
15e90 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
15ea0 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
15eb0 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
15ec0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
15ed0 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
15ee0 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
15ef0 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
15f00 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
15f10 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
15f20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
15f30 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
15f40 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
15f50 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
15f60 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
15f70 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
15f80 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
15f90 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
15fa0 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
15fb0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
15fc0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
15fd0 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
15fe0 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
15ff0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
16000 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
16010 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
16020 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
16030 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
16040 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
16050 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
16060 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
16070 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
16080 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
16090 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
160a0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
160b0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
160c0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
160d0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
160e0 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
160f0 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
16100 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
16110 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
16120 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
16130 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
16140 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
16150 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
16160 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
16170 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
16180 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
16190 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
161a0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
161b0 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
161c0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
161d0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
161e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16200 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
16210 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
16220 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
16230 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
16240 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
16250 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
16260 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
16270 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
16280 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
16290 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
162a0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
162b0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
162c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
162d0 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
162e0 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
16310 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
16320 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
16350 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
16360 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
16370 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
16380 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66 6c 61  >aMem;..  p->fla
16390 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  gs = 0;.  assert
163a0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
163b0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
163c0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
163d0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
163e0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
163f0 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
16400 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75 3c   idx<szHdr && u<
16410 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 3c 3d  p->nField && d<=
16420 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
16430 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
16440 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
16450 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
16460 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
16470 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
16480 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
16490 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
164a0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
164b0 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
164c0 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
164d0 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
164e0 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
164f0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  s */.    pMem->z
16500 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
16510 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
16520 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
16530 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
16540 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
16550 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d  ++;.    u++;.  }
16560 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
16570 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
16580 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
16590 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d = u;.}../*.** 
165a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
165b0 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
165c0 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
165d0 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
165e0 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
165f0 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
16600 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
16610 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
16620 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
16630 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
16640 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
16650 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
16660 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
16670 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
16680 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
16690 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
166a0 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61  ated by th OP_Ma
166b0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
166c0 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68  of the VDBE.  Th
166d0 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20  e pPKey2.** key 
166e0 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64  must be a parsed
166f0 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74   key such as obt
16700 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71  ained from.** sq
16710 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65  lite3VdbeParseRe
16720 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31  cord..**.** Key1
16730 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74   and Key2 do not
16740 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e   have to contain
16750 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
16760 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54   of fields..** T
16770 68 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65  he key with fewe
16780 72 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61  r fields is usua
16790 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73  lly compares les
167a0 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c  s than the .** l
167b0 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65  onger key.  Howe
167c0 76 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43  ver if the UNPAC
167d0 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67  KED_INCRKEY flag
167e0 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73  s in pPKey2 is s
167f0 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f  et.** and the co
16800 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72  mmon prefixes ar
16810 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65  e equal, then ke
16820 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  y1 is less than 
16830 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74  key2..** Or if t
16840 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43  he UNPACKED_MATC
16850 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73  H_PREFIX flag is
16860 20 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65   set and the pre
16870 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75  fixes are.** equ
16880 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79  al, then the key
16890 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
168a0 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64   to be equal and
168b0 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65  .** the parts be
168c0 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  yond the common 
168d0 70 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72  prefix are ignor
168e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
168f0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
16900 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
16910 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
16920 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
16930 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
16940 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
16950 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
16960 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b   */.){.  int d1;
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
16980 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
16990 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
169a0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
169b0 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
169c0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
169d0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
169e0 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
169f0 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
16a00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16a10 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
16a20 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
16a30 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
16a40 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
16a50 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16a60 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
16a70 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
16a80 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
16a90 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
16aa0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
16ab0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
16ac0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
16ad0 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
16ae0 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
16af0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
16b00 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73  .  /* mem1.flags
16b10 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62   = 0;  // Will b
16b20 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79  e initialized by
16b30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16b40 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41  alGet() */.  VVA
16b50 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c  _ONLY( mem1.zMal
16b60 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
16b70 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
16b80 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
16b90 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
16ba0 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
16bb0 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
16bc0 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
16bd0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
16be0 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
16bf0 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
16c00 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
16c10 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
16c20 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
16c30 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
16c40 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
16c50 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
16c60 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
16c70 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
16c80 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
16c90 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
16ca0 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
16cb0 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
16cc0 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
16cd0 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
16ce0 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
16cf0 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
16d00 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
16d10 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
16d20 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
16d30 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
16d40 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
16d50 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
16d60 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
16d70 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
16d80 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
16d90 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
16da0 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
16db0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
16dc0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31  1, szHdr1);.  d1
16dd0 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e 46 69   = szHdr1;.  nFi
16de0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
16df0 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
16e00 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
16e10 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
16e20 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
16e30 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
16e40 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
16e50 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
16e60 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
16e70 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
16e80 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
16e90 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
16ea0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
16eb0 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
16ec0 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
16ed0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16ee0 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
16ef0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
16f00 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
16f10 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
16f20 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
16f30 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
16f40 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
16f50 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
16f60 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
16f70 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
16f80 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
16f90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
16fa0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
16fb0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
16fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46              i<nF
16fe0 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
16ff0 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
17000 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
17010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
17020 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
17030 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  ;  /* See commen
17040 74 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 20 20  t below */..    
17050 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20    /* Invert the 
17060 72 65 73 75 6c 74 20 69 66 20 77 65 20 61 72 65  result if we are
17070 20 75 73 69 6e 67 20 44 45 53 43 20 73 6f 72 74   using DESC sort
17080 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
17090 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61   if( pKeyInfo->a
170a0 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 6e  SortOrder && i<n
170b0 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66  Field && pKeyInf
170c0 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
170d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
170e0 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   -rc;.      }.  
170f0 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74    .      /* If t
17100 68 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48  he PREFIX_SEARCH
17110 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
17120 20 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65   all fields exce
17130 70 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20  pt the final.   
17140 20 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c     ** rowid fiel
17150 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68  d were equal, th
17160 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45  en clear the PRE
17170 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20  FIX_SEARCH flag 
17180 61 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a  and set .      *
17190 2a 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20  * pPKey2->rowid 
171a0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
171b0 74 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20  the rowid field 
171c0 69 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31  in (pKey1, nKey1
171d0 29 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  )..      ** This
171e0 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
171f0 4f 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f  OP_IsUnique opco
17200 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  de..      */.   
17210 20 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e     if( (pPKey2->
17220 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
17230 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20  _PREFIX_SEARCH) 
17240 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e  && i==(pPKey2->n
17250 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20  Field-1) ){.    
17260 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31      assert( idx1
17270 3d 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29  ==szHdr1 && rc )
17280 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17290 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d  ( mem1.flags & M
172a0 45 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20  EM_Int );.      
172b0 20 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20    pPKey2->flags 
172c0 26 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45  &= ~UNPACKED_PRE
172d0 46 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20  FIX_SEARCH;.    
172e0 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69      pPKey2->rowi
172f0 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20  d = mem1.u.i;.  
17300 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20      }.    .     
17310 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17320 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  }.    i++;.  }..
17330 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
17340 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
17350 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
17360 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
17370 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
17380 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
17390 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
173a0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
173b0 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
173c0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
173d0 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
173e0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
173f0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
17400 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c  ssert( mem1.zMal
17410 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
17420 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
17430 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
17440 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
17450 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
17460 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
17470 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
17480 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
17490 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  the UNPACKED_INC
174a0 52 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69  RKEY.  ** flag i
174b0 73 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61  s set, then brea
174c0 6b 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65  k the tie by tre
174d0 61 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61  ating key2 as la
174e0 72 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rger..  ** If th
174f0 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58  e UPACKED_PREFIX
17500 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73  _MATCH flag is s
17510 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69  et, then keys wi
17520 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  th common prefix
17530 65 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73  es.  ** are cons
17540 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
17550 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
17560 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69  the longer key i
17570 73 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67  s the .  ** larg
17580 65 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65  er.  As it happe
17590 6e 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77  ns, the pPKey2 w
175a0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68  ill always be th
175b0 65 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66  e longer.  ** if
175c0 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66   there is a diff
175d0 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61  erence..  */.  a
175e0 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
175f0 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
17600 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
17610 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63  NCRKEY ){.    rc
17620 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69   = -1;.  }else i
17630 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
17640 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
17650 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  IX_MATCH ){.    
17660 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a  /* Leave rc==0 *
17670 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  /.  }else if( id
17680 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
17690 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72   rc = 1;.  }.  r
176a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
176b0 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
176c0 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
176d0 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
176e0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
176f0 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
17700 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
17710 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
17720 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
17730 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
17740 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
17750 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
17760 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
17770 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
17780 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
17790 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
177a0 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
177b0 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
177c0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
177d0 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
177e0 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
177f0 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
17800 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
17810 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
17820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17830 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
17840 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
17850 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
17860 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
17870 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
17880 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
17890 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
178a0 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
178b0 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
178c0 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
178d0 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
178e0 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
178f0 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
17900 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
17910 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55    Mem m, v;..  U
17920 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
17930 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
17940 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
17950 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
17960 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
17970 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
17980 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
17990 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
179a0 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
179b0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
179c0 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
179d0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
179e0 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
179f0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
17a00 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
17a10 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
17a20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
17a30 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
17a40 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
17a50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
17a60 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
17a70 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
17a80 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
17a90 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
17aa0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
17ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
17ac0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
17ad0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
17ae0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
17af0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
17b00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
17b10 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
17b20 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
17b30 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
17b40 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
17b50 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
17b60 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
17b70 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c   */.  memset(&m,
17b80 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
17b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
17ba0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
17bb0 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
17bc0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
17bd0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
17be0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17bf0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
17c00 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
17c10 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
17c20 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
17c30 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
17c40 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
17c50 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
17c60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
17c70 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
17c80 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
17c90 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
17ca0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
17cb0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
17cc0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
17cd0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
17ce0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
17cf0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
17d00 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
17d10 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
17d20 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
17d30 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
17d40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
17d50 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
17d60 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
17d70 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
17d80 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17d90 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
17da0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17db0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
17dc0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
17dd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17de0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
17df0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
17e00 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
17e10 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
17e20 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
17e30 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
17e40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
17e50 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
17e60 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
17e70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
17e80 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
17e90 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
17ea0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
17eb0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
17ec0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
17ed0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17ee0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
17ef0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
17f00 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
17f10 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
17f20 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
17f30 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
17f40 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
17f50 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
17f60 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
17f70 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
17f80 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
17f90 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
17fa0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
17fb0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
17fc0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
17fd0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
17fe0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
17ff0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
18000 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
18010 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18020 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
18030 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
18040 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
18050 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
18060 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
18070 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
18080 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
18090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
180a0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
180b0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
180c0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
180d0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
180e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
180f0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
18100 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18110 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
18120 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
18130 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
18140 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
18150 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  C is pointing to
18160 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20   against.** the 
18170 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55  key string in pU
18180 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20  npacked.  Write 
18190 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d  into *pRes a num
181a0 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e  ber.** that is n
181b0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
181c0 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43  r positive if pC
181d0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
181e0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67  qual to,.** or g
181f0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70  reater than pUnp
18200 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53  acked.  Return S
18210 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18220 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61  ess..**.** pUnpa
18230 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63  cked is either c
18240 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
18250 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
18260 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
18270 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
18280 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
18290 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
182a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
182b0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
182c0 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
182d0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
182e0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
182f0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
18300 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
18310 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
18320 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
18330 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
18340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
18350 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a  eIdxKeyCompare(.
18360 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
18370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
18380 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
18390 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
183a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
183b0 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
183c0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
183d0 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f  ion of key to co
183e0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
183f0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18410 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
18420 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
18430 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
18440 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
18450 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
18460 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43  r *pCur = pC->pC
18470 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  ursor;.  Mem m;.
18480 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
18490 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56  e3BtreeCursorIsV
184a0 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20  alid(pCur) );.  
184b0 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73  VVA_ONLY(rc =) s
184c0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
184d0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
184e0 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ey);.  assert( r
184f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20  c==SQLITE_OK ); 
18500 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
18510 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
18520 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
18530 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  l */.  /* nCellK
18540 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
18550 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
18560 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
18570 73 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20  se of the say.  
18580 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
18590 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
185a0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
185b0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
185c0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
185d0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
185e0 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
185f0 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
18600 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18610 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
18620 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
18630 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
18640 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18650 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
18660 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c  (pC->pCursor, 0,
18670 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20   (int)nCellKey, 
18680 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
18690 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
186a0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
186b0 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67   pUnpacked->flag
186c0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
186d0 46 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a  FIX_MATCH );.  *
186e0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
186f0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
18700 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
18710 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ed);.  sqlite3Vd
18720 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
18730 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18740 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
18750 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
18760 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65   the value to be
18770 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62   returned by sub
18780 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
18790 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  .** sqlite3_chan
187a0 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74  ges() on the dat
187b0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62  abase handle 'db
187c0 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  '. .*/.void sqli
187d0 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
187e0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
187f0 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61  nt nChange){.  a
18800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18810 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
18820 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43  tex) );.  db->nC
18830 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b  hange = nChange;
18840 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
18850 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a  nge += nChange;.
18860 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66  }../*.** Set a f
18870 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20  lag in the vdbe 
18880 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
18890 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65  ange counter whe
188a0 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65  n it is finalise
188b0 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a  d.** or reset..*
188c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
188d0 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56  beCountChanges(V
188e0 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68  dbe *v){.  v->ch
188f0 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d  angeCntOn = 1;.}
18900 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65  ../*.** Mark eve
18910 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ry prepared stat
18920 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64  ement associated
18930 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
18940 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
18950 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a  s expired..**.**
18960 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74   An expired stat
18970 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74  ement means that
18980 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
18990 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
189a0 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e  is.** recommend.
189b0 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70    Statements exp
189c0 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20  ire when things 
189d0 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65  happen that make
189e0 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61   their.** progra
189f0 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65  ms obsolete.  Re
18a00 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69  moving user-defi
18a10 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72  ned functions or
18a20 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
18a30 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e  quences, or chan
18a40 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a  ging an authoriz
18a50 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61  ation function a
18a60 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a  re the types of.
18a70 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d  ** things that m
18a80 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ake prepared sta
18a90 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65  tements obsolete
18aa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18ab0 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
18ac0 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65  tatements(sqlite
18ad0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
18ae0 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d  p;.  for(p = db-
18af0 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e  >pVdbe; p; p=p->
18b00 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65  pNext){.    p->e
18b10 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  xpired = 1;.  }.
18b20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18b30 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18b40 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
18b50 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65   Vdbe..*/.sqlite
18b60 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62  3 *sqlite3VdbeDb
18b70 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74  (Vdbe *v){.  ret
18b80 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a  urn v->db;.}../*
18b90 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
18ba0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
18bb0 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75  e3_value structu
18bc0 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  re containing th
18bd0 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a  e value bound.**
18be0 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20   parameter iVar 
18bf0 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c  of VM v. Except,
18c00 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73   if the value is
18c10 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65   an SQL NULL, re
18c20 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65  turn .** 0 inste
18c30 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73  ad. Unless it is
18c40 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66   NULL, apply aff
18c50 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f  inity aff (one o
18c60 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
18c70 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29  _*.** constants)
18c80 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65   to the value be
18c90 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
18ca0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  t..**.** The ret
18cb0 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74  urned value must
18cc0 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
18cd0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
18ce0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29  lite3ValueFree()
18cf0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c  ..*/.sqlite3_val
18d00 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  ue *sqlite3VdbeG
18d10 65 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  etValue(Vdbe *v,
18d20 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
18d30 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
18d40 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
18d50 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
18d60 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
18d70 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
18d80 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
18d90 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
18da0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18db0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
18dc0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
18dd0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
18de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18df0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
18e00 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
18e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18e20 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
18e30 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
18e40 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
18e50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
18e60 65 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d  emStoreType((Mem
18e70 20 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20   *)pRet);.      
18e80 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
18e90 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
18ea0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
18eb0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
18ec0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
18ed0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
18ee0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
18ef0 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
18f00 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
18f10 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
18f20 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
18f30 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
18f40 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
18f50 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
18f60 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
18f70 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
18f80 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
18f90 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
18fa0 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
18fb0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
18fc0 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
18fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
18fe0 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
18ff0 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
19000 20 20 7d 0a 7d 0a                                  }.}.