/ Hex Artifact Content
Login

Artifact 8c8cfd30063e9b3664e2faa0e3785102bf131a10:


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 61 73 73 65 72 74 28 20 61 53 6f 72 74 4f 72   assert( aSortOr
52e0: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
52f0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
5300: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
5310: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
5320: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
5330: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
5340: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
5350: 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20  er, aSortOrder, 
5360: 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 70  nField);.      p
5370: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
5380: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
5390: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
53a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
53b0: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
53c0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
53d0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
53e0: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
53f0: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
5400: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5410: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5420: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
5430: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
5440: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
5450: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
5460: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
5470: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5480: 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c  P4_VTAB;.    sql
5490: 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54  ite3VtabLock((VT
54a0: 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20  able *)zP4);.   
54b0: 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62 6c   assert( ((VTabl
54c0: 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d  e *)zP4)->db==p-
54d0: 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  >db );.  }else i
54e0: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f  f( n<0 ){.    pO
54f0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5500: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5510: 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20  4type = (signed 
5520: 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b  char)n;.  }else{
5530: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
5540: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
5550: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
5560: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
5570: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
5580: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
5590: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
55a0: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a  DYNAMIC;.  }.}..
55b0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
55c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
55d0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
55e0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
55f0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
5600: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
5610: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
5620: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5630: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5640: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5650: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
5660: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5670: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5680: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5690: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
56a0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
56b0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
56c0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
56d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
56e0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
56f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5700: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5710: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5720: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5730: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5740: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5760: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5770: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5780: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
5790: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
57a0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
57b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
57c0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
57d0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
57e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
57f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5800: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5810: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5820: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5830: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5840: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5850: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5860: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5870: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
5880: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
5890: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
58a0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
58b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
58c0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
58d0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
58e0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
58f0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5900: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
5910: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5920: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5930: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5940: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5950: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5960: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5970: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5980: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
5990: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UG */../*.** Ret
59a0: 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66  urn the opcode f
59b0: 6f 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65  or a given addre
59c0: 73 73 2e 20 20 49 66 20 74 68 65 20 61 64 64 72  ss.  If the addr
59d0: 65 73 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a  ess is -1, then.
59e0: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** return the mo
59f0: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
5a00: 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  rted opcode..**.
5a10: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
5a20: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
5a30: 68 61 73 20 6f 63 63 75 72 72 65 64 20 70 72 69  has occurred pri
5a40: 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e  or to the callin
5a50: 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75  g of this.** rou
5a60: 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69  tine, then a poi
5a70: 6e 74 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20  nter to a dummy 
5a80: 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72  VdbeOp will be r
5a90: 65 74 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f  eturned.  That o
5aa0: 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64  pcode.** is read
5ab0: 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69  able but not wri
5ac0: 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74  table, though it
5ad0: 20 69 73 20 63 61 73 74 20 74 6f 20 61 20 77 72   is cast to a wr
5ae0: 69 74 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a  itable value..**
5af0: 20 54 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61   The return of a
5b00: 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c   dummy opcode al
5b10: 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f  lows the call to
5b20: 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69   continue functi
5b30: 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61  oning.** after a
5b40: 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f   OOM fault witho
5b50: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65  ut having to che
5b60: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
5b70: 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a   return from .**
5b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5b90: 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
5ba0: 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
5bb0: 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20  he dummy.opcode 
5bc0: 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77  is 0,.** dummy w
5bd0: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69  ill never be wri
5be0: 74 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69  tten to.  This i
5bf0: 73 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f  s verified by co
5c00: 64 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e  de inspection an
5c10: 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20  d.** by running 
5c20: 77 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a  with Valgrind..*
5c30: 2a 0a 2a 2a 20 41 62 6f 75 74 20 74 68 65 20 23  *.** About the #
5c40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5c50: 54 5f 54 52 41 43 45 3a 20 20 4e 6f 72 6d 61 6c  T_TRACE:  Normal
5c60: 6c 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ly, this routine
5c70: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
5c80: 0a 2a 2a 20 75 6e 6c 65 73 73 20 70 2d 3e 6e 4f  .** unless p->nO
5c90: 70 3e 30 2e 20 20 54 68 69 73 20 69 73 20 62 65  p>0.  This is be
5ca0: 63 61 75 73 65 20 69 6e 20 74 68 65 20 61 62 73  cause in the abs
5cb0: 65 6e 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  ense of SQLITE_O
5cc0: 4d 49 54 5f 54 52 41 43 45 2c 0a 2a 2a 20 61 6e  MIT_TRACE,.** an
5cd0: 20 4f 50 5f 54 72 61 63 65 20 69 6e 73 74 72 75   OP_Trace instru
5ce0: 63 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ction is always 
5cf0: 69 6e 73 65 72 74 65 64 20 62 79 20 73 71 6c 69  inserted by sqli
5d00: 74 65 33 56 64 62 65 47 65 74 28 29 20 61 73 20  te3VdbeGet() as 
5d10: 73 6f 6f 6e 20 61 73 0a 2a 2a 20 61 20 6e 65 77  soon as.** a new
5d20: 20 56 44 42 45 20 69 73 20 63 72 65 61 74 65 64   VDBE is created
5d30: 2e 20 20 53 6f 20 77 65 20 61 72 65 20 66 72 65  .  So we are fre
5d40: 65 20 74 6f 20 73 65 74 20 61 64 64 72 20 74 6f  e to set addr to
5d50: 20 70 2d 3e 6e 4f 70 2d 31 20 77 69 74 68 6f 75   p->nOp-1 withou
5d60: 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20 64  t.** having to d
5d70: 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 6f 20 6d  ouble-check to m
5d80: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
5d90: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 6e 2d  e result is non-
5da0: 6e 65 67 61 74 69 76 65 2e 20 42 75 74 0a 2a 2a  negative. But.**
5db0: 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
5dc0: 54 52 41 43 45 20 69 73 20 64 65 66 69 6e 65 64  TRACE is defined
5dd0: 2c 20 74 68 65 20 4f 50 5f 54 72 61 63 65 20 69  , the OP_Trace i
5de0: 73 20 6f 6d 69 74 74 65 64 20 61 6e 64 20 77 65  s omitted and we
5df0: 20 64 6f 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 63   do need to.** c
5e00: 68 65 63 6b 20 74 68 65 20 76 61 6c 75 65 20 6f  heck the value o
5e10: 66 20 70 2d 3e 6e 4f 70 2d 31 20 62 65 66 6f 72  f p->nOp-1 befor
5e20: 65 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 0a 2a 2f  e continuing..*/
5e30: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
5e40: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
5e50: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
5e60: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
5e70: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
5e80: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
5e90: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
5ea0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
5eb0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
5ec0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
5ed0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
5ee0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
5ef0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
5f00: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
5f10: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
5f20: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
5f30: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
5f40: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
5f50: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
5f60: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
5f70: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
5f80: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
5f90: 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72  f( p->nOp==0 ) r
5fa0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
5fb0: 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20  dummy;.#endif.  
5fc0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20    addr = p->nOp 
5fd0: 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  - 1;.  }.  asser
5fe0: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
5ff0: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
6000: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6010: 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  ed );.  if( p->d
6020: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56  ){.    return (V
6040: 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20  dbeOp*)&dummy;. 
6050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6060: 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  rn &p->aOp[addr]
6070: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
6080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6090: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
60a0: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
60b0: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
60c0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
60d0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
60e0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
60f0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
6100: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
6110: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
6120: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
6130: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
6140: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
6150: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
6160: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
6170: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
6180: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
6190: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
61a0: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
61b0: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
61c0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
61d0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
61e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
61f0: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
6200: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
6210: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
6220: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
6230: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
6240: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
6250: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
6260: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
6270: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
6280: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6290: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
62a0: 2c 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20  , "keyinfo(%d", 
62b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
62c0: 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c  );.      i = sql
62d0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
62e0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
62f0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
6300: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
6310: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
6320: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
6330: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
6340: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
6350: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
6360: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6370: 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  0(pColl->zName);
6380: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
6390: 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20  +n>nTemp-6 ){.  
63a0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
63b0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e  (&zTemp[i],",...
63c0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",4);.          
63d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
63e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a     }.          z
63f0: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
6400: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
6410: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
6420: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  der[j] ){.      
6430: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6440: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20   = '-';.        
6450: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
6460: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20  mcpy(&zTemp[i], 
6470: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31  pColl->zName,n+1
6480: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
6490: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = n;.        }el
64a0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70  se if( i+4<nTemp
64b0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -6 ){.          
64c0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
64d0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20  ,",nil",4);.    
64e0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
64f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6500: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
6510: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
6520: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
6530: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
6540: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
6550: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6560: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
6570: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
6580: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
6590: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
65a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
65b0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73  p, zTemp, "colls
65c0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c  eq(%.20s)", pCol
65d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
65e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
65f0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
6600: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
6610: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
6620: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
6630: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6640: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
6650: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
6660: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
6670: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6680: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6690: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  4_INT64: {.     
66a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
66b0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
66c0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34  "%lld", *pOp->p4
66d0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72  .pI64);.      br
66e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
66f0: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a  ase P4_INT32: {.
6700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6720: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e  emp, "%d", pOp->
6730: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65  p4.i);.      bre
6740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6750: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20  se P4_REAL: {.  
6760: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6770: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
6780: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70  p, "%.16g", *pOp
6790: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20  ->p4.pReal);.   
67a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
67b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
67c0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d   {.      Mem *pM
67d0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65  em = pOp->p4.pMe
67e0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  m;.      if( pMe
67f0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  m->flags & MEM_S
6800: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  tr ){.        zP
6810: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20  4 = pMem->z;.   
6820: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
6830: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  m->flags & MEM_I
6840: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nt ){.        sq
6850: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
6860: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c  Temp, zTemp, "%l
6870: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b  ld", pMem->u.i);
6880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6890: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
68a0: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
68b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
68c0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
68d0: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d  , "%.16g", pMem-
68e0: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >r);.      }else
68f0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
6900: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20   & MEM_Null ){. 
6910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6920: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6930: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  Temp, "NULL");. 
6940: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6950: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
6960: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ->flags & MEM_Bl
6970: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50  ob );.        zP
6980: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20  4 = "(blob)";.  
6990: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
69a0: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
69b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
69c0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
69d0: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20  se P4_VTAB: {.  
69e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
69f0: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70   *pVtab = pOp->p
6a00: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a  4.pVtab->pVtab;.
6a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6a20: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
6a30: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70  emp, "vtab:%p:%p
6a40: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d  ", pVtab, pVtab-
6a50: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20  >pModule);.     
6a60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6a70: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
6a80: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
6a90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6aa0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
6ab0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
6ac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6ad0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
6ae0: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
6af0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6b00: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
6b10: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
6b20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6b30: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
6b40: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
6b50: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
6b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6b70: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
6b80: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
6b90: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
6ba0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
6bb0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
6bc0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
6bd0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
6be0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
6bf0: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
6c00: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
6c10: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
6c20: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
6c30: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
6c40: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
6c50: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
6c60: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
6c70: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
6c80: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
6c90: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
6ca0: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
6cb0: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
6cc0: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
6cd0: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
6ce0: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
6cf0: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
6d00: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
6d10: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
6d20: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
6d30: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
6d40: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
6d50: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
6d60: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
6d70: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6d80: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
6d90: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
6da0: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
6db0: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
6dc0: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
6dd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
6de0: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
6df0: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 70  eeMask)*8 );.  p
6e00: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 28  ->btreeMask |= (
6e10: 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (yDbMask)1)<<i;.
6e20: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
6e30: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
6e40: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
6e50: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 70 2d 3e  .pBt) ){.    p->
6e60: 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 28 28 79 44  lockMask |= ((yD
6e70: 62 4d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 7d  bMask)1)<<i;.  }
6e80: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6e90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
6ea0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
6eb0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
6ec0: 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  0./*.** If SQLit
6ed0: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f  e is compiled to
6ee0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
6ef0: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74  cache mode and t
6f00: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c  o be threadsafe,
6f10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6f20: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74   obtains the mut
6f30: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
6f40: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64  th each BtShared
6f50: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68   structure.** th
6f60: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73  at may be access
6f70: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
6f80: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
6f90: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20  nt. In doing so 
6fa0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20  it also.** sets 
6fb0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
6fc0: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f  member of each o
6fd0: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  f the BtShared s
6fe0: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72  tructures, ensur
6ff0: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ing.** that the 
7000: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e  correct busy-han
7010: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73  dler callback is
7020: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75   invoked if requ
7030: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  ired..**.** If S
7040: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72  QLite is not thr
7050: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73  eadsafe but does
7060: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d   support shared-
7070: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
7080: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
7090: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b  Enter() is invok
70a0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74  ed to set the Bt
70b0: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62  Shared.db variab
70c0: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66  les.** of all of
70d0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
70e0: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20  ures accessible 
70f0: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65  via the database
7100: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f   handle .** asso
7110: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
7120: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  VM..**.** If SQL
7130: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ite is not threa
7140: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e  dsafe and does n
7150: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65  ot support share
7160: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d-cache mode, th
7170: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  is.** function i
7180: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
7190: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73   The p->btreeMas
71a0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74  k field is a bit
71b0: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65  mask of all btre
71c0: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70  es that the prep
71d0: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65  ared .** stateme
71e0: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75  nt p will ever u
71f0: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68  se.  Let N be th
7200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7210: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7220: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
7230: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74  g to btrees that
7240: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68   use shared cach
7250: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e  e.  Then the run
7260: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20  time of.** this 
7270: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20  routine is N*N. 
7280: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72   But as N is rar
7290: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c  ely more than 1,
72a0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
72b0: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  .** be a problem
72c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
72d0: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20  3VdbeEnter(Vdbe 
72e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
72f0: 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20  yDbMask mask;.  
7300: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
7310: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
7320: 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f 63 6b  b;.  if( p->lock
7330: 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e  Mask==0 ) return
7340: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
7350: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
7360: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
7370: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
7380: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
7390: 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c 6e 44  =0, mask=1; i<nD
73a0: 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b 3d 20  b; i++, mask += 
73b0: 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28 20 69  mask){.    if( i
73c0: 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26 20 70  !=1 && (mask & p
73d0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30 20 26  ->lockMask)!=0 &
73e0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e  & ALWAYS(aDb[i].
73f0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  pBt!=0) ){.     
7400: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
7410: 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  er(aDb[i].pBt);.
7420: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
7430: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
7440: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
7450: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51  RED_CACHE) && SQ
7460: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
7470: 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61  0./*.** Unlock a
7480: 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73  ll of the btrees
7490: 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b   previously lock
74a0: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
74b0: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
74c0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
74d0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
74e0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
74f0: 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
7500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
7510: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20   Db *aDb;.  int 
7520: 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e 6c 6f  nDb;.  if( p->lo
7530: 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 74 75  ckMask==0 ) retu
7540: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
7550: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
7560: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
7570: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
7580: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
7590: 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 3c  (i=0, mask=1; i<
75a0: 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b 20 2b  nDb; i++, mask +
75b0: 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 66 28  = mask){.    if(
75c0: 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b 20 26   i!=1 && (mask &
75d0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 3d 30   p->lockMask)!=0
75e0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69   && ALWAYS(aDb[i
75f0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20  ].pBt!=0) ){.   
7600: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
7610: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29  eave(aDb[i].pBt)
7620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
7630: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
7640: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
7650: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
7660: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
7670: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
7680: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
7690: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
76a0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
76b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
76c0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
76d0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
76e0: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
76f0: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
7700: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
7710: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7720: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
7730: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
7740: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
7750: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
7760: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
7770: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
7780: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
7790: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
77a0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
77b0: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
77c0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
77d0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
77e0: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
77f0: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
7800: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
7810: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
7820: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
7830: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
7840: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
7850: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
7860: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
7870: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7880: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
7890: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
78a0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
78b0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
78c0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
78d0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
78e0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b  {.    Mem *pEnd;
78f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
7900: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38   = p->db;.    u8
7910: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
7920: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7930: 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  d;.    if( db->p
7940: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20  nBytesFreed ){. 
7950: 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70       for(pEnd=&p
7960: 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b  [N]; p<pEnd; p++
7970: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7980: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7990: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
79a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
79b0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45      }.    for(pE
79c0: 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64  nd=&p[N]; p<pEnd
79d0: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; p++){.      as
79e0: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
79f0: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
7a00: 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20  p[1].db );..    
7a10: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
7a20: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
7a30: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
7a40: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
7a50: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
7a60: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
7a70: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
7a80: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
7a90: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
7aa0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
7ab0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
7ac0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
7ad0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
7ae0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
7af0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
7b00: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
7b10: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
7b20: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
7b30: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
7b40: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
7b50: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
7b60: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
7b70: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
7b80: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
7b90: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
7ba0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
7bb0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
7bc0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
7bd0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
7be0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
7bf0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
7c00: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
7c10: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
7c20: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
7c30: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
7c40: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
7c50: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
7c60: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
7c70: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
7c80: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
7c90: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
7ca0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
7cb0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
7cc0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
7cd0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
7ce0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
7cf0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
7d00: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
7d10: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
7d20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d30: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
7d40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
7d50: 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  f( p->zMalloc ){
7d60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7d70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
7d80: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20  alloc);.        
7d90: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  p->zMalloc = 0;.
7da0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
7db0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
7dc0: 76 61 6c 69 64 3b 0a 20 20 20 20 7d 0a 20 20 20  valid;.    }.   
7dd0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7de0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
7df0: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d;.  }.}../*.** 
7e00: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61  Delete a VdbeFra
7e10: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74  me object and it
7e20: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65  s contents. Vdbe
7e30: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72  Frame objects ar
7e40: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62  e.** allocated b
7e50: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d  y the OP_Program
7e60: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74   opcode in sqlit
7e70: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f  e3VdbeExec()..*/
7e80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7e90: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62  eFrameDelete(Vdb
7ea0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e  eFrame *p){.  in
7eb0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d  t i;.  Mem *aMem
7ec0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28   = VdbeFrameMem(
7ed0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  p);.  VdbeCursor
7ee0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65   **apCsr = (Vdbe
7ef0: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b  Cursor **)&aMem[
7f00: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20  p->nChildMem];. 
7f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7f20: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a  ChildCsr; i++){.
7f30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
7f40: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20  reeCursor(p->v, 
7f50: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apCsr[i]);.  }. 
7f60: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
7f70: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64  (aMem, p->nChild
7f80: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Mem);.  sqlite3D
7f90: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
7fa0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
7fb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fc0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
7fd0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
7fe0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
7ff0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
8000: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
8010: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
8020: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
8030: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
8040: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
8050: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
8060: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
8070: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
8080: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
8090: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
80a0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
80b0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
80c0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
80d0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
80e0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
80f0: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
8100: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
8110: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
8120: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
8130: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
8140: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
8150: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
8160: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
8170: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
8180: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
8190: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
81a0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
81b0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
81c0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
81d0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
81e0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
81f0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
8200: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
8210: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
8220: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
8230: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
8240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8250: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
8260: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8280: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
8290: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
82a0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
82b0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
82c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
82e0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
82f0: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
8300: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
8310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8320: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
8330: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
8340: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8360: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
8370: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
8380: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
8390: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
83b0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
83c0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
83d0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83f0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8400: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
8410: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
8420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8430: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
8440: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
8450: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
8460: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
8470: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
8480: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
8490: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
84a0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
84b0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
84c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
84d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
84e0: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
84f0: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
8500: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
8510: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
8520: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
8530: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
8540: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
8550: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
8560: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
8570: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
8580: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
8590: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
85a0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
85b0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
85c0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
85d0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
85e0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
85f0: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
8600: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
8610: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
8620: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
8630: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65     /* This happe
8640: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ns if a malloc()
8650: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74   inside a call t
8660: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  o sqlite3_column
8670: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a  _text() or.    *
8680: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
8690: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64  _text16() failed
86a0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61  .  */.    db->ma
86b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
86c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
86e0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
86f0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77  er of output row
8700: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20  s reaches nRow, 
8710: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20  that means the. 
8720: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20   ** listing has 
8730: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c  finished and sql
8740: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75  ite3_step() shou
8750: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ld return SQLITE
8760: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77  _DONE..  ** nRow
8770: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
8780: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
8790: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72  s in the main pr
87a0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a  ogram, plus.  **
87b0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
87c0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
87d0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75  n all trigger su
87e0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e  bprograms encoun
87f0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61  tered.  ** so fa
8800: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c  r.  The nRow val
8810: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65  ue will increase
8820: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20   as new trigger 
8830: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a  subprograms are.
8840: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64    ** encountered
8850: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c  , but p->pc will
8860: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63   eventually catc
8870: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20  h up to nRow..  
8880: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e  */.  nRow = p->n
8890: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  Op;.  if( p->exp
88a0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f  lain==1 ){.    /
88b0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65  * The first 8 me
88c0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75  mory cells are u
88d0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75  sed for the resu
88e0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77  lt set.  So we w
88f0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  ill.    ** comma
8900: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65  ndeer the 9th ce
8910: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f  ll to use as sto
8920: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61  rage for an arra
8930: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20  y of pointers.  
8940: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20    ** to trigger 
8950: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68  subprograms.  Th
8960: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e  e VDBE is guaran
8970: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20  teed to have at 
8980: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63  least 9.    ** c
8990: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73  ells.  */.    as
89a0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20  sert( p->nMem>9 
89b0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70  );.    pSub = &p
89c0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69  ->aMem[9];.    i
89d0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d  f( pSub->flags&M
89e0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20  EM_Blob ){.     
89f0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74   /* On the first
8a00: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8a10: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69  _step(), pSub wi
8a20: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20  ll hold a NULL. 
8a30: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20   It is.      ** 
8a40: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
8a50: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f   BLOB by the P4_
8a60: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65  SUBPROGRAM proce
8a70: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f  ssing logic belo
8a80: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20  w */.      nSub 
8a90: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66  = pSub->n/sizeof
8aa0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61  (Vdbe*);.      a
8ab0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
8ac0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
8ad0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
8ae0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a  ; i<nSub; i++){.
8af0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70        nRow += ap
8b00: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20  Sub[i]->nOp;.   
8b10: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
8b20: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20    i = p->pc++;. 
8b30: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20   }while( i<nRow 
8b40: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
8b50: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
8b60: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
8b70: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f   );.  if( i>=nRo
8b80: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  w ){.    p->rc =
8b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
8ba0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
8bb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
8bc0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
8bd0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
8be0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
8bf0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
8c00: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
8c10: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
8c20: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c  &p->zErrMsg, db,
8c30: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72   "%s", sqlite3Er
8c40: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
8c50: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
8c60: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b  *z;.    Op *pOp;
8c70: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f  .    if( i<p->nO
8c80: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  p ){.      /* Th
8c90: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75  e output line nu
8ca0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e  mber is small en
8cb0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65  ough that we are
8cc0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20   still in the.  
8cd0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67      ** main prog
8ce0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f  ram. */.      pO
8cf0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
8d00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8d10: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65   /* We are curre
8d20: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62  ntly listing sub
8d30: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72  programs.  Figur
8d40: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
8d50: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63  and.      ** pic
8d60: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72  k up the appropr
8d70: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a  iate opcode. */.
8d80: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
8d90: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a     i -= p->nOp;.
8da0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69        for(j=0; i
8db0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b  >=apSub[j]->nOp;
8dc0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
8dd0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   -= apSub[j]->nO
8de0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
8df0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d   pOp = &apSub[j]
8e00: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aOp[i];.    }.
8e10: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
8e20: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
8e30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
8e40: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
8e50: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
8e60: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
8e70: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ea0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
8eb0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
8ec0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
8ed0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
8ee0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
8ef0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
8f00: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
8f10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
8f20: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
8f30: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
8f40: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
8f50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
8f60: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
8f70: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
8f80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
8f90: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
8fa0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
8fb0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
8fc0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
8fd0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
8fe0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8ff0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
9000: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
9010: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
9020: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
9030: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
9040: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
9050: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
9060: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
9070: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
9080: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
9090: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
90a0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
90b0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
90c0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
90d0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
90e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
90f0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
9100: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
9110: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
9120: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
9130: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
9140: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
9150: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
9160: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
9170: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
9180: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
9190: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
91a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
91b0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
91c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
91d0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
91e0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
91f0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
9200: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
9210: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
9220: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
9230: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
9240: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
9250: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
9260: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
9270: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
9280: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
9290: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
92a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
92b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
92c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
92d0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
92e0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
9310: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9320: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
9330: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
9340: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
9350: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
9360: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
9370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9380: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
9390: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
93a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
93b0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
93c0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
93d0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
93e0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
93f0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9410: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P3 */.    pMem->
9420: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
9430: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
9440: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
9450: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
9460: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
9470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
9480: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9490: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
94a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
94b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
94c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  R;.    }.    pMe
94d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
94e0: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
94f0: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
9500: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
9510: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
9520: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
9530: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9540: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
9550: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
9560: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
9570: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9580: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
9590: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
95a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
95b0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
95c0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
95d0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20  TE_UTF8;.    }. 
95e0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
95f0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
9600: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
9610: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
9620: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9630: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
9640: 70 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20  pMem, 4, 0) ){. 
9650: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9660: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
9670: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
9680: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
9690: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
96a0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
96b0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
96c0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
96d0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
96e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
96f0: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
9700: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
9710: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
9720: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
9730: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
9740: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
9750: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
9760: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
9770: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9780: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a        if( pOp->z
9790: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
97a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
97b0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
97c0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  m;.        pMem-
97d0: 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  >z = pOp->zComme
97e0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  nt;.        pMem
97f0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
9800: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
9810: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
9820: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
9830: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  .        pMem->t
9840: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
9850: 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  T;.      }else.#
9860: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
9870: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
9880: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
98b0: 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /.        pMem->
98c0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55  type = SQLITE_NU
98d0: 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
98e0: 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f  }..    p->nResCo
98f0: 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d  lumn = 8 - 4*(p-
9900: 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20  >explain-1);.   
9910: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
9920: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20   &p->aMem[1];.  
9930: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9940: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
9950: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
9960: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
9970: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9980: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
9990: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
99a0: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
99b0: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
99c0: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
99d0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
99e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
99f0: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
9a00: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
9a10: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
9a20: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
9a30: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
9a40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
9a50: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
9a60: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
9a70: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
9a80: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
9a90: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
9aa0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
9ab0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
9ac0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
9ad0: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
9ae0: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
9af0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
9b00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
9b10: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
9b20: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
9b30: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
9b40: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
9b50: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
9b60: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
9b70: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
9b80: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
9b90: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
9ba0: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
9bb0: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
9bc0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
9bd0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
9be0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
9bf0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
9c00: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
9c10: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
9c20: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
9c30: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
9c40: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
9c50: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9c60: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
9c70: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
9c80: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
9c90: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9ca0: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
9cb0: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
9cc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
9cd0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
9ce0: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
9cf0: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
9d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
9d10: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
9d20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
9d30: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
9d40: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
9d50: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
9d60: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
9d70: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
9d80: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
9d90: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
9da0: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
9db0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
9dc0: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
9dd0: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
9de0: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
9df0: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
9e00: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
9e10: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
9e20: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
9e30: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
9e40: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
9e50: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
9e60: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
9e70: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
9e80: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
9e90: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
9ea0: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
9eb0: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
9ec0: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
9ed0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
9ee0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
9ef0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
9f00: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
9f10: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
9f20: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
9f30: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
9f40: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
9f50: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
9f60: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
9f70: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
9f80: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
9f90: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
9fa0: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
9fb0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
9fc0: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
9fd0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
9fe0: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
9ff0: 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74  ** *ppFrom point
a000: 73 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73  s to available s
a010: 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f  pace and pEnd po
a020: 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20  ints to the end 
a030: 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61  of the.** availa
a040: 62 6c 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e  ble space.  When
a050: 20 73 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   space is alloca
a060: 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20  ted, *ppFrom is 
a070: 61 64 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a  advanced past.**
a080: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a090: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
a0a0: 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69  .**.** *pnByte i
a0b0: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
a0c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
a0d0: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
a0e0: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
a0f0: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
a100: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
a110: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
a120: 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73  *ppFrom to satis
a130: 66 79 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73  fy the.** reques
a140: 74 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e  t, then incremen
a150: 74 20 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65  t *pnByte by the
a160: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
a170: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
a180: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
a190: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
a1a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
a1b0: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
a1c0: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
a1d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
a1e0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
a1f0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
a200: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
a210: 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20  u8 **ppFrom,    
a220: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
a230: 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70  Allocate from *p
a240: 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70  pFrom */.  u8 *p
a250: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
a260: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
a270: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  byte past the en
a280: 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66  d of *ppFrom buf
a290: 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  fer */.  int *pn
a2a0: 42 79 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Byte          /*
a2b0: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
a2c0: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
a2d0: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
a2e0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
a2f0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
a300: 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29  NMENT(*ppFrom) )
a310: 3b 0a 20 20 69 66 28 20 70 42 75 66 20 29 20 72  ;.  if( pBuf ) r
a320: 65 74 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42  eturn pBuf;.  nB
a330: 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79  yte = ROUND8(nBy
a340: 74 65 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70  te);.  if( &(*pp
a350: 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20  From)[nByte] <= 
a360: 70 45 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66  pEnd ){.    pBuf
a370: 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f   = (void*)*ppFro
a380: 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b  m;.    *ppFrom +
a390: 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65  = nByte;.  }else
a3a0: 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d  {.    *pnByte +=
a3b0: 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
a3c0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
a3d0: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
a3e0: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
a3f0: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
a400: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
a410: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
a420: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
a430: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
a440: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
a450: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
a460: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a470: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
a480: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
a490: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
a4a0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
a4b0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
a4c0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
a4d0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
a4e0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
a4f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
a500: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
a510: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
a520: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
a530: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
a540: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
a550: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
a560: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
a570: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
a580: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
a590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
a5a0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
a5b0: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
a5c0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
a5d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
a5e0: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
a5f0: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
a600: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
a610: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
a620: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
a630: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
a640: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
a650: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
a660: 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65  5;.  p->iStateme
a670: 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b  nt = 0;.  p->nFk
a680: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a  Constraint = 0;.
a690: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
a6a0: 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ILE.  for(i=0; i
a6b0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
a6c0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
a6d0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70   = 0;.    p->aOp
a6e0: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
a6f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
a700: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
a710: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
a720: 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20  r execution for 
a730: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
a740: 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67  fter.** creating
a750: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
a760: 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f  hine.  This invo
a770: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68  lves things such
a780: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e  .** as allocatin
a790: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e  g stack space an
a7a0: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  d initializing t
a7b0: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74  he program count
a7c0: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65  er..** After the
a7d0: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65   VDBE has be pre
a7e0: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20  pped, it can be 
a7f0: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20  executed by one 
a800: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73  or more.** calls
a810: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45   to sqlite3VdbeE
a820: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  xec().  .**.** T
a830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
a840: 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74   be called exact
a850: 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61 63 68 20   once on a each 
a860: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
a870: 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
a880: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
a890: 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
a8a0: 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20   "packaged" and 
a8b0: 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72  is ready.** to r
a8c0: 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  un.  After this 
a8d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a8e0: 64 2c 20 66 75 74 68 65 72 20 63 61 6c 6c 73 20  d, futher calls 
a8f0: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
a900: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
a910: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
a920: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
a930: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
a940: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
a950: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
a960: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
a970: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
a980: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
a990: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
a9a0: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
a9b0: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
a9c0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
a9d0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
a9e0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
a9f0: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
aa00: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
aa10: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aa20: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
aa30: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
aa40: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
aa50: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
aa60: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
aa70: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa90: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
aaa0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
aab0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
aac0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
aad0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
aae0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ab00: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
ab10: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
ab20: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
ab30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ab40: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
ab50: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
ab60: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
ab70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ab80: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
ab90: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
aba0: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
abb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
abc0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
abd0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
abe0: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
abf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
ac10: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
ac20: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
ac30: 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  Once;           
ac40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ac50: 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69  ber of OP_Once i
ac60: 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
ac70: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
aca0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20  */.  u8 *zCsr;  
acb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acc0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
acd0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
ace0: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a  cation */.  u8 *
acf0: 7a 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  zEnd;           
ad00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ad10: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c  rst byte past al
ad20: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a  located memory *
ad30: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad50: 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65     /* How much e
ad60: 78 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e  xtra memory is n
ad70: 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  eeded */..  asse
ad80: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
ad90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
ada0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
adb0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
adc0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
add0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
ade0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
adf0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
ae00: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
ae10: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
ae20: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
ae30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
ae40: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
ae50: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
ae60: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
ae70: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
ae80: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
ae90: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
aea0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
aeb0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
aec0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
aed0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46  g[] */.  .  /* F
aee0: 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72 20 72  or each cursor r
aef0: 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c  equired, also al
af00: 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  locate a memory 
af10: 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a  cell. Memory.  *
af20: 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d  * cells (nMem+1-
af30: 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20  nCursor)..nMem, 
af40: 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20  inclusive, will 
af50: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 62 79  never be used by
af60: 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70  .  ** the vdbe p
af70: 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20  rogram. Instead 
af80: 74 68 65 79 20 61 72 65 20 75 73 65 64 20 74 6f  they are used to
af90: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
afa0: 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72  for.  ** VdbeCur
afb0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
afc0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
afd0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
afe0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
aff0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
b000: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
b010: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
b020: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
b030: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
b040: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
b050: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
b060: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
b070: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
b080: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
b090: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
b0a0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
b0b0: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
b0c0: 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  for memory regis
b0d0: 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62  ters, SQL variab
b0e0: 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72  les, VDBE cursor
b0f0: 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61  s and .  ** an a
b100: 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20  rray to marshal 
b110: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67  SQL function arg
b120: 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a  uments in..  */.
b130: 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70    zCsr = (u8*)&p
b140: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20  ->aOp[p->nOp];  
b150: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
b160: 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c  valiable for all
b170: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e  ocation */.  zEn
b180: 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70  d = (u8*)&p->aOp
b190: 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  [p->nOpAlloc];  
b1a0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
b1b0: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
b1c0: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
b1d0: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
b1e0: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
b1f0: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
b200: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
b210: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
b220: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
b230: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
b240: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
b250: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
b260: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
b270: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
b280: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
b290: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
b2a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
b2b0: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
b2c0: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
b2d0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
b2e0: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
b2f0: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
b300: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
b310: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
b320: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
b330: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
b340: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
b350: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
b360: 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20  he .  ** end of 
b370: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
b380: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
b390: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
b3a0: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72  ll memory.  ** r
b3b0: 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72  equirements by r
b3c0: 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64  eusing the opcod
b3d0: 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68  e array tail, th
b3e0: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  en the second.  
b3f0: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
b400: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
b410: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
b420: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
b430: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
b440: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
b450: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
b460: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
b470: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
b480: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
b490: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b4a0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
b4b0: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
b4c0: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
b4d0: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
b4e0: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
b4f0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
b500: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e   */.  do {.    n
b510: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Byte = 0;.    p-
b520: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
b530: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
b540: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
b550: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
b560: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  e);.    p->aVar 
b570: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
b580: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
b590: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
b5a0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
b5b0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
b5c0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
b5d0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
b5e0: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
b5f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
b600: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
b610: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
b620: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
b630: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
b640: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
b650: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
b660: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
b670: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
b680: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c      &zCsr, zEnd,
b6b0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
b6c0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c  >aOnceFlag = all
b6d0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65  ocSpace(p->aOnce
b6e0: 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43  Flag, nOnce, &zC
b6f0: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
b700: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
b710: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72   ){.      p->pFr
b720: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
b730: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
b740: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  te);.    }.    z
b750: 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a  Csr = p->pFree;.
b760: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
b770: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c  [nByte];.  }whil
b780: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
b790: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
b7a0: 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ..  p->nCursor =
b7b0: 20 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20   (u16)nCursor;. 
b7c0: 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   p->nOnceFlag = 
b7d0: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e  nOnce;.  if( p->
b7e0: 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  aVar ){.    p->n
b7f0: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
b800: 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  r;.    for(n=0; 
b810: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
b820: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
b830: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
b840: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
b850: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
b860: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a  .  }.  if( p->az
b870: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a  Var ){.    p->nz
b880: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a  Var = pParse->nz
b890: 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Var;.    memcpy(
b8a0: 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65  p->azVar, pParse
b8b0: 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61  ->azVar, p->nzVa
b8c0: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61  r*sizeof(p->azVa
b8d0: 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73  r[0]));.    mems
b8e0: 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  et(pParse->azVar
b8f0: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56  , 0, pParse->nzV
b900: 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  ar*sizeof(pParse
b910: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
b920: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
b930: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  ){.    p->aMem--
b940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b950: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
b960: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
b970: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65  em */.    p->nMe
b980: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
b990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
b9a0: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
b9b0: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72  Mem-1 */.    for
b9c0: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
b9d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
b9e0: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
b9f0: 4d 5f 49 6e 76 61 6c 69 64 3b 0a 20 20 20 20 20  M_Invalid;.     
ba00: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d   p->aMem[n].db =
ba10: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
ba20: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50   p->explain = pP
ba30: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20  arse->explain;. 
ba40: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
ba50: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nd(p);.}../*.** 
ba60: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72  Close a VDBE cur
ba70: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20  sor and release 
ba80: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65  all the resource
ba90: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a  s that cursor .*
baa0: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c  * happens to hol
bab0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
bac0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
bad0: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75  (Vdbe *p, VdbeCu
bae0: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66  rsor *pCx){.  if
baf0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pCx==0 ){.    
bb00: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
bb10: 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43  lite3VdbeSorterC
bb20: 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29  lose(p->db, pCx)
bb30: 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74  ;.  if( pCx->pBt
bb40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
bb50: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70  treeClose(pCx->p
bb60: 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  Bt);.    /* The 
bb70: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
bb80: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
bb90: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
bba0: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a  exists, by.    *
bbb0: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  * the call above
bbc0: 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  . */.  }else if(
bbd0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b   pCx->pCursor ){
bbe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
bbf0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
bc00: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a  ->pCursor);.  }.
bc10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
bc20: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
bc30: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
bc40: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
bc50: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
bc60: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
bc70: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
bc80: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
bc90: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
bca0: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
bcb0: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
bcc0: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
bcd0: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
bce0: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
bcf0: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
bd00: 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  thod = 0;.  }.#e
bd10: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ndif.}../*.** Co
bd20: 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  py the values st
bd30: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65  ored in the Vdbe
bd40: 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20  Frame structure 
bd50: 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69  to its Vdbe. Thi
bd60: 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f  s.** is used, fo
bd70: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
bd80: 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72  a trigger sub-pr
bd90: 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20  ogram is halted 
bda0: 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f  to restore.** co
bdb0: 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69  ntrol to the mai
bdc0: 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e  n program..*/.in
bdd0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  t sqlite3VdbeFra
bde0: 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72  meRestore(VdbeFr
bdf0: 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20  ame *pFrame){.  
be00: 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65  Vdbe *v = pFrame
be10: 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ->v;.  v->aOnceF
be20: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
be30: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
be40: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
be50: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
be60: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
be70: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
be80: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
be90: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
bea0: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
beb0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
bec0: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
bed0: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
bee0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
bef0: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
bf00: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
bf10: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
bf20: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
bf30: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
bf40: 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  nge;.  return pF
bf50: 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a  rame->pc;.}../*.
bf60: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  ** Close all cur
bf70: 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  sors..**.** Also
bf80: 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e   release any dyn
bf90: 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64  amic memory held
bfa0: 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68   by the VM in th
bfb0: 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f  e Vdbe.aMem memo
bfc0: 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61  ry .** cell arra
bfd0: 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  y. This is neces
bfe0: 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f  sary as the memo
bff0: 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61  ry cell array ma
c000: 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69  y contain.** poi
c010: 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61  nters to VdbeFra
c020: 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63  me objects, whic
c030: 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f  h may in turn co
c040: 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74  ntain pointers t
c050: 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72  o.** open cursor
c060: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c070: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
c080: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  s(Vdbe *p){.  if
c090: 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20  ( p->pFrame ){. 
c0a0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46     VdbeFrame *pF
c0b0: 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46  rame;.    for(pF
c0c0: 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20  rame=p->pFrame; 
c0d0: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b  pFrame->pParent;
c0e0: 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e   pFrame=pFrame->
c0f0: 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71  pParent);.    sq
c100: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
c110: 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20  store(pFrame);. 
c120: 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d   }.  p->pFrame =
c130: 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20   0;.  p->nFrame 
c140: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61  = 0;..  if( p->a
c150: 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  pCsr ){.    int 
c160: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
c170: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
c180: 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75  +){.      VdbeCu
c190: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
c1a0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Csr[i];.      if
c1b0: 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pC ){.        
c1c0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
c1d0: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
c1e0: 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69        p->apCsr[i
c1f0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
c200: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
c210: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65  ->aMem ){.    re
c220: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
c230: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
c240: 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  em);.  }.  while
c250: 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29  ( p->pDelFrame )
c260: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
c270: 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46  *pDel = p->pDelF
c280: 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65  rame;.    p->pDe
c290: 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70  lFrame = pDel->p
c2a0: 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69  Parent;.    sqli
c2b0: 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65  te3VdbeFrameDele
c2c0: 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a  te(pDel);.  }.}.
c2d0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
c2e0: 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65  the VM after exe
c2f0: 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cution..**.** Th
c300: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c310: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
c320: 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c  ose any cursors,
c330: 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a   lists, and/or.*
c340: 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77  * sorters that w
c350: 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20  ere left open.  
c360: 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20  It also deletes 
c370: 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a  the values of.**
c380: 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68   variables in th
c390: 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a  e aVar[] array..
c3a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
c3b0: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
c3c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c3d0: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
c3e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
c3f0: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
c400: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
c410: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
c420: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
c430: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
c440: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
c450: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
c460: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
c470: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
c480: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
c490: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
c4a0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
c4b0: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
c4c0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
c4d0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
c4e0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
c4f0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
c500: 6c 61 67 73 3d 3d 4d 45 4d 5f 49 6e 76 61 6c 69  lags==MEM_Invali
c510: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
c520: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
c530: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
c540: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
c550: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
c560: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
c570: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
c580: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
c590: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
c5a0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
c5b0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
c5c0: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
c5d0: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
c5e0: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
c5f0: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
c600: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
c610: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
c620: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
c630: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
c640: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
c650: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
c660: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
c670: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
c680: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
c690: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
c6a0: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
c6b0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
c6c0: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
c6d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
c6e0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
c6f0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
c700: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
c710: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
c720: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
c730: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
c740: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
c750: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
c760: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
c770: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
c780: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
c790: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
c7a0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
c7b0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
c7c0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
c7d0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
c7e0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
c7f0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
c800: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
c810: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
c820: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
c830: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
c840: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
c850: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
c860: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
c870: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
c880: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
c890: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
c8a0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
c8b0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
c8c0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
c8d0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
c8e0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
c8f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
c900: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
c910: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
c920: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
c930: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
c940: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
c950: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
c960: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
c970: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
c980: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
c990: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
c9a0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
c9b0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
c9c0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
c9d0: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
c9e0: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
c9f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ca00: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
ca10: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca30: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
ca40: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
ca50: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
ca80: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
ca90: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
caa0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
cab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cac0: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
cad0: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
cae0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
caf0: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
cb00: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
cb10: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
cb20: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
cb30: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
cb40: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
cb50: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
cb60: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
cb70: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
cb80: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
cb90: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
cba0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
cbb0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
cbc0: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
cbd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
cbe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
cbf0: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
cc00: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
cc10: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
cc20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cc30: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
cc40: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
cc50: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
cc60: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
cc70: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
cc80: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
cc90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
cca0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
ccb0: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
ccc0: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
ccd0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
cce0: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
ccf0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
cd00: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
cd10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cd20: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
cd30: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
cd40: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
cd50: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
cd60: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
cd70: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
cd80: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
cd90: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
cda0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
cdb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
cdc0: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
cdd0: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
cde0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
cdf0: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
ce00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ce10: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
ce20: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
ce30: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
ce40: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
ce50: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
ce60: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
ce70: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
ce80: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
ce90: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
cea0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
ceb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
cec0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
ced0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cee0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
cef0: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
cf00: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
cf10: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
cf20: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
cf30: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
cf40: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
cf50: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
cf60: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
cf70: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
cf80: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
cf90: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
cfa0: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
cfb0: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
cfc0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
cfd0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
cfe0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
cff0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
d000: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
d010: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
d020: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
d030: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
d040: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
d050: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
d060: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
d070: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
d080: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
d090: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
d0a0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
d0b0: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
d0c0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20  p->zErrMsg);..  
d0d0: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
d0e0: 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
d0f0: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
d100: 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
d110: 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
d120: 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
d130: 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
d140: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
d150: 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
d160: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
d170: 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
d180: 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
d190: 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
d1a0: 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
d1b0: 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
d1c0: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
d1d0: 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
d1e0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
d1f0: 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
d200: 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
d210: 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
d220: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d230: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d240: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
d250: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
d260: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
d270: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
d280: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
d290: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
d2a0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
d2b0: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
d2c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
d2d0: 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
d2e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d2f0: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65  e3PagerExclusive
d300: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65  Lock(sqlite3Btre
d310: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20  ePager(pBt));.  
d320: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
d330: 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20  Leave(pBt);.    
d340: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  }.  }.  if( rc!=
d350: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d360: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d370: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
d380: 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61  re any write-tra
d390: 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c  nsactions at all
d3a0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d  , invoke the com
d3b0: 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66  mit hook */.  if
d3c0: 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26  ( needXcommit &&
d3d0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d3e0: 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d  back ){.    rc =
d3f0: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d400: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
d410: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Arg);.    if( rc
d420: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d430: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
d440: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NT;.    }.  }.. 
d450: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
d460: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
d470: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
d480: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
d490: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
d4a0: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
d4b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
d4c0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
d4d0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
d4e0: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
d4f0: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
d500: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
d510: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
d520: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
d530: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
d540: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
d550: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
d560: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
d570: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
d580: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
d590: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
d5a0: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
d5b0: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
d5c0: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
d5d0: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
d5e0: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
d5f0: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
d600: 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
d610: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
d620: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
d630: 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
d640: 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
d650: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
d660: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
d670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
d680: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
d690: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
d6a0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
d6b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d6c0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
d6d0: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
d6e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d6f0: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
d700: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
d710: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
d720: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
d730: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
d740: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
d750: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
d760: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
d770: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
d780: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
d790: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
d7a0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
d7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
d7c0: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
d7d0: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
d7e0: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
d7f0: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
d800: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
d810: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
d820: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d830: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d840: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
d850: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
d860: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
d870: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
d880: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
d890: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d8a0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
d8b0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
d8c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
d8d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
d8e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
d8f0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
d900: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
d910: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
d920: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
d930: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
d940: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
d950: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
d960: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
d970: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
d980: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
d990: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
d9a0: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
d9b0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
d9c0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
d9d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
d9e0: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
d9f0: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
da00: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
da10: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
da20: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
da30: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
da40: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
da50: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
da60: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
da70: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
da80: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
da90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
daa0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
dab0: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
dac0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
dad0: 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79  s;.    int retry
dae0: 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  Count = 0;.    i
daf0: 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20  nt nMainFile;.. 
db00: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
db10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
db20: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e  le name */.    n
db30: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
db40: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e  e3Strlen30(zMain
db50: 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74  File);.    zMast
db60: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
db70: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58  ntf(db, "%s-mjXX
db80: 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e  XXXX9XXz", zMain
db90: 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  File);.    if( z
dba0: 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75  Master==0 ) retu
dbb0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dbc0: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
dbd0: 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
dbe0: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
dbf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
dc00: 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
dc10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
dc20: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
dc30: 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
dc40: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
dc50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
dc60: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
dc70: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
dc80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dc90: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
dca0: 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
dcb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
dcc0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
dcd0: 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
dce0: 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
dcf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dd00: 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
dd10: 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
dd20: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
dd30: 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
dd40: 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
dd50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
dd60: 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
dd70: 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
dd80: 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
ddb0: 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
ddc0: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
ddd0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
dde0: 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
ddf0: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
de00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
de10: 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
de20: 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
de30: 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
de40: 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
de50: 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
de60: 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
de70: 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
de80: 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
de90: 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
dea0: 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
deb0: 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
dec0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
ded0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
dee0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
def0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
df00: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
df10: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
df20: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
df30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
df40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
df50: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
df60: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
df70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df80: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
df90: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
dfa0: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
dfb0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
dfc0: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
dfd0: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
dfe0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
dff0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
e000: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
e010: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
e020: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
e030: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e040: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e050: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e060: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e070: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
e080: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
e090: 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
e0a0: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
e0b0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
e0c0: 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
e0d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e0e0: 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
e0f0: 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
e100: 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
e110: 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
e120: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
e130: 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
e140: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
e150: 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
e160: 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
e170: 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
e180: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
e190: 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
e1a0: 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
e1b0: 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
e1c0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
e1d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
e1e0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
e1f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e200: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e210: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e220: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
e230: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
e240: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
e250: 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
e260: 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
e270: 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
e280: 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
e290: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e2a0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
e2b0: 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
e2c0: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
e2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
e2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
e2f0: 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
e300: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
e310: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
e320: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
e330: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
e340: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
e350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e360: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
e370: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
e380: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72  File, sqlite3Str
e390: 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20  len30(zFile)+1, 
e3a0: 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20  offset);.       
e3b0: 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74   offset += sqlit
e3c0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
e3d0: 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )+1;.        if(
e3e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e400: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
e410: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
e420: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
e430: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
e440: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
e450: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e460: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
e470: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e480: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e490: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e4a0: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
e4b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
e4c0: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
e4d0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
e4e0: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
e4f0: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
e500: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
e510: 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a    if( needSync .
e520: 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69       && 0==(sqli
e530: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
e540: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
e550: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
e560: 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
e570: 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
e580: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
e590: 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
e5a0: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
e5b0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
e5c0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
e5d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
e5e0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
e5f0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
e600: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e610: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
e620: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
e630: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
e640: 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
e650: 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
e660: 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
e670: 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
e680: 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
e690: 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
e6a0: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
e6b0: 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
e6c0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
e6d0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
e6e0: 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
e6f0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e700: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
e710: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
e720: 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
e730: 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
e740: 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
e750: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
e760: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
e770: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
e780: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
e790: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
e7a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
e7b0: 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
e7c0: 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
e7d0: 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
e7e0: 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
e7f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
e800: 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
e810: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
e820: 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
e830: 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
e840: 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
e850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
e860: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
e870: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
e880: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
e890: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e8a0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
e8b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e8c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
e8d0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
e8e0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
e8f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e900: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
e910: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
e920: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e930: 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
e940: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e950: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
e960: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
e970: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
e980: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
e990: 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
e9a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e9b0: 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
e9c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
e9d0: 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
e9e0: 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
e9f0: 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
ea00: 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
ea10: 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
ea20: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
ea30: 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
ea40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
ea50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
ea60: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
ea70: 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
ea80: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
ea90: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
eaa0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
eab0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
eac0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
ead0: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
eae0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
eaf0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
eb00: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
eb10: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
eb20: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
eb30: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
eb40: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
eb50: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
eb60: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
eb70: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
eb80: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
eb90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
eba0: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
ebb0: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
ebc0: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
ebd0: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
ebe0: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
ebf0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
ec00: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
ec10: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
ec20: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
ec30: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
ec40: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
ec50: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
ec60: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
ec70: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
ec80: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
ec90: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
eca0: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
ecb0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
ecc0: 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
ecd0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
ece0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
ecf0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
ed00: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
ed10: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
ed20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
ed30: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
ed40: 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
ed50: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
ed60: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
ed70: 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
ed80: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
ed90: 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
eda0: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
edb0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
edc0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
edd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
ede0: 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
edf0: 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62  qlite3.activeVdb
ee00: 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61  eCnt count varia
ee10: 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74  ble.** matches t
ee20: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62  he number of vdb
ee30: 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  e's in the list 
ee40: 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68  sqlite3.pVdbe th
ee50: 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e  at are.** curren
ee60: 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61  tly active. An a
ee70: 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69  ssertion fails i
ee80: 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73  f the two counts
ee90: 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a   do not match..*
eea0: 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74  * This is an int
eeb0: 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b  ernal self-check
eec0: 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f   only - it is no
eed0: 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70  t an essential p
eee0: 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65  rocessing.** ste
eef0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  p..**.** This is
ef00: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42   a no-op if NDEB
ef10: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a  UG is defined..*
ef20: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
ef30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65  .static void che
ef40: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
ef50: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
ef60: 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63  Vdbe *p;.  int c
ef70: 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57  nt = 0;.  int nW
ef80: 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rite = 0;.  p = 
ef90: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
efa0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
efb0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
efc0: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
efd0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
efe0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
eff0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  p->readOnly==0 )
f000: 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d   nWrite++;.    }
f010: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
f020: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
f030: 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65   cnt==db->active
f040: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73  VdbeCnt );.  ass
f050: 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d  ert( nWrite==db-
f060: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
f070: 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
f080: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
f090: 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  Cnt(x).#endif../
f0a0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65  *.** If the Vdbe
f0b0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
f0c0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70  irst argument op
f0d0: 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74  ened a statement
f0e0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a  -transaction,.**
f0f0: 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41   close it now. A
f100: 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74  rgument eOp must
f110: 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50   be either SAVEP
f120: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
f130: 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45  .** SAVEPOINT_RE
f140: 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20  LEASE. If it is 
f150: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f160: 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61  CK, then the sta
f170: 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
f180: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
f190: 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20  back. If eOp is 
f1a0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
f1b0: 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20  E, then the .** 
f1c0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
f1d0: 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65  ction is commtte
f1e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
f1f0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
f200: 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
f210: 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
f220: 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
f230: 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
f240: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
f250: 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
f260: 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
f270: 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
f280: 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
f290: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
f2a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
f2b0: 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
f2c0: 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
f2d0: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
f2e0: 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
f2f0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
f300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
f310: 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
f320: 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
f330: 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
f340: 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
f350: 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
f360: 63 75 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  cured, causing a
f370: 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
f380: 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
f390: 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
f3a0: 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
f3b0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
f3c0: 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
f3d0: 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
f3e0: 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
f3f0: 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
f400: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
f410: 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
f420: 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
f430: 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
f440: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
f450: 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
f460: 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
f470: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
f480: 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
f490: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
f4a0: 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
f4b0: 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
f4c0: 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
f4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
f4e0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
f4f0: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
f500: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
f510: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
f520: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
f530: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
f540: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
f550: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
f560: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
f570: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
f580: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
f590: 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
f5a0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
f5b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f5c0: 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
f5d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f5e0: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
f5f0: 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
f600: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
f610: 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
f620: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f630: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f640: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f650: 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
f660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f670: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
f680: 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
f690: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
f6a0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
f6b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f6c0: 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
f6d0: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
f6e0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f6f0: 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
f700: 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
f710: 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
f720: 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
f730: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
f740: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f750: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
f760: 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
f770: 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
f780: 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
f790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f7a0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
f7b0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
f7c0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
f7d0: 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
f7e0: 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
f7f0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
f800: 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
f810: 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
f820: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
f830: 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
f840: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
f850: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
f860: 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
f870: 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
f880: 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
f890: 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
f8a0: 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
f8b0: 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  DefCons;.    }. 
f8c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
f8e0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
f8f0: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
f900: 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
f910: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
f920: 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
f930: 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
f940: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
f950: 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
f960: 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
f970: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
f980: 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
f990: 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
f9a0: 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
f9b0: 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
f9c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
f9d0: 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
f9e0: 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
f9f0: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
fa00: 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
fa10: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
fa20: 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
fa30: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
fa40: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
fa50: 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
fa60: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 77  CONSTRAINT and w
fa70: 72 69 74 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  rite.** an error
fa80: 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
fa90: 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
faa0: 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
fab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fac0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
fad0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
fae0: 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
faf0: 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
fb00: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
fb10: 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
fb20: 65 64 20 26 26 20 64 62 2d 3e 6e 44 65 66 65 72  ed && db->nDefer
fb30: 72 65 64 43 6f 6e 73 3e 30 29 20 7c 7c 20 28 21  redCons>0) || (!
fb40: 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e  deferred && p->n
fb50: 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20  FkConstraint>0) 
fb60: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
fb70: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
fb80: 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
fb90: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
fba0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
fbb0: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
fbc0: 67 2c 20 64 62 2c 20 22 66 6f 72 65 69 67 6e 20  g, db, "foreign 
fbd0: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 66  key constraint f
fbe0: 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  ailed");.    ret
fbf0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
fc00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
fc10: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
fc20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
fc30: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
fc40: 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45   the when a VDBE
fc50: 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20   tries to halt. 
fc60: 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20   If the VDBE.** 
fc70: 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73  has made changes
fc80: 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63   and is in autoc
fc90: 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e  ommit mode, then
fca0: 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a   commit those.**
fcb0: 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20   changes.  If a 
fcc0: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64  rollback is need
fcd0: 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20  ed, then do the 
fce0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
fcf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
fd00: 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20  the only way to 
fd10: 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  move the state o
fd20: 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53  f a VM from.** S
fd30: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20  QLITE_MAGIC_RUN 
fd40: 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  to SQLITE_MAGIC_
fd50: 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72  HALT.  It is har
fd60: 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c  mless to.** call
fd70: 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68   this on a VM th
fd80: 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c  at is in the SQL
fd90: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73  ITE_MAGIC_HALT s
fda0: 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tate..**.** Retu
fdb0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
fdc0: 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  .  If the commit
fdd0: 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c   could not compl
fde0: 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a  ete because of.*
fdf0: 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f  * lock contentio
fe00: 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  n, return SQLITE
fe10: 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54  _BUSY.  If SQLIT
fe20: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
fe30: 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ed, it.** means 
fe40: 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f  the close did no
fe50: 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65  t happen and nee
fe60: 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65  ds to be repeate
fe70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fe80: 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a  3VdbeHalt(Vdbe *
fe90: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  p){.  int rc;   
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
feb0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
fec0: 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74   store transient
fed0: 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f   return codes */
fee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fef0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68   p->db;..  /* Th
ff00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
ff10: 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
ff20: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
ff30: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
ff40: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
ff50: 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
ff60: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
ff70: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
ff80: 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
ff90: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
ffa0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
ffb0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
ffc0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
ffd0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
ffe0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
fff0: 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
10000 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
10010 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
10020 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
10030 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
10040 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
10050 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
10060 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
10070 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
10080 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
10090 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
100a0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
100b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
100c0 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
100d0 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
100e0 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
100f0 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
10100 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
10110 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10120 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
10130 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10140 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
10150 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10160 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  if( p->aOnceFlag
10170 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e   ) memset(p->aOn
10180 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f  ceFlag, 0, p->nO
10190 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73  nceFlag);.  clos
101a0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
101b0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
101c0 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
101d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
101e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
101f0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
10200 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
10210 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
10220 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
10230 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
10240 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  arted */.  if( p
10250 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
10260 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
10270 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
10280 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
10290 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
102a0 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
102b0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
102c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
102d0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
102e0 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
102f0 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
10300 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
10310 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
10320 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
10330 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
10340 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
10350 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
10360 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
10370 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
10380 66 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  f;.    assert( p
10390 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ->rc!=SQLITE_IOE
103a0 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f  RR_BLOCKED );  /
103b0 2a 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20  * This error no 
103c0 6c 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f  longer exists */
103d0 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
103e0 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
103f0 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
10400 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
10410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10420 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
10430 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
10440 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
10450 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
10460 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
10470 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
10480 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
10490 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
104a0 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
104b0 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
104c0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
104d0 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
104e0 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
104f0 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
10500 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
10510 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
10520 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
10530 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
10540 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
10550 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
10560 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
10570 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
10580 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
10590 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
105a0 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
105b0 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
105c0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
105d0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
105e0 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
105f0 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
10600 75 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  ured while writi
10610 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
10620 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
10630 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
10640 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
10650 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
10660 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
10670 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
10680 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
10690 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
106a0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
106b0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
106c0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
106d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
106e0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
106f0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
10700 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
10710 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
10720 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
10730 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
10740 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
10750 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
10760 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
10770 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
10780 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
10790 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
107a0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
107b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
107c0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
107d0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
107e0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
107f0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
10800 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
10810 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
10820 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
10830 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
10840 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
10850 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
10860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
10870 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10880 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
10890 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
108a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
108b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
108c0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
108d0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
108e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10900 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
10910 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
10920 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
10930 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
10940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10950 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10960 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
10970 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
10980 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
10990 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
109a0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
109b0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
109c0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
109d0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
109e0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
109f0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
10a00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
10a10 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
10a20 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
10a30 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
10a40 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
10a50 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
10a60 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
10a70 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
10a80 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
10a90 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
10aa0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
10ab0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
10ac0 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d  b->writeVdbeCnt=
10ad0 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  =(p->readOnly==0
10ae0 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
10af0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
10b00 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f  E_OK || (p->erro
10b10 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
10b20 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72   && !isSpecialEr
10b30 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ror) ){.        
10b40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10b50 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20  CheckFk(p, 1);. 
10b60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
10b70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10b80 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28        if( NEVER(
10b90 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a  p->readOnly) ){.
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
10bb0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
10bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
10bd0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10be0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
10bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10c00 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
10c10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
10c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10c30 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
10c40 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
10c50 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
10c60 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
10c70 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
10c80 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
10c90 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
10ca0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
10cb0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
10cc0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
10cd0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
10ce0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
10cf0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
10d00 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
10d10 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
10d20 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
10d30 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
10d40 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
10d50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
10d60 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
10d70 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
10d80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10d90 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
10da0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
10db0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
10dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
10dd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10de0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
10df0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
10e00 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
10e10 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
10e20 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10e30 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
10e40 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
10e50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
10e60 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
10e70 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
10e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
10e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
10ea0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
10eb0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
10ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
10ed0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
10ee0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
10ef0 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
10f00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
10f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
10f20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
10f30 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
10f40 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
10f50 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
10f60 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
10f70 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
10f80 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
10f90 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
10fa0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
10fb0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
10fc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10fd0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
10fe0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
10ff0 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
11000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11010 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
11020 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
11030 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
11040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11050 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
11060 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
11070 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
11080 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
11090 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
110a0 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
110b0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
110c0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
110d0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
110e0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
110f0 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
11100 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
11110 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
11120 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
11130 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
11140 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
11150 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
11160 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
11170 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
11180 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
11190 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
111a0 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
111b0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
111c0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
111d0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
111e0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
111f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
11200 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
11210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
11220 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
11230 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20  ONSTRAINT ){.   
11240 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
11250 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
11260 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
11270 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
11280 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
11290 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
112a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
112b0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
112c0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
112d0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
112e0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
112f0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
11300 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
11310 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
11320 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
11330 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
11340 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
11350 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
11360 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
11370 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
11380 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
11390 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
113a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
113b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
113c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
113d0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
113e0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
113f0 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
11400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
11410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11420 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
11430 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
11440 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11450 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
11460 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
11470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11480 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
11490 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
114a0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
114b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
114c0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
114d0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
114e0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
114f0 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
11500 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
11510 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
11520 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
11530 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
11540 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  nt--;.    if( !p
11550 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
11560 20 20 20 20 64 62 2d 3e 77 72 69 74 65 56 64 62      db->writeVdb
11570 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  eCnt--;.    }.  
11580 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63    assert( db->ac
11590 74 69 76 65 56 64 62 65 43 6e 74 3e 3d 64 62 2d  tiveVdbeCnt>=db-
115a0 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b  >writeVdbeCnt );
115b0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
115c0 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
115d0 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
115e0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
115f0 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
11600 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
11610 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
11620 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
11630 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
11640 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
11650 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c  true, then any l
11660 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68  ocks that were h
11670 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e  eld.  ** by conn
11680 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e  ection db have n
11690 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ow been released
116a0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  . Call sqlite3Co
116b0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
116c0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f  () .  ** to invo
116d0 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  ke any required 
116e0 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61  unlock-notify ca
116f0 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20  llbacks..  */.  
11700 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
11710 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
11720 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
11730 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20  ked(db);.  }..  
11740 61 73 73 65 72 74 28 20 64 62 2d 3e 61 63 74 69  assert( db->acti
11750 76 65 56 64 62 65 43 6e 74 3e 30 20 7c 7c 20 64  veVdbeCnt>0 || d
11760 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
11770 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
11780 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
11790 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
117a0 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
117b0 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
117d0 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
117e0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
117f0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
11800 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
11810 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
11820 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
11830 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
11840 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
11850 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11860 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
11870 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
11880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
11890 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
118a0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
118b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
118c0 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
118d0 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
118e0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
118f0 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
11900 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
11910 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
11920 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
11930 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
11940 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
11950 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
11960 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
11970 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
11980 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
11990 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
119a0 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
119b0 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
119c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
119d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
119e0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
119f0 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
11a00 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
11a10 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
11a20 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
11a30 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38 20  rrMsg ){.    u8 
11a40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64  mallocFailed = d
11a50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
11a60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11a70 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11a80 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
11a90 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
11aa0 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
11ab0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
11ac0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
11ad0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
11ae0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11af0 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
11b00 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69  iled = mallocFai
11b10 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72  led;.    db->err
11b20 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c  Code = rc;.  }el
11b30 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
11b40 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
11b50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
11b70 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
11b80 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
11b90 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
11ba0 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
11bb0 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
11bc0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
11bd0 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
11be0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
11bf0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
11c00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11c10 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
11c20 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
11c30 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
11c40 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
11c50 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
11c60 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
11c70 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
11c80 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
11c90 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
11ca0 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
11cb0 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
11cc0 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
11cd0 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
11ce0 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
11cf0 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
11d00 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
11d10 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
11d20 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
11d30 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
11d40 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
11d50 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
11d60 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
11d70 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
11d80 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
11d90 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
11da0 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
11db0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
11dc0 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
11dd0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
11de0 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
11df0 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
11e00 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
11e10 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
11e20 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
11e30 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
11e40 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
11e50 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
11e60 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
11e70 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
11e80 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
11e90 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
11ea0 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
11eb0 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
11ec0 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
11ed0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
11ee0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
11ef0 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
11f00 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11f10 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
11f20 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
11f30 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
11f40 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
11f50 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
11f60 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
11f70 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
11f80 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
11f90 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
11fa0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
11fb0 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
11fc0 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
11fd0 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
11fe0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
11ff0 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
12000 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
12010 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
12020 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
12030 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
12040 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
12050 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
12060 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
12070 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
12080 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
12090 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
120a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
120b0 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
120c0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
120d0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
120e0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
120f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
12100 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
12110 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
12120 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
12130 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
12140 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
12150 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
12160 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
12170 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
12180 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
12190 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
121a0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
121b0 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
121c0 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
121d0 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
121e0 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
121f0 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
12200 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
12210 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
12220 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
12230 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
12240 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
12250 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
12260 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
12270 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
12280 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
12290 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  "\n");.      for
122a0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
122b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
122c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20  rintf(out, "%6d 
122d0 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a  %10lld %8lld ",.
122e0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
122f0 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20  p[i].cnt,.      
12300 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
12310 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20  ycles,.         
12320 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e    p->aOp[i].cnt>
12330 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79  0 ? p->aOp[i].cy
12340 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63  cles/p->aOp[i].c
12350 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29  nt : 0.        )
12360 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12370 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
12380 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
12390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
123a0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
123b0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
123c0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
123d0 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
123e0 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d  turn p->rc & db-
123f0 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a  >errMask;.}. ./*
12400 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64  .** Clean up and
12410 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61   delete a VDBE a
12420 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20  fter execution. 
12430 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   Return an integ
12440 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74  er which is.** t
12450 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20  he result code. 
12460 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
12470 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e   message text in
12480 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f  to *pzErrMsg..*/
12490 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
124a0 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70  Finalize(Vdbe *p
124b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
124c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
124d0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
124e0 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61  GIC_RUN || p->ma
124f0 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
12500 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  HALT ){.    rc =
12510 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
12520 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74  t(p);.    assert
12530 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65  ( (rc & p->db->e
12540 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20  rrMask)==rc );. 
12550 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
12560 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74  Delete(p);.  ret
12570 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12580 20 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75   Call the destru
12590 63 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75  ctor for each au
125a0 78 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70  xdata entry in p
125b0 56 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69  VdbeFunc for whi
125c0 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  ch.** the corres
125d0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d  ponding bit in m
125e0 61 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41  ask is clear.  A
125f0 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62  uxdata entries b
12600 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20  eyond 31.** are 
12610 61 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64  always destroyed
12620 2e 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c  .  To destroy al
12630 6c 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65  l auxdata entrie
12640 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20  s, call this.** 
12650 72 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73  routine with mas
12660 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  k==0..*/.void sq
12670 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
12680 75 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20  uxData(VdbeFunc 
12690 2a 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20  *pVdbeFunc, int 
126a0 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  mask){.  int i;.
126b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64    for(i=0; i<pVd
126c0 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b  beFunc->nAux; i+
126d0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41  +){.    struct A
126e0 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26  uxData *pAux = &
126f0 70 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78  pVdbeFunc->apAux
12700 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e  [i];.    if( (i>
12710 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 28 28  31 || !(mask&(((
12720 75 33 32 29 31 29 3c 3c 69 29 29 29 20 26 26 20  u32)1)<<i))) && 
12730 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
12740 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
12750 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
12760 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
12770 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
12780 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
12790 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
127a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
127b0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
127c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
127d0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
127e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
127f0 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
12800 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
12810 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
12820 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
12830 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
12840 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
12850 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
12860 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
12870 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
12880 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
12890 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
128a0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
128b0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
128c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
128d0 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
128e0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
128f0 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
12900 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
12910 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
12920 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
12930 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
12940 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
12950 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
12960 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
12970 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
12980 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
12990 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
129a0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
129b0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
129c0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
129d0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
129e0 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
129f0 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
12a00 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
12a10 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
12a20 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
12a30 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
12a40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
12a50 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
12a60 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
12a70 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
12a80 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
12a90 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
12aa0 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41  );.  vdbeFreeOpA
12ab0 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c  rray(db, p->aOp,
12ac0 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69   p->nOp);.  sqli
12ad0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12ae0 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69  >aLabel);.  sqli
12af0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12b00 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71  >aColName);.  sq
12b10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12b20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69  p->zSql);.  sqli
12b30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
12b40 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64 65 66  >pFree);.#if def
12b50 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
12b60 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
12b70 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
12b80 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e  (db, p->zExplain
12b90 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
12ba0 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61  ee(db, p->pExpla
12bb0 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  in);.#endif.}../
12bc0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
12bd0 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
12be0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
12bf0 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
12c00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
12c10 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
12c20 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
12c30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
12c40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12c50 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
12c60 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
12c70 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62  beClearObject(db
12c80 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  , p);.  if( p->p
12c90 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Prev ){.    p->p
12ca0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
12cb0 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b  >pNext;.  }else{
12cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
12cd0 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
12ce0 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e   db->pVdbe = p->
12cf0 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  pNext;.  }.  if(
12d00 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
12d10 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
12d20 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d   = p->pPrev;.  }
12d30 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
12d40 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
12d50 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71   p->db = 0;.  sq
12d60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
12d70 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  p);.}../*.** Mak
12d80 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
12d90 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
12da0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
12db0 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
12dc0 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
12dd0 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
12de0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
12df0 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
12e00 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
12e10 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
12e20 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
12e30 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
12e40 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
12e50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
12e60 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
12e70 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
12e80 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
12e90 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
12ea0 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
12eb0 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
12ec0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
12ed0 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
12ee0 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
12ef0 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
12f00 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
12f10 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
12f20 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
12f30 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
12f40 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
12f50 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
12f60 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
12f70 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
12f80 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
12f90 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
12fa0 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
12fb0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
12fc0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
12fd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12fe0 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
12ff0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
13000 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
13010 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
13020 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
13030 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
13040 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
13050 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
13060 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
13070 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
13080 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
13090 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
130a0 61 63 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  acked(p->pCursor
130b0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
130c0 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
130d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
130e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c  urn rc;.    p->l
130f0 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f  astRowid = p->mo
13100 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 20 20  vetoTarget;.    
13110 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
13120 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
13130 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e  PT_BKPT;.    p->
13140 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 31  rowidIsValid = 1
13150 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13160 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
13170 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
13180 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
13190 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
131a0 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
131b0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
131c0 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ALE;.  }else if(
131d0 20 41 4c 57 41 59 53 28 70 2d 3e 70 43 75 72 73   ALWAYS(p->pCurs
131e0 6f 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 68  or) ){.    int h
131f0 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74  asMoved;.    int
13200 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
13210 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
13220 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61  (p->pCursor, &ha
13230 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28  sMoved);.    if(
13240 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13250 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65  .    if( hasMove
13260 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61  d ){.      p->ca
13270 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
13280 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 70  E_STALE;.      p
13290 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
132a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
132b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
132c0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
132d0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
132e0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
132f0 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
13300 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
13310 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
13320 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c  lite3VdbeSerialL
13330 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
13340 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a  dbeSerialPut().*
13350 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
13360 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65  ialGet().**.** e
13370 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
13380 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
13390 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
133a0 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
133b0 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
133c0 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
133d0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
133e0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
133f0 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
13400 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
13410 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
13420 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
13430 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
13440 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
13450 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
13460 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
13470 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
13480 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
13490 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
134a0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
134b0 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
134c0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
134d0 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
134e0 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
134f0 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
13500 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
13510 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
13520 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
13530 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
13540 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
13550 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
13560 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
13570 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
13580 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
13590 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c  a blob seperatel
135a0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
135b0 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
135c0 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
135d0 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
135e0 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
135f0 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
13600 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
13610 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
13620 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
13630 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
13640 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
13660 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
13670 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
13680 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
13690 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
136a0 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
136b0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
136c0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
136f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
13700 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
13720 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
13730 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
13740 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
13750 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
13760 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
13770 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13790 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
137a0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
137b0 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
137c0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
137d0 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
137e0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
13810 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
13820 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
13830 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
13840 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
13850 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
13860 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
13870 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
13880 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
13890 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
138a0 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
138d0 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
138e0 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
138f0 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
13900 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
13910 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
13920 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
13930 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
13940 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
13950 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
13960 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
13970 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
13980 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
13990 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
139a0 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
139b0 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
139c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
139d0 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
139e0 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
139f0 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
13a00 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
13a10 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
13a20 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
13a30 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  at){.  int flags
13a40 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
13a50 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20    int n;..  if( 
13a60 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
13a70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
13a80 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
13a90 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
13aa0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
13ab0 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
13ac0 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
13ad0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
13ae0 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
13af0 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
13b00 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
13b10 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
13b20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
13b30 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66   i<0 ){.      if
13b40 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29  ( i<(-MAX_6BYTE)
13b50 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20   ) return 6;.   
13b60 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
13b70 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75  est prevents:  u
13b80 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36   = -(-9223372036
13b90 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20  854775808) */.  
13ba0 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20      u = -i;.    
13bb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
13bc0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
13bd0 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
13be0 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d    return ((i&1)=
13bf0 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61  =i && file_forma
13c00 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75  t>=4) ? 8+(u32)u
13c10 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   : 1;.    }.    
13c20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
13c30 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
13c40 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
13c50 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
13c60 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
13c70 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
13c80 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
13c90 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
13ca0 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
13cb0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
13cc0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
13cd0 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
13ce0 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
13cf0 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
13d00 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
13d10 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65  ob) );.  n = pMe
13d20 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
13d30 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
13d40 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
13d50 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73  .nZero;.  }.  as
13d60 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20  sert( n>=0 );.  
13d70 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20  return ((n*2) + 
13d80 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d  12 + ((flags&MEM
13d90 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f  _Str)!=0));.}../
13da0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13db0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
13dc0 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
13dd0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
13de0 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
13df0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
13e00 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
13e10 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
13e20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
13e30 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74  e>=12 ){.    ret
13e40 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
13e50 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
13e60 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
13e70 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b  t u8 aSize[] = {
13e80 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20   0, 1, 2, 3, 4, 
13e90 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30  6, 8, 8, 0, 0, 0
13ea0 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72  , 0 };.    retur
13eb0 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74  n aSize[serial_t
13ec0 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ype];.  }.}../*.
13ed0 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
13ee0 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
13ef0 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
13f00 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
13f10 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
13f20 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
13f30 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
13f40 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
13f50 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
13f60 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
13f70 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
13f80 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
13f90 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
13fa0 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
13fb0 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
13fc0 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
13fd0 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
13fe0 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
13ff0 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
14000 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
14010 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
14020 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
14030 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
14040 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
14050 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
14060 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
14070 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
14080 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
14090 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
140a0 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
140b0 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
140c0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
140d0 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
140e0 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
140f0 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
14100 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
14110 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
14120 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
14130 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
14140 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
14150 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
14160 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
14170 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
14180 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
14190 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
141a0 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
141b0 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
141c0 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
141d0 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
141e0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
141f0 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
14200 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
14210 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
14220 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
14230 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
14240 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
14250 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
14260 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
14270 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
14280 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
14290 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
142a0 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
142b0 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
142c0 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
142d0 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
142e0 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
142f0 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
14300 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
14310 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
14320 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
14330 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
14340 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
14350 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
14360 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
14370 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
14380 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
14390 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
143a0 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
143b0 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
143c0 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
143d0 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
143e0 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
143f0 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
14400 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
14410 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
14420 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
14430 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
14440 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
14450 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
14460 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
14470 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
14480 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
14490 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
144a0 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
144b0 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
144c0 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
144d0 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
144e0 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
144f0 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
14500 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
14510 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
14520 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
14530 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
14540 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
14550 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
14560 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
14570 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
14580 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
14590 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
145a0 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
145b0 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
145c0 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
145d0 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
145e0 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
145f0 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
14600 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
14610 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
14620 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
14630 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
14640 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
14650 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
14660 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
14670 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
14680 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
14690 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
146a0 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
146b0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
146c0 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
146d0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
146e0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
146f0 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
14700 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
14710 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
14720 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
14730 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
14740 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
14750 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
14760 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61  [].  nBuf must a
14770 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67  lways be.** larg
14780 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
14790 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
147a0 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74  d.  Except, if t
147b0 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61  he field is.** a
147c0 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72   blob with a zer
147d0 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74  o-filled tail, t
147e0 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20  hen buf[] might 
147f0 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68  be just the righ
14800 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c  t.** size to hol
14810 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63  d everything exc
14820 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f  ept for the zero
14830 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49  -filled tail.  I
14840 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e  f buf[].** is on
14850 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ly big enough to
14860 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65   hold the non-ze
14870 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20  ro prefix, then 
14880 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a  only write that.
14890 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62  ** prefix into b
148a0 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75  uf[].  But if bu
148b0 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  f[] is large eno
148c0 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68  ugh to hold both
148d0 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61   the.** prefix a
148e0 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e  nd the tail then
148f0 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69   write the prefi
14900 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61  x and set the ta
14910 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72  il to all.** zer
14920 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  os..**.** Return
14930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
14940 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
14950 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
14960 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
14970 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
14980 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
14990 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
149a0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
149b0 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
149c0 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
149d0 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
149e0 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
149f0 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
14a00 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d  buf, int nBuf, M
14a10 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
14a20 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33  le_format){.  u3
14a30 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20  2 serial_type = 
14a40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
14a50 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65  lType(pMem, file
14a60 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 32 20  _format);.  u32 
14a70 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
14a80 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
14a90 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
14aa0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
14ab0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
14ac0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
14ad0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
14ae0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
14af0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
14b00 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29  =sizeof(pMem->r)
14b10 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
14b20 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73  (&v, &pMem->r, s
14b30 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20  izeof(v));.     
14b40 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
14b50 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65  Float(v);.    }e
14b60 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70  lse{.      v = p
14b70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a  Mem->u.i;.    }.
14b80 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71      len = i = sq
14b90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
14ba0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
14bb0 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pe);.    assert(
14bc0 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 66 20   len<=(u32)nBuf 
14bd0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
14be0 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
14bf0 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
14c00 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
14c10 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
14c20 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
14c30 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
14c40 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
14c50 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
14c60 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
14c70 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
14c80 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
14c90 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
14ca0 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
14cb0 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
14cc0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
14cd0 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
14ce0 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
14cf0 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
14d00 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
14d10 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
14d20 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
14d30 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
14d40 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
14d50 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
14d60 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 61 73  .nZero;.      as
14d70 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 29 3b  sert( nBuf>=0 );
14d80 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 20 3e  .      if( len >
14d90 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a 20 20   (u32)nBuf ){.  
14da0 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 33 32        len = (u32
14db0 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20  )nBuf;.      }. 
14dc0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66       memset(&buf
14dd0 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65  [pMem->n], 0, le
14de0 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20  n-pMem->n);.    
14df0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  }.    return len
14e00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
14e10 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
14e20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
14e30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73   0;.}../*.** Des
14e40 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
14e50 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
14e60 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
14e70 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
14e80 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
14e90 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
14ea0 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
14eb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
14ec0 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 20 73   read..*/ .u32 s
14ed0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
14ee0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
14ef0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
14f00 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
14f10 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
14f20 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
14f30 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
14f40 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
14f50 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
14f60 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
14f70 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
14f80 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
14f90 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
14fa0 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
14fb0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
14fc0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
14fd0 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
14fe0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
14ff0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
15000 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
15010 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
15020 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
15030 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20    /* NULL */.   
15040 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
15050 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
15060 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15070 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
15080 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
15090 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
150a0 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65  em->u.i = (signe
150b0 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20  d char)buf[0];. 
150c0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
150d0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
150e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
150f0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
15100 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
15110 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15120 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
15130 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
15140 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
15150 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
15160 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
15170 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
15180 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33      }.    case 3
15190 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69  : { /* 3-byte si
151a0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
151b0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
151c0 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
151d0 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20  )buf[0])<<16) | 
151e0 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75  (buf[1]<<8) | bu
151f0 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[2];.      pMem
15200 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
15210 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
15220 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  3;.    }.    cas
15230 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
15240 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
15250 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
15260 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34  .i = (buf[0]<<24
15270 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29  ) | (buf[1]<<16)
15280 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c   | (buf[2]<<8) |
15290 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70   buf[3];.      p
152a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
152b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
152c0 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
152d0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
152e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
152f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20  er */.      u64 
15300 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  x = (((signed ch
15310 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
15320 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75   buf[1];.      u
15330 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c  32 y = (buf[2]<<
15340 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31  24) | (buf[3]<<1
15350 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29  6) | (buf[4]<<8)
15360 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20   | buf[5];.     
15370 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79   x = (x<<32) | y
15380 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  ;.      pMem->u.
15390 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  i = *(i64*)&x;. 
153a0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
153b0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
153c0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
153d0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
153e0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
153f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
15400 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
15410 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
15420 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b   */.      u64 x;
15430 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69  .      u32 y;.#i
15440 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
15450 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
15460 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
15470 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20  ING_POINT).     
15480 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
15490 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
154a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
154b0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
154c0 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72        ** byte or
154d0 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
154e0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
154f0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
15500 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  T is.      ** de
15510 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69  fined that 64-bi
15520 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  t floating point
15530 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61   values really a
15540 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a  re mixed.      *
15550 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20  * endian..      
15560 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
15570 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
15580 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
15590 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74  <<32;.      stat
155a0 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20  ic const double 
155b0 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20  r1 = 1.0;.      
155c0 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20  u64 t2 = t1;.   
155d0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
155e0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
155f0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
15600 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
15610 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
15620 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
15630 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  )==0 );.#endif..
15640 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30        x = (buf[0
15650 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d  ]<<24) | (buf[1]
15660 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c  <<16) | (buf[2]<
15670 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20  <8) | buf[3];.  
15680 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c      y = (buf[4]<
15690 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c  <24) | (buf[5]<<
156a0 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38  16) | (buf[6]<<8
156b0 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20  ) | buf[7];.    
156c0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
156d0 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  y;.      if( ser
156e0 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
156f0 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69         pMem->u.i
15700 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
15710 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15720 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
15730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15740 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
15750 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
15760 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a  (pMem->r)==8 );.
15770 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 78 65          swapMixe
15780 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
15790 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
157a0 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69  &pMem->r, &x, si
157b0 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20  zeof(x));.      
157c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
157d0 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65  sqlite3IsNaN(pMe
157e0 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  m->r) ? MEM_Null
157f0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20   : MEM_Real;.   
15800 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
15810 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 8;.    }.    c
15820 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
15830 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
15840 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
15850 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70  ger 1 */.      p
15860 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
15870 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
15880 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
15890 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
158a0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
158b0 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
158c0 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 72    u32 len = (ser
158d0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
158e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
158f0 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20  (char *)buf;.   
15900 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e     pMem->n = len
15910 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44  ;.      pMem->xD
15920 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  el = 0;.      if
15930 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78  ( serial_type&0x
15940 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  01 ){.        pM
15950 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
15960 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b  Str | MEM_Ephem;
15970 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15980 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
15990 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d  s = MEM_Blob | M
159a0 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
159b0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
159c0 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
159d0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
159e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
159f0 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  is used to alloc
15a00 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ate sufficient s
15a10 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61  pace for an Unpa
15a20 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74  ckedRecord.** st
15a30 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e  ructure large en
15a40 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20  ough to be used 
15a50 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65  with sqlite3Vdbe
15a60 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69  RecordUnpack() i
15a70 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61  f.** the first a
15a80 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
15a90 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20  nter to KeyInfo 
15aa0 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e  structure pKeyIn
15ab0 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70  fo..**.** The sp
15ac0 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c  ace is either al
15ad0 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71  located using sq
15ae0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
15af0 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69  () or from withi
15b00 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e  n.** the unalign
15b10 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64  ed buffer passed
15b20 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20   via the second 
15b30 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65  and third argume
15b40 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a  nts (presumably.
15b50 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e  ** stack space).
15b60 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20   If the former, 
15b70 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20  then *ppFree is 
15b80 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  set to a pointer
15b90 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
15ba0 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
15bb0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
15bc0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  r using sqlite3D
15bd0 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20  bFree(). Or, if 
15be0 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  the .** allocati
15bf0 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68  on comes from th
15c00 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65  e pSpace/szSpace
15c10 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65   buffer, *ppFree
15c20 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
15c30 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
15c40 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
15c50 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72   OOM error occur
15c60 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
15c70 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64  ned..*/.Unpacked
15c80 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
15c90 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
15ca0 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66  Record(.  KeyInf
15cb0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
15cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73            /* Des
15cd0 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
15ce0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72  record */.  char
15cf0 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20   *pSpace,       
15d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
15d10 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61  naligned space a
15d20 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  vailable */.  in
15d30 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20  t szSpace,      
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15d50 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b   Size of pSpace[
15d60 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
15d70 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20  char **ppFree   
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73  /* OUT: Caller s
15da0 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20  hould free this 
15db0 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  pointer */.){.  
15dc0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
15dd0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
15de0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f  /* Unpacked reco
15df0 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  rd to return */.
15e00 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20    int nOff;     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70    /* Increment p
15e30 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f  Space by nOff to
15e40 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69   align it */.  i
15e50 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
15e80 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a  s required for *
15e90 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61  p */..  /* We wa
15ea0 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20  nt to shift the 
15eb0 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75  pointer pSpace u
15ec0 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69  p such that it i
15ed0 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 8-byte aligned
15ee0 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20  ..  ** Thus, we 
15ef0 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74  need to calculat
15f00 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c  e a value, nOff,
15f10 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37   between 0 and 7
15f20 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a  , to shift .  **
15f30 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61   it by.  If pSpa
15f40 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d  ce is already 8-
15f50 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f  byte aligned, nO
15f60 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72  ff should be zer
15f70 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d  o..  */.  nOff =
15f80 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54   (8 - (SQLITE_PT
15f90 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29  R_TO_INT(pSpace)
15fa0 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42   & 7)) & 7;.  nB
15fb0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a  yte = ROUND8(siz
15fc0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
15fd0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65  rd)) + sizeof(Me
15fe0 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  m)*(pKeyInfo->nF
15ff0 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e  ield+1);.  if( n
16000 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66  Byte>szSpace+nOf
16010 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  f ){.    p = (Un
16020 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73  packedRecord *)s
16030 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
16040 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
16050 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46  nByte);.    *ppF
16060 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b  ree = (char *)p;
16070 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65  .    if( !p ) re
16080 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
16090 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b  .    p = (Unpack
160a0 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63  edRecord*)&pSpac
160b0 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70  e[nOff];.    *pp
160c0 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Free = 0;.  }.. 
160d0 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a   p->aMem = (Mem*
160e0 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55  )&((char*)p)[ROU
160f0 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
16100 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20  kedRecord))];.  
16110 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
16120 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
16130 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  );.  p->pKeyInfo
16140 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70   = pKeyInfo;.  p
16150 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49  ->nField = pKeyI
16160 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b  nfo->nField + 1;
16170 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
16180 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
16190 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69  nKey-byte encodi
161a0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69  ng of a record i
161b0 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61  n pKey[], popula
161c0 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63  te the .** Unpac
161d0 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
161e0 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
161f0 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
16200 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a  ment with the.**
16210 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16220 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e   decoded record.
16230 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65  .*/ .void sqlite
16240 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
16250 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
16260 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
16270 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
16280 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
16290 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
162a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
162b0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
162c0 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
162d0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
162e0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
162f0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
16300 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
16310 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75   *p      /* Popu
16320 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74  late this struct
16330 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ure before retur
16340 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ning. */.){.  co
16350 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16360 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
16370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
16380 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20  )pKey;.  int d; 
16390 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20  .  u32 idx;     
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
163c0 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66  aKey[] to read f
163d0 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20  rom */.  u16 u; 
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
16400 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
16410 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
16420 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
16430 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 66  p->aMem;..  p->f
16440 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73 65  lags = 0;.  asse
16450 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
16460 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
16470 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
16480 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
16490 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
164a0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
164b0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
164c0 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64  u<p->nField && d
164d0 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33  <=nKey ){.    u3
164e0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
164f0 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
16500 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78  rint32(&aKey[idx
16510 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
16520 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
16530 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
16540 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
16550 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
16560 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20   /* pMem->flags 
16570 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56  = 0; // sqlite3V
16580 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77  dbeSerialGet() w
16590 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72  ill set this for
165a0 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   us */.    pMem-
165b0 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  >zMalloc = 0;.  
165c0 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64    d += sqlite3Vd
165d0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
165e0 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  y[d], serial_typ
165f0 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d  e, pMem);.    pM
16600 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b 0a 20  em++;.    u++;. 
16610 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
16620 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
16630 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
16640 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 2f 2a 0a 2a  eld = u;.}../*.*
16650 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16660 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
16670 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
16680 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
16690 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
166a0 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
166b0 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
166c0 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
166d0 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
166e0 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
166f0 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
16700 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
16710 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
16720 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
16730 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
16740 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
16750 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
16760 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
16770 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
16780 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
16790 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
167a0 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
167b0 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
167c0 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
167d0 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
167e0 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
167f0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
16800 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
16810 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
16820 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
16830 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
16840 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
16850 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
16860 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
16870 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
16880 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
16890 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
168a0 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
168b0 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
168c0 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
168d0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
168e0 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
168f0 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
16900 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
16910 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
16920 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
16930 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
16940 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
16950 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
16960 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
16970 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
16980 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
16990 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
169a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
169b0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
169c0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
169d0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
169e0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
169f0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
16a00 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
16a10 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64  ey */.){.  int d
16a20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
16a30 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
16a40 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
16a50 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
16a60 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
16a70 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
16a80 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
16a90 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
16aa0 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
16ab0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16ac0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
16ad0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
16ae0 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
16af0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
16b00 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
16b10 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
16b20 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
16b30 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
16b40 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
16b50 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
16b60 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
16b70 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d  2->pKeyInfo;.  m
16b80 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
16b90 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
16ba0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
16bb0 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
16bc0 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
16bd0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
16be0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
16bf0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
16c00 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d  VA_ONLY( mem1.zM
16c10 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
16c20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
16c30 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
16c40 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
16c50 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
16c60 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
16c70 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
16c80 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
16c90 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
16ca0 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
16cb0 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
16cc0 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
16cd0 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
16ce0 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
16cf0 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
16d00 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
16d10 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
16d20 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
16d30 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
16d40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
16d50 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
16d60 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
16d70 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
16d80 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
16d90 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
16da0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
16db0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
16dc0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
16dd0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
16de0 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
16df0 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
16e00 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
16e10 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
16e20 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
16e30 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
16e40 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
16e50 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
16e60 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
16e70 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
16e80 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e  d1 = szHdr1;.  n
16e90 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
16ea0 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 61 73 73 65  ->nField;.  asse
16eb0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
16ec0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
16ed0 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
16ee0 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
16ef0 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
16f00 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
16f10 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
16f20 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
16f30 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
16f40 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
16f50 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
16f60 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
16f70 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
16f80 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
16f90 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
16fa0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16fb0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
16fc0 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
16fd0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
16fe0 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
16ff0 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
17000 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
17010 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17020 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
17030 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
17040 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
17050 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
17060 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
17070 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
17080 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
17090 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
170c0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
170d0 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
170e0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
170f0 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
17100 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
17110 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
17120 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 76 65  /..      /* Inve
17130 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 69 66  rt the result if
17140 20 77 65 20 61 72 65 20 75 73 69 6e 67 20 44 45   we are using DE
17150 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
17160 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 46  /.      if( i<nF
17170 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e 66 6f  ield && pKeyInfo
17180 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
17190 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
171a0 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -rc;.      }.   
171b0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68   .      /* If th
171c0 65 20 50 52 45 46 49 58 5f 53 45 41 52 43 48 20  e PREFIX_SEARCH 
171d0 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
171e0 61 6c 6c 20 66 69 65 6c 64 73 20 65 78 63 65 70  all fields excep
171f0 74 20 74 68 65 20 66 69 6e 61 6c 0a 20 20 20 20  t the final.    
17200 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65 6c 64    ** rowid field
17210 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74 68 65   were equal, the
17220 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52 45 46  n clear the PREF
17230 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 61  IX_SEARCH flag a
17240 6e 64 20 73 65 74 20 0a 20 20 20 20 20 20 2a 2a  nd set .      **
17250 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74   pPKey2->rowid t
17260 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
17270 68 65 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69  he rowid field i
17280 6e 20 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29  n (pKey1, nKey1)
17290 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  ..      ** This 
172a0 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4f  is used by the O
172b0 50 5f 49 73 55 6e 69 71 75 65 20 6f 70 63 6f 64  P_IsUnique opcod
172c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
172d0 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d 3e 66    if( (pPKey2->f
172e0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
172f0 50 52 45 46 49 58 5f 53 45 41 52 43 48 29 20 26  PREFIX_SEARCH) &
17300 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e 6e 46  & i==(pPKey2->nF
17310 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20 20 20  ield-1) ){.     
17320 20 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3d     assert( idx1=
17330 3d 73 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b  =szHdr1 && rc );
17340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17350 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20 4d 45   mem1.flags & ME
17360 4d 5f 49 6e 74 20 29 3b 0a 20 20 20 20 20 20 20  M_Int );.       
17370 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26   pPKey2->flags &
17380 3d 20 7e 55 4e 50 41 43 4b 45 44 5f 50 52 45 46  = ~UNPACKED_PREF
17390 49 58 5f 53 45 41 52 43 48 3b 0a 20 20 20 20 20  IX_SEARCH;.     
173a0 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77 69 64     pPKey2->rowid
173b0 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20   = mem1.u.i;.   
173c0 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 20 20     }.    .      
173d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
173e0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
173f0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
17400 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
17410 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
17420 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
17430 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
17440 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
17450 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
17460 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
17470 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
17480 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
17490 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
174a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
174b0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
174c0 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c  sert( mem1.zMall
174d0 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72  oc==0 );..  /* r
174e0 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20  c==0 here means 
174f0 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  that one of the 
17500 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
17510 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
17520 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
17530 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
17540 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
17550 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
17560 4b 45 59 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  KEY.  ** flag is
17570 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
17580 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
17590 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
175a0 67 65 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ger..  ** If the
175b0 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f   UPACKED_PREFIX_
175c0 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73 65  MATCH flag is se
175d0 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69 74  t, then keys wit
175e0 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  h common prefixe
175f0 73 0a 20 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69  s.  ** are consi
17600 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
17610 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  l.  Otherwise, t
17620 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73  he longer key is
17630 20 74 68 65 20 0a 20 20 2a 2a 20 6c 61 72 67 65   the .  ** large
17640 72 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e  r.  As it happen
17650 73 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69  s, the pPKey2 wi
17660 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ll always be the
17670 20 6c 6f 6e 67 65 72 0a 20 20 2a 2a 20 69 66 20   longer.  ** if 
17680 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65  there is a diffe
17690 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  rence..  */.  as
176a0 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20  sert( rc==0 );. 
176b0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
176c0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
176d0 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 72 63 20  CRKEY ){.    rc 
176e0 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  = -1;.  }else if
176f0 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20  ( pPKey2->flags 
17700 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49  & UNPACKED_PREFI
17710 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20 2f  X_MATCH ){.    /
17720 2a 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f  * Leave rc==0 */
17730 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78  .  }else if( idx
17740 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
17750 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  rc = 1;.  }.  re
17760 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a  turn rc;.}. ../*
17770 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
17780 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
17790 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
177a0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
177b0 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
177c0 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
177d0 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
177e0 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
177f0 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
17800 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
17810 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
17820 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
17830 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
17840 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
17850 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
17860 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
17870 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
17880 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
17890 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
178a0 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
178b0 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
178c0 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
178d0 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
178e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
178f0 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
17900 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
17910 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
17920 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
17930 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
17940 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
17950 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
17960 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
17970 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
17980 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
17990 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
179a0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
179b0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
179c0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
179d0 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e   Mem m, v;..  UN
179e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
179f0 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
17a00 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
17a10 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
17a20 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
17a30 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
17a40 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
17a50 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
17a60 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
17a70 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
17a80 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
17a90 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
17aa0 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
17ab0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
17ac0 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
17ad0 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
17ae0 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
17af0 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
17b00 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
17b10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
17b20 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
17b30 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
17b40 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
17b50 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
17b60 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
17b70 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
17b80 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
17b90 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
17ba0 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
17bb0 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
17bc0 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
17bd0 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
17be0 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
17bf0 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
17c00 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
17c10 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
17c20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
17c30 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20  */.  memset(&m, 
17c40 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
17c50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
17c60 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
17c70 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c  ur, 0, (int)nCel
17c80 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
17c90 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
17ca0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
17cb0 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74  /* The index ent
17cc0 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69  ry must begin wi
17cd0 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65  th a header size
17ce0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
17cf0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a  arint32((u8*)m.z
17d00 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74  , szHdr);.  test
17d10 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29  case( szHdr==3 )
17d20 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
17d30 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66  Hdr==m.n );.  if
17d40 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72  ( unlikely(szHdr
17d50 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72  <3 || (int)szHdr
17d60 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74  >m.n) ){.    got
17d70 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
17d80 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
17d90 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64  * The last field
17da0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68   of the index sh
17db0 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67  ould be an integ
17dc0 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a  er - the ROWID..
17dd0 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74    ** Verify that
17de0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
17df0 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74  really is an int
17e00 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  eger. */.  (void
17e10 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
17e20 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
17e30 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74   typeRowid);.  t
17e40 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
17e50 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63  id==1 );.  testc
17e60 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17e70 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  2 );.  testcase(
17e80 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b   typeRowid==3 );
17e90 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
17ea0 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74  eRowid==4 );.  t
17eb0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
17ec0 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63  id==5 );.  testc
17ed0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
17ee0 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
17ef0 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b   typeRowid==8 );
17f00 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
17f10 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69  eRowid==9 );.  i
17f20 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65  f( unlikely(type
17f30 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52  Rowid<1 || typeR
17f40 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f  owid>9 || typeRo
17f50 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67  wid==7) ){.    g
17f60 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
17f70 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  rruption;.  }.  
17f80 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  lenRowid = sqlit
17f90 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17fa0 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a  Len(typeRowid);.
17fb0 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32    testcase( (u32
17fc0 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52  )m.n==szHdr+lenR
17fd0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e  owid );.  if( un
17fe0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c  likely((u32)m.n<
17ff0 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20  szHdr+lenRowid) 
18000 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
18010 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
18020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63  ;.  }..  /* Fetc
18030 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66  h the integer of
18040 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
18050 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
18060 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
18070 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
18080 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
18090 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
180a0 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
180b0 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
180c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
180d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
180e0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
180f0 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ere if database 
18100 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
18110 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68  tected after m h
18120 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c  as been.  ** all
18130 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68  ocated.  Free th
18140 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  e m object and r
18150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
18160 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77  RUPT. */.idx_row
18170 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20  id_corruption:. 
18180 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61   testcase( m.zMa
18190 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c  lloc!=0 );.  sql
181a0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
181b0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
181c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
181d0 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  BKPT;.}../*.** C
181e0 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f  ompare the key o
181f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
18200 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
18210 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
18220 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b  against.** the k
18230 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e  ey string in pUn
18240 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69  packed.  Write i
18250 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
18260 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
18270 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
18280 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
18290 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
182a0 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
182b0 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61  eater than pUnpa
182c0 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51  cked.  Return SQ
182d0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
182e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ss..**.** pUnpac
182f0 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72  ked is either cr
18300 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
18310 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
18320 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
18330 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
18340 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
18350 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
18360 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
18370 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
18380 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
18390 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
183a0 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
183b0 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
183c0 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
183d0 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
183e0 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
183f0 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f  e entire key..*/
18400 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
18410 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
18420 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18440 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
18450 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
18460 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
18470 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f  d *pUnpacked,  /
18480 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
18490 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f 6d  on of key to com
184a0 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
184b0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
184d0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
184e0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
184f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
18500 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
18510 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
18520 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
18530 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
18540 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
18550 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
18560 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
18570 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
18580 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
18590 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
185a0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
185b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
185c0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
185d0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
185e0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
185f0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
18600 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
18610 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
18620 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
18630 65 20 6f 66 20 74 68 65 20 73 61 79 0a 20 20 2a  e of the say.  *
18640 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
18650 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
18660 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
18670 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
18680 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
18690 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
186a0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
186b0 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
186c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
186d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
186e0 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d  .  }.  memset(&m
186f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
18700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
18710 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
18720 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
18730 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
18740 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
18750 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
18760 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18770 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61 67 73  pUnpacked->flags
18780 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46   & UNPACKED_PREF
18790 49 58 5f 4d 41 54 43 48 20 29 3b 0a 20 20 2a 72  IX_MATCH );.  *r
187a0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
187b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
187c0 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
187d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
187e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
187f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
18810 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
18820 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
18830 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
18840 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
18850 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
18860 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
18870 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
18880 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
18890 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
188a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
188b0 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
188c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
188d0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
188e0 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
188f0 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
18900 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
18910 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
18920 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
18930 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
18940 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
18950 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
18960 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
18970 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
18980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
18990 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
189a0 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
189b0 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
189c0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
189d0 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
189e0 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
189f0 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
18a00 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
18a10 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
18a20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
18a30 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
18a40 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
18a50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
18a60 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
18a70 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
18a80 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
18a90 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
18aa0 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
18ab0 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
18ac0 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
18ad0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
18ae0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
18af0 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
18b00 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
18b10 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
18b20 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
18b30 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
18b40 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
18b50 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
18b60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18b70 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
18b80 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
18b90 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
18ba0 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
18bb0 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
18bc0 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
18bd0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
18be0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18bf0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
18c00 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
18c10 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
18c20 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
18c30 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
18c40 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
18c50 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
18c60 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
18c70 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
18c80 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
18c90 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
18ca0 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
18cb0 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
18cc0 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
18cd0 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
18ce0 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
18cf0 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
18d00 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
18d10 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
18d20 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
18d30 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
18d40 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
18d50 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
18d60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
18d70 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
18d80 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
18d90 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
18da0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
18db0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
18dc0 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
18dd0 74 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  tValue(Vdbe *v, 
18de0 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
18df0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
18e00 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
18e10 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
18e20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
18e30 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
18e40 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
18e50 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
18e60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
18e70 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
18e80 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
18e90 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
18ea0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18eb0 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
18ec0 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
18ed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
18ee0 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
18ef0 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
18f00 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
18f10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
18f20 6d 53 74 6f 72 65 54 79 70 65 28 28 4d 65 6d 20  mStoreType((Mem 
18f30 2a 29 70 52 65 74 29 3b 0a 20 20 20 20 20 20 7d  *)pRet);.      }
18f40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
18f50 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
18f60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
18f70 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
18f80 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
18f90 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
18fa0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
18fb0 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
18fc0 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
18fd0 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
18fe0 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
18ff0 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
19000 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
19010 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
19020 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
19030 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
19040 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
19050 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
19060 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
19070 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
19080 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
19090 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
190a0 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
190b0 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
190c0 20 7d 0a 7d 0a                                    }.}.