/ Hex Artifact Content
Login

Artifact c071014d81c1d4b2c381247c16a3e86182951e51:


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 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0350: 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63  to 1 and all opc
0360: 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69  odes will be pri
0370: 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20  nted.** as they 
0380: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
0390: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72   instruction str
03a0: 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  eam..*/.#ifdef S
03b0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
03c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
03d0: 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
03e0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
03f0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0400: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0410: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0420: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0430: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0440: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0450: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0460: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
0470: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
0480: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0490: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
04a0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
04b0: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
04c0: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
04d0: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
04e0: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
04f0: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0500: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0510: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0520: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0530: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
0540: 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20   SQL string for 
0550: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0560: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
0570: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
0580: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
0590: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
05a0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
05b0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
05c0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
05d0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
05e0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
05f0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
0600: 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20   Return the SQL 
0610: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0620: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0630: 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ment.*/.const ch
0640: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28  ar *sqlite3_sql(
0650: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0660: 74 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  tmt){.  return (
0670: 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e  (Vdbe *)pStmt)->
0680: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  zSql;.}../*.** S
0690: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
06a0: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
06b0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
06c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
06d0: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
06e0: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
06f0: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
0700: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74  har *zTmp;.  int
0710: 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a   nTmp;.  tmp = *
0720: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
0730: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
0740: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0750: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0760: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
0770: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
0780: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
0790: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
07a0: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
07b0: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
07c0: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
07d0: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
07e0: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
07f0: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e  zSql = zTmp;.  n
0800: 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a  Tmp = pA->nSql;.
0810: 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d    pA->nSql = pB-
0820: 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71  >nSql;.  pB->nSq
0830: 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69 66  l = nTmp;.}..#if
0840: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0850: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63  ./*.** Turn trac
0860: 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f  ing on or off.*/
0870: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0880: 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20  eTrace(Vdbe *p, 
0890: 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20  FILE *trace){.  
08a0: 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65  p->trace = trace
08b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
08c0: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62  * Resize the Vdb
08d0: 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74  e.aOp array so t
08e0: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
08f0: 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20 65 6c  at least N.** el
0900: 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ements..**.** If
0910: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
0920: 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  y error occurs w
0930: 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68  hile resizing th
0940: 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64 62 65  e array,.** Vdbe
0950: 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f  .aOp and Vdbe.nO
0960: 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 75 6e  pAlloc remain un
0970: 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73  changed (this is
0980: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e 79 20   so that.** any 
0990: 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20  opcodes already 
09a0: 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65  allocated can be
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
09c0: 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20  ocated.** along 
09d0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
09e0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
09f0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 69 7a  tatic void resiz
0a00: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
0a10: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64 62 65  , int N){.  Vdbe
0a20: 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  Op *pNew;.  int 
0a30: 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e 4f 70  oldSize = p->nOp
0a40: 41 6c 6c 6f 63 3b 0a 20 20 70 4e 65 77 20 3d 20  Alloc;.  pNew = 
0a50: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0a60: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  (p->db, p->aOp, 
0a70: 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  N*sizeof(Op));. 
0a80: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0a90: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e   p->nOpAlloc = N
0aa0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70  ;.    p->aOp = p
0ab0: 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 4e 3e 6f  New;.    if( N>o
0ac0: 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ldSize ){.      
0ad0: 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b 6f  memset(&p->aOp[o
0ae0: 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 4e 2d 6f  ldSize], 0, (N-o
0af0: 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66 28 4f  ldSize)*sizeof(O
0b00: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p));.    }.  }.}
0b10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0b20: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0b30: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0b40: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0b50: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0b60: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0b70: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0b90: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0ba0: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0bb0: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0bc0: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0bd0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0be0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0bf0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0c00: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0c10: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
0c20: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
0c30: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0c40: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0c50: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0c60: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0c70: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0c80: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
0c90: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
0ca0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0cb0: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
0cc0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0cd0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
0ce0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0cf0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
0d00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0d10: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0d20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0d30: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0d40: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0d50: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0d60: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0d70: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
0d80: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
0d90: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
0da0: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
0db0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0dc0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0dd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0de0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0df0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0e00: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0e10: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0e20: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e30: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e40: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
0e50: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
0e60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
0e70: 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69  TUSED;.  p->expi
0e80: 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
0e90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
0ea0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  f( sqlite3VdbeAd
0eb0: 64 6f 70 54 72 61 63 65 20 29 20 73 71 6c 69 74  dopTrace ) sqlit
0ec0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
0ed0: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
0ee0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
0ef0: 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   i;.}.int sqlite
0f00: 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65  3VdbeAddOp0(Vdbe
0f10: 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   *p, int op){.  
0f20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
0f30: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
0f40: 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  0, 0, 0);.}.int 
0f50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0f60: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  1(Vdbe *p, int o
0f70: 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65  p, int p1){.  re
0f80: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
0f90: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
0fa0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
0fb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
0fc0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
0fd0: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
0fe0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
0ff0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1000: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b   op, p1, p2, 0);
1010: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  .}.../*.** Add a
1020: 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e  n opcode that in
1030: 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61  cludes the p4 va
1040: 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72  lue as a pointer
1050: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1060: 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64  VdbeAddOp4(.  Vd
1070: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
1080: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63    /* Add the opc
1090: 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a  ode to this VM *
10a0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
10b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
10c0: 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69  ew opcode */.  i
10d0: 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20  nt p1,          
10e0: 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65     /* The P1 ope
10f0: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32  rand */.  int p2
1100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1110: 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   The P2 operand 
1120: 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20  */.  int p3,    
1130: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1140: 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P3 operand */.  
1150: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
1160: 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70      /* The P4 op
1170: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1180: 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f  4type          /
1190: 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70  * P4 operand typ
11a0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
11b0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
11c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31  AddOp3(p, op, p1
11d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c  , p2, p3);.  sql
11e0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
11f0: 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70  (p, addr, zP4, p
1200: 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  4type);.  return
1210: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
1220: 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1230: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20  bolic label for 
1240: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
1250: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1260: 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65  e.** coded.  The
1270: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
1280: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
1290: 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
12a0: 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  .  The.** label 
12b0: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74  can be used as t
12c0: 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61  he P2 value of a
12d0: 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61  n operation.  La
12e0: 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65  ter, when.** the
12f0: 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76   label is resolv
1300: 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63  ed to a specific
1310: 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44   address, the VD
1320: 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20  BE will scan.** 
1330: 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72  through its oper
1340: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63  ation list and c
1350: 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73  hange all values
1360: 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74   of P2 which mat
1370: 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20  ch.** the label 
1380: 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65  into the resolve
1390: 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a  d address..**.**
13a0: 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20   The VDBE knows 
13b0: 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20  that a P2 value 
13c0: 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75  is a label becau
13d0: 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a  se labels are.**
13e0: 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65   always negative
13f0: 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61   and P2 values a
1400: 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65  re suppose to be
1410: 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a   non-negative..*
1420: 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74  * Hence, a negat
1430: 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20  ive P2 value is 
1440: 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73  a label that has
1450: 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c   yet to be resol
1460: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  ved..**.** Zero 
1470: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
1480: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
1490: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
14a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62  dbeMakeLabel(Vdb
14b0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
14c0: 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b    i = p->nLabel+
14d0: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  +;.  assert( p->
14e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
14f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
1500: 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f  i>=p->nLabelAllo
1510: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62  c ){.    p->nLab
1520: 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61  elAlloc = p->nLa
1530: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b  belAlloc*2 + 10;
1540: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
1550: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1560: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
1570: 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20  ->aLabel,.      
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
15a0: 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a  >nLabelAlloc*siz
15b0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
15c0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
15d0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
15e0: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
15f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1600: 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  1-i;.}../*.** Re
1610: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
1620: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
1630: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
1640: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
1650: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
1660: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
1670: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1680: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1690: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
16a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16b0: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
16c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
16d0: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c  veLabel(Vdbe *p,
16e0: 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a   int x){.  int j
16f0: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
1700: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1710: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1720: 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26    assert( j>=0 &
1730: 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b  & j<p->nLabel );
1740: 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c  .  if( p->aLabel
1750: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
1760: 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  l[j] = p->nOp;. 
1770: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70   }.}../*.** Loop
1780: 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f   through the pro
1790: 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  gram looking for
17a0: 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20   P2 values that 
17b0: 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20  are negative.** 
17c0: 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  on jump instruct
17d0: 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68  ions.  Each such
17e0: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
17f0: 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a  l.  Resolve the.
1800: 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  ** label by sett
1810: 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65  ing the P2 value
1820: 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
1830: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a  non-zero value..
1840: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1850: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63  ne is called onc
1860: 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  e after all opco
1870: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
1880: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61  serted..**.** Va
1890: 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63  riable *pMaxFunc
18a0: 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74  Args is set to t
18b0: 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  he maximum value
18c0: 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d   of any P2 argum
18d0: 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50  ent .** to an OP
18e0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67  _Function, OP_Ag
18f0: 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c  gStep or OP_VFil
1900: 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73  ter opcode. This
1910: 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   is used by .** 
1920: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1930: 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74  eady() to size t
1940: 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20  he Vdbe.apArg[] 
1950: 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  array..**.** Thi
1960: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
1970: 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  oes the followin
1980: 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20  g optimization: 
1990: 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a   It scans for.**
19a0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
19b0: 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20 61  at might cause a
19c0: 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62   statement rollb
19d0: 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72  ack.  Such instr
19e0: 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a  uctions.** are:.
19f0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
1a00: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
1a10: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
1a20: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
1a30: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79     *  OP_Destroy
1a40: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64  .**   *  OP_VUpd
1a50: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  ate.**   *  OP_V
1a60: 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20  Rename.**.** If 
1a70: 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63 74  no such instruct
1a80: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68  ion is found, th
1a90: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1aa0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a  nt instruction .
1ab0: 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ** is changed to
1ac0: 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69   a Noop.  In thi
1ad0: 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20  s way, we avoid 
1ae0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61  creating the sta
1af0: 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e  tement .** journ
1b00: 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73  al file unnecess
1b10: 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  arily..*/.static
1b20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
1b30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
1b40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
1b50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
1b60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a  t nMaxArgs = 0;.
1b70: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74    Op *pOp;.  int
1b80: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c   *aLabel = p->aL
1b90: 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73  abel;.  int does
1ba0: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1bb0: 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  k = 0;.  int has
1bc0: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1bd0: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
1be0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
1bf0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
1c00: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
1c10: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
1c20: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ;..    if( opcod
1c30: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
1c40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1c50: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p5>nMaxArgs ) n
1c60: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1c70: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  5;.    }else if(
1c80: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53   opcode==OP_AggS
1c90: 74 65 70 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  tep .#ifndef SQL
1ca0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1cb0: 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 7c 7c  TABLE.        ||
1cc0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
1cd0: 61 74 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  ate.#endif.    )
1ce0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1cf0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
1d00: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
1d10: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  2;.    }.    if(
1d20: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74   opcode==OP_Halt
1d30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1d40: 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->p1==SQLITE_CO
1d50: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d  NSTRAINT && pOp-
1d60: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  >p2==OE_Abort ){
1d70: 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61  .        doesSta
1d80: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1d90: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1da0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1db0: 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29  ==OP_Statement )
1dc0: 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65  {.      hasState
1dd0: 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20  mentBegin = 1;. 
1de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1df0: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
1e00: 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61  ){.      doesSta
1e10: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d  tementRollback =
1e20: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
1e30: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1e40: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
1e50: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  f( opcode==OP_VU
1e60: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
1e70: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20  =OP_VRename ){. 
1e80: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1e90: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1ea0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1eb0: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
1ec0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
1ed0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1ee0: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
1ef0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1f00: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
1f10: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
1f20: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
1f30: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
1f40: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1f50: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
1f60: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
1f70: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
1f80: 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f  HasProperty(opco
1f90: 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20  de, OPFLG_JUMP) 
1fa0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
1fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
1fc0: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
1fd0: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
1fe0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
1ff0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
2000: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
2010: 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  ee(p->aLabel);. 
2020: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a   p->aLabel = 0;.
2030: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
2040: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20   = nMaxArgs;..  
2050: 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72  /* If we never r
2060: 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
2070: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
2080: 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a   then statement.
2090: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20a0: 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
20b0: 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65  .  So change eve
20c0: 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a  ry OP_Statement.
20d0: 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f    ** opcode into
20e0: 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68   an OP_Noop.  Th
20f0: 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20  is avoid a call 
2100: 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
2110: 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a  Exclusive().  **
2120: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78   which can be ex
2130: 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20  pensive on some 
2140: 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a  platforms..  */.
2150: 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65    if( hasStateme
2160: 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73  ntBegin && !does
2170: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2180: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70  k ){.    for(pOp
2190: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
21a0: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
21b0: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
21c0: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
21d0: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
21e0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
21f0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
2200: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2210: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2220: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2230: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2240: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
2250: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2260: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2270: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2280: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2290: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
22a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
22b0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
22c0: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
22d0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
22e0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
22f0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
2300: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
2310: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
2320: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
2330: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2340: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
2350: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
2360: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
2370: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
2380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
23a0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
23b0: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
23c0: 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  oc ){.    resize
23d0: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
23e0: 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41  pAlloc ? p->nOpA
23f0: 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f 73 69  lloc*2 : 1024/si
2400: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 61  zeof(Op));.    a
2410: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f  ssert( p->nOp+nO
2420: 70 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c  p<=p->nOpAlloc |
2430: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
2440: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69  ailed );.  }.  i
2450: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
2460: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
2470: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
2480: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
2490: 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20  f( nOp>0 ){.    
24a0: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
24b0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
24c0: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
24d0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
24e0: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
24f0: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
2500: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
2510: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
2520: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
2530: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
2540: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
2550: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
2560: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
2570: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
2580: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2590: 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20  y(pOut->opcode, 
25a0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20  OPFLG_JUMP) ){. 
25b0: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
25c0: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
25d0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25e0: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
25f0: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
2600: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
2610: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
2620: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
2630: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
2640: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
2650: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
2660: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
2670: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
2680: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ( sqlite3VdbeAdd
2690: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
26a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
26b0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
26c0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
26d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
26e0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e  f.    }.    p->n
26f0: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20  Op += nOp;.  }. 
2700: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2710: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2720: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2730: 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  1 operand for a 
2740: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2750: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2760: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2770: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
2780: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
2790: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
27a0: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
27b0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
27c0: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
27d0: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
27e0: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
27f0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  he program..*/.v
2800: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2810: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c  hangeP1(Vdbe *p,
2820: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2830: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2840: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2850: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2860: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2870: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2880: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2890: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
28a0: 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20  dr].p1 = val;.  
28b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
28c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
28d0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f  he P2 operand fo
28e0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
28f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2910: 66 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ful for setting 
2920: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
2930: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
2940: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
2950: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2960: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2970: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2980: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2990: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
29a0: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
29b0: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
29c0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
29d0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d  ->aOp[addr].p2 =
29e0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
29f0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2a00: 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70  lue of the P3 op
2a10: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2a20: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a40: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64  3VdbeChangeP3(Vd
2a50: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
2a60: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73   int val){.  ass
2a70: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2a80: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2a90: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2aa0: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20  p && addr>=0 && 
2ab0: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70  p->nOp>addr && p
2ac0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e  ->aOp ){.    p->
2ad0: 61 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76  aOp[addr].p3 = v
2ae0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
2af0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
2b00: 65 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72  e of the P5 oper
2b10: 61 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  and for the most
2b20: 20 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64   recently.** add
2b30: 65 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ed operation..*/
2b40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2b50: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
2b60: 70 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73  p, u8 val){.  as
2b70: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2b80: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2b90: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
2ba0: 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a   p && p->aOp ){.
2bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2bc0: 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61  Op>0 );.    p->a
2bd0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
2be0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
2bf0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50  .** Change the P
2c00: 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73  2 operand of ins
2c10: 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f  truction addr so
2c20: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
2c30: 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73  to.** the addres
2c40: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2c50: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
2c60: 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  coded..*/.void s
2c70: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
2c80: 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  re(Vdbe *p, int 
2c90: 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  addr){.  sqlite3
2ca0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20  VdbeChangeP2(p, 
2cb0: 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d  addr, p->nOp);.}
2cc0: 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  .../*.** If the 
2cd0: 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74  input FuncDef st
2ce0: 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d  ructure is ephem
2cf0: 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20  eral, then free 
2d00: 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46  it.  If.** the F
2d10: 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70  uncDef is not ep
2d20: 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20  hermal, then do 
2d30: 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  nothing..*/.stat
2d40: 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65  ic void freeEphe
2d50: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75  meralFunction(Fu
2d60: 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20  ncDef *pDef){.  
2d70: 69 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65  if( pDef && (pDe
2d80: 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f->flags & SQLIT
2d90: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
2da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2db0: 66 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a  free(pDef);.  }.
2dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2dd0: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
2de0: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
2df0: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 69  ic void freeP4(i
2e00: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
2e10: 2a 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29  *p3){.  if( p3 )
2e20: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  {.    switch( p4
2e30: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
2e40: 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20  se P4_REAL:.    
2e50: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a    case P4_INT64:
2e60: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
2e70: 50 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61  PRINTF:.      ca
2e80: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
2e90: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
2ea0: 49 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65  INFO:.      case
2eb0: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44   P4_KEYINFO_HAND
2ec0: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  OFF: {.        s
2ed0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b  qlite3_free(p3);
2ee0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
2f00: 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20  se P4_VDBEFUNC: 
2f10: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75  {.        VdbeFu
2f20: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20  nc *pVdbeFunc = 
2f30: 28 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a  (VdbeFunc *)p3;.
2f40: 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65          freeEphe
2f50: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70 56  meralFunction(pV
2f60: 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b  dbeFunc->pFunc);
2f70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2f80: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
2f90: 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b  a(pVdbeFunc, 0);
2fa0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fb0: 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63 29  _free(pVdbeFunc)
2fc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2fd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2fe0: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
2ff0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
3000: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
3010: 28 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20  (FuncDef*)p3);. 
3020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3030: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3040: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
3050: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
3060: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
3070: 75 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20  ue*)p3);.       
3080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3090: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
30a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
30b0: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
30c0: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
30d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
30e0: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
30f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3100: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  dr, int N){.  if
3110: 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ( p && p->aOp ){
3120: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
3130: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3140: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d  ;.    while( N--
3150: 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34   ){.      freeP4
3160: 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f  (pOp->p4type, pO
3170: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
3180: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
3190: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
31a0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
31b0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
31c0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
31d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
31e0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
31f0: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3200: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3210: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3220: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3230: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3240: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3250: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3260: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3270: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
3280: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
3290: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
32a0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
32b0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
32c0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
32d0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
32e0: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
32f0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
3300: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
3310: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
3320: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3330: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3340: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
3350: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
3360: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
3370: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
3380: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
3390: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
33a0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
33b0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
33c0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
33d0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
33e0: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
33f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
3400: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3410: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
3420: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
3430: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
3440: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3450: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
3460: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
3470: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
3480: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
3490: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
34a0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
34b0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
34c0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
34d0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
34e0: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
34f0: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
3500: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
3510: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3520: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
3530: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
3540: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
3550: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
3560: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3570: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
3580: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
3590: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
35a0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
35b0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
35c0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
35d0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
35e0: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
35f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3600: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
3610: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
3620: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
3630: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
3640: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
3650: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
3660: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
3670: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
3680: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
3690: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
36a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
36b0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
36c0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
36d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
36e0: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
36f0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  p;.  assert( p!=
3700: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3710: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3720: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3730: 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70  ( p->aOp==0 || p
3740: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
3750: 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20  ed ){.    if (n 
3760: 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b  != P4_KEYINFO) {
3770: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 6e 2c  .      freeP4(n,
3780: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
3790: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
37a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37b0: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
37c0: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
37d0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
37e0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
37f0: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
3800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
3810: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3820: 3b 0a 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e  ;.  freeP4(pOp->
3830: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
3840: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
3850: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
3860: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
3870: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
3880: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
3890: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
38a0: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
38b0: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
38c0: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
38d0: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
38e0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
38f0: 28 69 6e 74 29 28 73 71 6c 69 74 65 33 5f 69 6e  (int)(sqlite3_in
3900: 74 70 74 72 5f 74 29 7a 50 34 3b 0a 20 20 20 20  tptr_t)zP4;.    
3910: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b  pOp->p4type = n;
3920: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
3930: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
3940: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
3950: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
3960: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
3970: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
3980: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
3990: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
39a0: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
39b0: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
39c0: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
39d0: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
39e0: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
39f0: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
3a00: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
3a10: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
3a20: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
3a30: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
3a40: 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
3a50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b  ;.    pOp->p4.pK
3a60: 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
3a70: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
3a80: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  nfo ){.      mem
3a90: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3aa0: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3ab0: 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
3ac0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
3ad0: 6e 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 20 69 73  n, P4_KEYINFO is
3ae0: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
3af0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 4b 65 79 49  on.      ** KeyI
3b00: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 73 20 74  nfo structures t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 20 61 53 6f 72  hat have no aSor
3b20: 74 4f 72 64 65 72 20 63 6f 6d 70 6f 6e 65 6e 74  tOrder component
3b30: 2e 20 20 45 6c 65 6d 65 6e 74 73 0a 20 20 20 20  .  Elements.    
3b40: 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 61 53 6f    ** with an aSo
3b50: 72 74 4f 72 64 65 72 20 61 6c 77 61 79 73 20 75  rtOrder always u
3b60: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  se P4_KEYINFO_HA
3b70: 4e 44 4f 46 46 2e 20 20 53 6f 20 77 65 20 64 6f  NDOFF.  So we do
3b80: 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65   not.      ** ne
3b90: 65 64 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ed to bother wit
3ba0: 68 20 64 75 70 6c 69 63 61 74 69 6e 67 20 74 68  h duplicating th
3bb0: 65 20 61 53 6f 72 74 4f 72 64 65 72 2e 20 2a 2f  e aSortOrder. */
3bc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3bd0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3be0: 64 65 72 3d 3d 30 20 29 3b 0a 23 69 66 20 30 0a  der==0 );.#if 0.
3bf0: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
3c00: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
3c10: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69  rtOrder;.      i
3c20: 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b  f( aSortOrder ){
3c30: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
3c40: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
3c50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3c60: 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
3c70: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20  [nField];.      
3c80: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3c90: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61  o->aSortOrder, a
3ca0: 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c  SortOrder, nFiel
3cb0: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  d);.      }.#end
3cc0: 69 66 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  if.      pOp->p4
3cd0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
3ce0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
3cf0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
3d00: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
3d10: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3d20: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3d30: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
3d40: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3d50: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
3d60: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
3d70: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
3d80: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
3d90: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
3da0: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
3db0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
3dc0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3dd0: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = n;.  }else{. 
3de0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
3df0: 3d 20 73 74 72 6c 65 6e 28 7a 50 34 29 3b 0a 20  = strlen(zP4);. 
3e00: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73     pOp->p4.z = s
3e10: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
3e20: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a  p->db, zP4, n);.
3e30: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3e40: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20  = P4_DYNAMIC;.  
3e50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  }.}..#ifndef NDE
3e60: 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  BUG./*.** Change
3e70: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
3e80: 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  the the most rec
3e90: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
3ea0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
3eb0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3ec0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
3ed0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3ee0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3ef0: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
3f00: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
3f10: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
3f20: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
3f30: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3f40: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
3f50: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3f60: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
3f70: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
3f80: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
3f90: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3fa0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
3fb0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
3fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
3fd0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73  pz);.    *pz = s
3fe0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
3ff0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
4000: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
4010: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
4020: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4030: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
4040: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a  given address..*
4050: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65  /.VdbeOp *sqlite
4060: 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20  3VdbeGetOp(Vdbe 
4070: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
4080: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4090: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
40a0: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
40b0: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
40c0: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
40d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
40e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61 64  );.  return ((ad
40f0: 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d  dr>=0 && addr<p-
4100: 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b 61  >nOp)?(&p->aOp[a
4110: 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66  ddr]):0);.}..#if
4120: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4130: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
4140: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
4150: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
4160: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4170: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
4180: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
4190: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
41a0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
41b0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
41c0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
41d0: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
41e0: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
41f0: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
4200: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
4210: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
4220: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
4230: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
4240: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
4250: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
4260: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
4270: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
4280: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
4290: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
42a0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
42b0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
42c0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
42d0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
42e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
42f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4300: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
4310: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
4320: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
4330: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
4340: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
4350: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
4360: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
4370: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
4380: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
4390: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
43a0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
43b0: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
43c0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
43d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
43e0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
43f0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4400: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
4410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
4420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
4430: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
4440: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
4450: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
4460: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
4470: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
4480: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
4490: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
44a0: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
44b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
44c0: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
44d0: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
44e0: 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  e,n+1);.        
44f0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
4500: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c    }else if( i+4<
4510: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
4520: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
4530: 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b  mp[i],",nil",4);
4540: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
4550: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
4560: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
4570: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
4580: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
4590: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
45a0: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
45b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45c0: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
45d0: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
45e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
45f0: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
4600: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4610: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4620: 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c  collseq(%.20s)",
4630: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
4640: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4650: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
4660: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
4670: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
4680: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
4690: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
46a0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
46b0: 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  mp, "%s(%d)", pD
46c0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
46d0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
46e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
46f0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
4700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4710: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4720: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  emp, "%lld", *pO
4730: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
4740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4750: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
4760: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
4770: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4780: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20  p, zTemp, "%d", 
4790: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
47a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
47b0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
47c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
47d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
47e0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
47f0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
4800: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4810: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4820: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
4830: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
4840: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  4.pMem;.      as
4850: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
4860: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
4870: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
4880: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4890: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
48a0: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
48b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
48c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
48d0: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
48e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
48f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4900: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
4910: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
4920: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4930: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
4940: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4950: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4960: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
4970: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m->r);.      }. 
4980: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4990: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
49a0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
49b0: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
49c0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
49d0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
49e0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
49f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4a00: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4a10: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
4a20: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
4a30: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
4a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a50: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
4a60: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
4a70: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
4a80: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
4a90: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
4aa0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
4ab0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
4ac0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4ad0: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
4ae0: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
4af0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4b00: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
4b10: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
4b20: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
4b30: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
4b40: 0a 2a 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .**.*/.void sqli
4b50: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
4b60: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29  (Vdbe *p, int i)
4b70: 7b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20  {.  int mask;.  
4b80: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
4b90: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  i<p->db->nDb );.
4ba0: 20 20 61 73 73 65 72 74 28 20 69 3c 73 69 7a 65    assert( i<size
4bb0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
4bc0: 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31  *8 );.  mask = 1
4bd0: 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62  <<i;.  if( (p->b
4be0: 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29  treeMask & mask)
4bf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74  ==0 ){.    p->bt
4c00: 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  reeMask |= mask;
4c10: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
4c20: 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72  eMutexArrayInser
4c30: 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d  t(&p->aMutex, p-
4c40: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
4c50: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65  ;.  }.}...#if de
4c60: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4c70: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4c80: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4c90: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c  ** Print a singl
4ca0: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  e opcode.  This 
4cb0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
4cc0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  for debugging on
4cd0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
4ce0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46  te3VdbePrintOp(F
4cf0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70  ILE *pOut, int p
4d00: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63  c, Op *pOp){.  c
4d10: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72  har *zP4;.  char
4d20: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61   zPtr[50];.  sta
4d30: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4d40: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20  zFormat1 = "%4d 
4d50: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34  %-13s %4d %4d %4
4d60: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e  d %-4s %.2X %s\n
4d70: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
4d80: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
4d90: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
4da0: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
4db0: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20  izeof(zPtr));.  
4dc0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
4dd0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
4de0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
4df0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
4e00: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
4e10: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
4e20: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64  4, pOp->p5,.#ifd
4e30: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4e40: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d        pOp->zComm
4e50: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ent ? pOp->zComm
4e60: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20  ent : "".#else. 
4e70: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20       "".#endif. 
4e80: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
4e90: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
4ea0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
4eb0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
4ec0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
4ed0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
4ee0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
4ef0: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
4f00: 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   N ){.    sqlite
4f10: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4f20: 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61     int malloc_fa
4f30: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
4f40: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 77 68 69  cFailed;.    whi
4f50: 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20  le( N-->0 ){.   
4f60: 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32 20 7c     assert( N<2 |
4f70: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
4f80: 64 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db );.      sqli
4f90: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
4fa0: 65 28 70 29 3b 0a 20 20 20 20 20 20 70 2b 2b 2d  e(p);.      p++-
4fb0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
4fc0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
4fd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
4fe0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
4ff0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
5000: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5010: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
5020: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
5030: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
5040: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
5050: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
5060: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
5070: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
5080: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
5090: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
50a0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
50b0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
50c0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
50d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
50e0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
50f0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5100: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
5110: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
5120: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
5130: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
5140: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
5150: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
5160: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
5170: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
5180: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
5190: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
51a0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
51b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
51c0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
51d0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
51e0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e  UERY PLAN..*/.in
51f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
5200: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
5210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5220: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
5230: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5240: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
5250: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5260: 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d  TE_OK;.  Mem *pM
5270: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5280: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
5290: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
52a0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
52b0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
52c0: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
52d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
52e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
52f0: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
5300: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
5310: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
5320: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
5330: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
5340: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
5350: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
5360: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
5370: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
5380: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
5390: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
53a0: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
53b0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
53c0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
53d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
53e0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
53f0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
5400: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
5410: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
5420: 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  ay(pMem, p->nMem
5430: 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  );..  do{.    i 
5440: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
5450: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
5460: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
5470: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
5480: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
5490: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
54a0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
54b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
54c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
54d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
54e0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
54f0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
5500: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5510: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
5520: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
5530: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
5540: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
5550: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
5560: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
5570: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
5580: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  *z;.    Op *pOp 
5590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
55a0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
55b0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
55c0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
55d0: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
55e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
55f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5600: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5630: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
5640: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5650: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
5660: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
5670: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
5680: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
5690: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
56a0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
56b0: 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70  >opcode);  /* Op
56c0: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
56d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
56e0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
56f0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5700: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5710: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5720: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
5730: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5740: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
5750: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
5760: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5770: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
5780: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57a0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
57b0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
57c0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
57d0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
57e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
57f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5800: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
5830: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5840: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5850: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5860: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5870: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5880: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5890: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
58a0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
58b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
58c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
58d0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
58e0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
58f0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5900: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5910: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
5920: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
5930: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
5940: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
5950: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5960: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
5970: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5980: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
5990: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
59a0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
59b0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
59c0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
59d0: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
59e0: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
59f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5a00: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
5a10: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
5a20: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
5a30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
5a40: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5a50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5a60: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5a70: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
5a80: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5a90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
5aa0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5ab0: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
5ac0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5ad0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5ae0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5af0: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
5b00: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
5b10: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5b20: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  led = 1;.       
5b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5b40: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
5b50: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5b60: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
5b70: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5b80: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
5b90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5ba0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
5bb0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
5bc0: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
5bd0: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5be0: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5bf0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5c00: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5c10: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
5c20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5c30: 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  UG.      if( pOp
5c40: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
5c50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5c60: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
5c70: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
5c80: 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f  em->z = pOp->zCo
5c90: 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  mment;.        p
5ca0: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5cb0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5cc0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5cd0: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5ce0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5cf0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
5d00: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5d10: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5d30: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
5d40: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5d50: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
5d60: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
5d70: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
5d80: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
5d90: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
5da0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5db0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
5dc0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5dd0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
5de0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5df0: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
5e00: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
5e10: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
5e20: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
5e30: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
5e40: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
5e50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
5e60: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
5e70: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
5e80: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
5e90: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
5ea0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
5eb0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
5ec0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
5ed0: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
5ee0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
5ef0: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
5f00: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
5f10: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
5f20: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
5f30: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
5f40: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
5f50: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
5f60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5f70: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
5f80: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5f90: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
5fa0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
5fb0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
5fc0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
5fd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5fe0: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
5ff0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6000: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6010: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6020: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6030: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6040: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6050: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6060: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
6070: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
6080: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
6090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
60a0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
60b0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
60c0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
60d0: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
60e0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
60f0: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6100: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6110: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6120: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6130: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6140: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6150: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
6160: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
6170: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
6180: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
6190: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
61a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
61b0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
61c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
61d0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
61e0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
61f0: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6200: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6220: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6230: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6240: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6250: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
6260: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
6270: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
6280: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
6290: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
62a0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
62b0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
62c0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
62d0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
62e0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
62f0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6300: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6310: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6320: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6330: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6340: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6350: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
6360: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6370: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
6380: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
6390: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
63a0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
63d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6400: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6410: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6420: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6450: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
6460: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
6470: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6490: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
64a0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
64b0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
64e0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
64f0: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6500: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6510: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6520: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6530: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6540: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6550: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
6560: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
6570: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
6580: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
6590: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
65a0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
65b0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
65c0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
65d0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
65e0: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
65f0: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
6600: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
6610: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
6620: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
6630: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
6640: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
6650: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
6660: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
6670: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
6680: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
6690: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
66a0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
66b0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
66c0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
66d0: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
66e0: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
66f0: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
6700: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
6710: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
6720: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
6730: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
6740: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
6750: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
6760: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72  ace for.  ** Cur
6770: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
6780: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
6790: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
67a0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
67b0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
67c0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
67d0: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
67e0: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
67f0: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
6800: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6810: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
6820: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
6830: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
6840: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
6850: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
6860: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
6870: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
6880: 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73   space for regis
6890: 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
68a0: 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20   p->aMem==0 ){. 
68b0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
68c0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
68d0: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
68e0: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
68f0: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
6900: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
6910: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 72 65  , &nArg);.    re
6920: 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70  sizeOpArray(p, p
6930: 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 61 73 73 65  ->nOp);.    asse
6940: 72 74 28 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20  rt( nVar>=0 );. 
6950: 20 20 20 69 66 28 20 69 73 45 78 70 6c 61 69 6e     if( isExplain
6960: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
6970: 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e       p->nMem = n
6980: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a  Mem = 10;.    }.
6990: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71      p->aMem = sq
69a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
69b0: 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d  o(db,.        nM
69c0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  em*sizeof(Mem)  
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
69e0: 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aMem */.      + 
69f0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6a10: 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20  * aVar */.      
6a20: 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  + nArg*sizeof(Me
6a30: 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  m*)             
6a40: 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20   /* apArg */.   
6a50: 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66     + nVar*sizeof
6a60: 28 63 68 61 72 2a 29 20 20 20 20 20 20 20 20 20  (char*)         
6a70: 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a      /* azVar */.
6a80: 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a        + nCursor*
6a90: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 2a 29 20  sizeof(Cursor*) 
6aa0: 2b 20 31 20 20 20 20 2f 2a 20 61 70 43 73 72 20  + 1    /* apCsr 
6ab0: 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  */.    );.    if
6ac0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
6ad0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  led ){.      p->
6ae0: 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20  aMem--;         
6af0: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
6b00: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
6b10: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  */.      p->nMem
6b20: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
6b30: 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f  /*       not fro
6b40: 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20  m 0..nMem-1 */. 
6b50: 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26       p->aVar = &
6b60: 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b  p->aMem[nMem+1];
6b70: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
6b80: 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e   nVar;.      p->
6b90: 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20  okVar = 0;.     
6ba0: 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d   p->apArg = (Mem
6bb0: 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72  **)&p->aVar[nVar
6bc0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61  ];.      p->azVa
6bd0: 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e  r = (char**)&p->
6be0: 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20  apArg[nArg];.   
6bf0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 43     p->apCsr = (C
6c00: 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56 61  ursor**)&p->azVa
6c10: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6c20: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
6c30: 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e  sor;.      for(n
6c40: 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29  =0; n<nVar; n++)
6c50: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61  {.        p->aVa
6c60: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
6c70: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
6c80: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64  ->aVar[n].db = d
6c90: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  b;.      }.     
6ca0: 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65   for(n=1; n<=nMe
6cb0: 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; n++){.       
6cc0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67   p->aMem[n].flag
6cd0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
6ce0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
6cf0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20  .db = db;.      
6d00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
6d10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6d20: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e    for(n=1; n<p->
6d30: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
6d40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
6d50: 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 20  n].db==db );.   
6d60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
6d70: 5b 6e 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e  [n].flags==MEM_N
6d80: 75 6c 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ull );.  }.#endi
6d90: 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b  f..  p->pc = -1;
6da0: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
6db0: 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75  E_OK;.  p->uniqu
6dc0: 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 72  eCnt = 0;.  p->r
6dd0: 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30 3b 0a  eturnDepth = 0;.
6de0: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
6df0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
6e00: 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45  ->explain |= isE
6e10: 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67  xplain;.  p->mag
6e20: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
6e30: 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67  RUN;.  p->nChang
6e40: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  e = 0;.  p->cach
6e50: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d  eCtr = 1;.  p->m
6e60: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61  inWriteFileForma
6e70: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f 70  t = 255;.  p->op
6e80: 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20  enedStatement = 
6e90: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
6ea0: 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 69  ROFILE.  {.    i
6eb0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
6ec0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
6ed0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b  ){.      p->aOp[
6ee0: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  i].cnt = 0;.    
6ef0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
6f00: 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  es = 0;.    }.  
6f10: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
6f20: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
6f30: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
6f40: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
6f50: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
6f60: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
6f70: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
6f80: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
6f90: 6f 72 28 56 64 62 65 20 2a 70 2c 20 43 75 72 73  or(Vdbe *p, Curs
6fa0: 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20  or *pCx){.  if( 
6fb0: 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pCx==0 ){.    re
6fc0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6fd0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
6ff0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
7000: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20  >pCursor);.  }. 
7010: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
7020: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
7030: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
7040: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
7050: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7060: 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78  LTABLE.  if( pCx
7070: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
7080: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
7090: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
70a0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
70b0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
70c0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
70d0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43  le *pModule = pC
70e0: 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20  x->pModule;.    
70f0: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7100: 3d 20 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  = 1;.    (void)s
7110: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
7120: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64  p->db);.    pMod
7130: 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61  ule->xClose(pVta
7140: 62 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76  bCursor);.    (v
7150: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
7160: 79 4f 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  yOn(p->db);.    
7170: 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20  p->inVtabMethod 
7180: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
7190: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
71a0: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 6d 65  Cx->pData);.  me
71b0: 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a  mset(pCx, 0, siz
71c0: 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 0a 20 20  eof(Cursor));.  
71d0: 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
71e0: 70 43 78 2d 3e 61 54 79 70 65 29 3b 20 2a 2f 0a  pCx->aType); */.
71f0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
7200: 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a 0a 2f 2a  e(pCx); */.}../*
7210: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
7220: 72 73 6f 72 73 20 65 78 63 65 70 74 20 66 6f 72  rsors except for
7230: 20 56 54 61 62 20 63 75 72 73 6f 72 73 20 74 68   VTab cursors th
7240: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
7250: 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73  .** in use..*/.s
7260: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
7270: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
7280: 41 63 74 69 76 65 56 74 61 62 73 28 56 64 62 65  ActiveVtabs(Vdbe
7290: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
72a0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30   if( p->apCsr==0
72b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
72c0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
72d0: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43 75  or; i++){.    Cu
72e0: 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70  rsor *pC = p->ap
72f0: 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Csr[i];.    if( 
7300: 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61  pC && (!p->inVta
7310: 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e  bMethod || !pC->
7320: 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a  pVtabCursor) ){.
7330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7340: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
7350: 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43  C);.      p->apC
7360: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  sr[i] = 0;.    }
7370: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
7380: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
7390: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
73a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
73b0: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
73c0: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
73d0: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
73e0: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
73f0: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
7400: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
7410: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
7420: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
7430: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
7440: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
7450: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
7460: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7470: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
7480: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
7490: 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 69 3d  abs(p);.  for(i=
74a0: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
74b0: 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74 54  ++){.    MemSetT
74c0: 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d 65 6d  ypeFlag(&p->aMem
74d0: 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  [i], MEM_Null);.
74e0: 20 20 7d 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65    }..  releaseMe
74f0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
7500: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
7510: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
7520: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
7530: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
7540: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
7550: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
7560: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
7570: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7580: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
7590: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
75a0: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
75b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
75c0: 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b  (p->contextStack
75d0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74  );.  }.  p->cont
75e0: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
75f0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
7600: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  epth = 0;.  p->c
7610: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d  ontextStackTop =
7620: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
7630: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
7640: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
7650: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  ;.  p->pResultSe
7660: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7670: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
7680: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
7690: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
76a0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53  turned by this S
76b0: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  QL.** statement.
76c0: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74   This is now set
76d0: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
76e0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75  , rather than du
76f0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f  ring.** executio
7700: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72  n of the vdbe pr
7710: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71  ogram so that sq
7720: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
7730: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63  nt() can.** be c
7740: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20  alled on an SQL 
7750: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65  statement before
7760: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
7770: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7780: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56  VdbeSetNumCols(V
7790: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73  dbe *p, int nRes
77a0: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a  Column){.  Mem *
77b0: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  pColName;.  int 
77c0: 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  n;..  releaseMem
77d0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
77e0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
77f0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
7800: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
7810: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
7820: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
7830: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
7840: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75  olumn = nResColu
7850: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
7860: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
7870: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
7880: 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62 2c 20  llocZero(p->db, 
7890: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
78a0: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
78b0: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
78c0: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
78d0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
78e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
78f0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
7900: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
7910: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
7920: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
7930: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
7940: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
7950: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
7960: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
7970: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
7980: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
7990: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
79a0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
79b0: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
79c0: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
79d0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
79e0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
79f0: 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54  *.** If N==P4_ST
7a00: 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74  ATIC  it means t
7a10: 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70  hat zName is a p
7a20: 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73  ointer to a cons
7a30: 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73  tant static.** s
7a40: 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e  tring and we can
7a50: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
7a60: 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73  ointer. If it is
7a70: 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65   P4_DYNAMIC, the
7a80: 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  n .** the string
7a90: 20 69 73 20 66 72 65 65 64 20 75 73 69 6e 67 20   is freed using 
7aa0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 77  sqlite3_free() w
7ab0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
7ac0: 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a  finished with.**
7ad0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20   it. Otherwise, 
7ae0: 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65  N bytes of zName
7af0: 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a   are copied..*/.
7b00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
7b10: 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a  etColName(Vdbe *
7b20: 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  p, int idx, int 
7b30: 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  var, const char 
7b40: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29 7b 0a  *zName, int N){.
7b50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
7b60: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
7b70: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
7b80: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
7b90: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
7ba0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
7bb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
7bd0: 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74 28 20  OMEM;.  assert( 
7be0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
7bf0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
7c00: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
7c10: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
7c20: 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50  mn]);.  if( N==P
7c30: 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d  4_DYNAMIC || N==
7c40: 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 20  P4_STATIC ){.   
7c50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
7c60: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
7c70: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
7c80: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
7c90: 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
7ca0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
7cb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74  qlite3VdbeMemSet
7cc0: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e  Str(pColName, zN
7cd0: 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55  ame, N, SQLITE_U
7ce0: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
7cf0: 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28  IENT);.  }.  if(
7d00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7d10: 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  & N==P4_DYNAMIC 
7d20: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
7d30: 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61  >flags = (pColNa
7d40: 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f  me->flags&(~MEM_
7d50: 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e  Static))|MEM_Dyn
7d60: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
7d70: 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xDel = 0;.  }.  
7d80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7d90: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
7da0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
7db0: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
7dc0: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
7dd0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
7de0: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
7df0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
7e00: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
7e10: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
7e20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
7e30: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
7e40: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
7e50: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
7e60: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
7e70: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7e80: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
7e90: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
7ea0: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
7eb0: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
7ec0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
7ed0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
7ee0: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
7ef0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
7f00: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
7f10: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
7f20: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
7f30: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42  mit = 0;..  /* B
7f40: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
7f50: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
7f60: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
7f70: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
7f80: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
7f90: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
7fa0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
7fb0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
7fc0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
7fd0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
7fe0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
7ff0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8000: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
8010: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
8020: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
8030: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
8040: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
8050: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8060: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
8070: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 72  e3VtabSync(db, r
8080: 63 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  c);.  if( rc!=SQ
8090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
80a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
80b0: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
80c0: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
80d0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
80e0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
80f0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
8100: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
8110: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
8120: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
8130: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
8140: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
8150: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
8160: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
8170: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
8180: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
8190: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
81a0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
81b0: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
81c0: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
81d0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
81e0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
81f0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
8200: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
8210: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
8220: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8230: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
8240: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
8250: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
8260: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
8270: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
8280: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
8290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
82a0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
82b0: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
82c0: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
82d0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
82e0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
82f0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
8300: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
8310: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 73 71   ){.    (void)sq
8320: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64  lite3SafetyOff(d
8330: 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d  b);.    rc = db-
8340: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
8350: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29  (db->pCommitArg)
8360: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
8370: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
8380: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
8390: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
83a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
83b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
83c0: 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d  he simple case -
83d0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
83e0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
83f0: 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68  (not counting th
8400: 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61  e.  ** TEMP data
8410: 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e  base) has a tran
8420: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20  saction active. 
8430: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65    There is no ne
8440: 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ed for the.  ** 
8450: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a  master-journal..
8460: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
8470: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
8480: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8490: 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20  Filename() is a 
84a0: 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a  zero length.  **
84b0: 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e   string, it mean
84c0: 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  s the main datab
84d0: 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e  ase is :memory:.
84e0: 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 77    In that case w
84f0: 65 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75  e do.  ** not su
8500: 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c  pport atomic mul
8510: 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c  ti-file commits,
8520: 20 73 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70   so use the simp
8530: 6c 65 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a  le case then.  *
8540: 2a 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  * too..  */.  if
8550: 28 20 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69  ( 0==strlen(sqli
8560: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
8570: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
8580: 42 74 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  Bt)) || nTrans<=
8590: 31 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  1 ){.    for(i=0
85a0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
85b0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
85c0: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
85d0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
85e0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
85f0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
8600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
8610: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
8620: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
8630: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
8640: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
8650: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
8660: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
8670: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
8680: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
8690: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
86a0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
86b0: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
86c0: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
86d0: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
86e0: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
86f0: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
8700: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
8710: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
8720: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
8730: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
8740: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
8750: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
8760: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
8770: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
8780: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
8790: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
87a0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
87b0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
87c0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
87d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
87e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
87f0: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
8800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8810: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8820: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
8830: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
8840: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
8850: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
8860: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
8870: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
8880: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
8890: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
88a0: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
88c0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
88d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
88e0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
88f0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
8900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8910: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
8920: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
8930: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
8940: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
8950: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
8960: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
8970: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
8980: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
8990: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
89a0: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
89b0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
89c0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
89d0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
89e0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
89f0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
8a00: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
8a10: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
8a20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8a30: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
8a40: 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20   do {.      u32 
8a50: 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71  random;.      sq
8a60: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
8a70: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
8a80: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8a90: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
8aa0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
8ab0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
8ac0: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
8ad0: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
8ae0: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
8af0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
8b00: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
8b10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8b30: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71  }.    }while( sq
8b40: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
8b50: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
8b60: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
8b70: 53 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  S) );..    /* Op
8b80: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
8b90: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63  urnal. */.    rc
8ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
8bb0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61  Malloc(pVfs, zMa
8bc0: 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20  ster, &pMaster, 
8bd0: 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
8be0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
8bf0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
8c00: 45 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  E|.        SQLIT
8c10: 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
8c20: 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  |SQLITE_OPEN_MAS
8c30: 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20  TER_JOURNAL, 0. 
8c40: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
8c50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8c60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8c70: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8c80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8c90: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
8ca0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
8cb0: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
8cc0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
8cd0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
8ce0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
8cf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
8d00: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
8d10: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
8d20: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
8d30: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8d40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
8d50: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
8d60: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
8d70: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
8d80: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
8d90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
8da0: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
8db0: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
8dc0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
8dd0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
8de0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
8df0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
8e00: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
8e10: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
8e20: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
8e30: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
8e40: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
8e50: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
8e60: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
8e70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
8e80: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
8e90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
8ea0: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
8eb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8ec0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
8ed0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
8ee0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
8ef0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
8f00: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
8f10: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
8f20: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
8f30: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
8f40: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
8f60: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
8f70: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
8f80: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8f90: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
8fa0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
8fb0: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
8fc0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
8fd0: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
8fe0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
8ff0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9000: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9010: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9020: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9030: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9040: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9060: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
9070: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9080: 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
9090: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
90a0: 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
90b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
90c0: 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
90d0: 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
90e0: 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
90f0: 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
9100: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
9110: 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d  .    zMainFile =
9120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9130: 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  Dirname(db->aDb[
9140: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  0].pBt);.    if(
9150: 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20   (needSync .    
9160: 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74 65 33   && (0==(sqlite3
9170: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9180: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
9190: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
91a0: 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20 20 20  QUENTIAL)).     
91b0: 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33 4f 73  && (rc=sqlite3Os
91c0: 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
91d0: 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
91e0: 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29  ))!=SQLITE_OK) )
91f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
9200: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9210: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
9220: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9230: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9240: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9250: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
9260: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
9270: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
9280: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
9290: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
92a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
92b0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
92c0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
92d0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
92e0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
92f0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
9300: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
9310: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
9320: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
9330: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9340: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
9350: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
9360: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
9370: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
9380: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
9390: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
93a0: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
93b0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
93c0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
93d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
93e0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
93f0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
9400: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
9410: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
9420: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9430: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
9440: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
9450: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
9460: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
9470: 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  re occured..    
9480: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
94a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
94b0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
94c0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
94d0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
94e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
94f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
9500: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
9510: 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
9520: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9530: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
9540: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
9550: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9560: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
9570: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9580: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
9590: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
95a0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
95b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
95c0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
95d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
95e0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
95f0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
9600: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
9610: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
9620: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
9630: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
9640: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
9650: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
9660: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9670: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9680: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
9690: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
96a0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
96b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
96c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
96d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
96e0: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
96f0: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
9700: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9710: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
9720: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
9730: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
9740: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
9750: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
9760: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
9770: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
9780: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
9790: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
97a0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
97b0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
97c0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
97d0: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
97e0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
97f0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
9800: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
9810: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
9820: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
9830: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
9840: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
9850: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
9860: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
9870: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
9880: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
9890: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
98a0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
98b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
98c0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
98d0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
98e0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
98f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9900: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9910: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9920: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e    }.    }.    en
9940: 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
9950: 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20  o_errors();..   
9960: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d   sqlite3VtabComm
9970: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
9980: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
9990: 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  .}../* .** This 
99a0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74  routine checks t
99b0: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e  hat the sqlite3.
99c0: 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f  activeVdbeCnt co
99d0: 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
99e0: 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
99f0: 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
9a00: 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
9a10: 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
9a20: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
9a30: 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
9a40: 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
9a50: 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
9a60: 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
9a70: 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
9a80: 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
9a90: 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
9aa0: 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
9ab0: 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
9ac0: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
9ad0: 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
9ae0: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
9af0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
9b00: 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
9b10: 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
9b20: 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
9b30: 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
9b40: 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
9b50: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
9b60: 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63      if( p->magic
9b70: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
9b80: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
9b90: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
9ba0: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
9bb0: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
9bc0: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
9bd0: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  veVdbeCnt );.}.#
9be0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
9bf0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
9c00: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
9c10: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
9c20: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
9c30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
9c40: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
9c50: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
9c60: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
9c70: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
9c80: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
9c90: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
9ca0: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
9cb0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
9cc0: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
9cd0: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
9ce0: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
9cf0: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
9d00: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
9d10: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
9d20: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
9d30: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
9d40: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
9d50: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
9d60: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
9d70: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
9d80: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
9d90: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
9da0: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
9db0: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
9dc0: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
9dd0: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
9de0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
9df0: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
9e00: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
9e10: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
9e20: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
9e30: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
9e40: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
9e50: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
9e60: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
9e70: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9e80: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
9e90: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
9ea0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
9eb0: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
9ec0: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
9ed0: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
9ee0: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
9ef0: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
9f00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
9f10: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
9f20: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9f30: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9f40: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9f50: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
9f60: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9f70: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
9f80: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
9f90: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
9fa0: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
9fb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9fc0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9fd0: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
9fe0: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
9ff0: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
a000: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
a010: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
a020: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
a030: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
a040: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
a050: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
a060: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
a070: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
a080: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a090: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
a0a0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
a0b0: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
a0c0: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
a0d0: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
a0e0: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
a0f0: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
a100: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
a110: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
a120: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
a130: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
a140: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
a150: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
a160: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
a170: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
a180: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
a190: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
a1a0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
a1b0: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
a1c0: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
a1d0: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
a1e0: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
a1f0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
a200: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
a210: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
a220: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
a230: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
a240: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
a250: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
a260: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
a270: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
a280: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
a290: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70  nd */.  int isSp
a2a0: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
a2b0: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
a2c0: 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   true if SQLITE_
a2d0: 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a  NOMEM or IOERR *
a2e0: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
a2f0: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
a300: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
a310: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
a320: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
a330: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
a340: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
a350: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
a360: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
a370: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
a380: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
a390: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
a3a0: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
a3b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
a3c0: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
a3d0: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
a3e0: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
a3f0: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
a400: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
a410: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
a420: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
a430: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
a440: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
a450: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
a460: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
a470: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
a480: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
a490: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
a4a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
a4b0: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
a4c0: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
a4d0: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
a4e0: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
a4f0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a500: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
a510: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
a520: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
a530: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
a540: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
a550: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
a560: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
a570: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
a580: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
a590: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a5a0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
a5b0: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a5c0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
a5d0: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
a5e0: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
a5f0: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
a600: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
a610: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
a620: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
a630: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
a640: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20  rom p->rc */..  
a650: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
a660: 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
a670: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
a680: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
a690: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70  texArrayEnter(&p
a6a0: 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->aMutex);..    
a6b0: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
a6c0: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
a6d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
a6e0: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
a6f0: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
a700: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
a710: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
a720: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
a750: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
a760: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
a770: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
a780: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
a790: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 6f   /* This loop do
a7a0: 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  es static analys
a7b0: 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  is of the query 
a7c0: 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66 20  to see which of 
a7d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c  the.      ** fol
a7e0: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61 74  lowing three cat
a7f0: 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c 73  egories it falls
a800: 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a 0a   into:.      **.
a810: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 61        **     Rea
a820: 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20  d-only.      ** 
a830: 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20 73      Query with s
a840: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a850: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75  .      **     Qu
a860: 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61 74  ery without stat
a870: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  ement journal.  
a880: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
a890: 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d 65  We could do some
a8a0: 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67 61  thing more elega
a8b0: 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74 61  nt than this sta
a8c0: 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69 2e  tic analysis (i.
a8d0: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  e..      ** stor
a8e0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71 75  e the type of qu
a8f0: 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20 74  ery as part of t
a900: 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20 70  he compliation p
a910: 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20 20  hase), but .    
a920: 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d 61    ** handling ma
a930: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69  lloc() or IO fai
a940: 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c 79  lure is a fairly
a950: 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63 61   obscure edge ca
a960: 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a 20  se so .      ** 
a970: 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c 79  this is probably
a980: 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20 4d   easier. Todo: M
a990: 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f 72  ight be an oppor
a9a0: 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63 65  tunity to reduce
a9b0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20   .      ** code 
a9c0: 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61 6c  size a very smal
a9d0: 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68 2e  l amount though.
a9e0: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
a9f0: 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e 6c    int notReadOnl
aa00: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  y = 0;.      int
aa10: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 30   isStatement = 0
aa20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
aa30: 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70 3d  ->aOp || p->nOp=
aa40: 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  =0);.      for(i
aa50: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
aa60: 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77 69  +){ .        swi
aa70: 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  tch( p->aOp[i].o
aa80: 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  pcode ){.       
aa90: 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73     case OP_Trans
aaa0: 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  action:.        
aab0: 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79 20      notReadOnly 
aac0: 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32 3b  |= p->aOp[i].p2;
aad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
aae0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61  ak;.          ca
aaf0: 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 3a  se OP_Statement:
ab00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 53  .            isS
ab10: 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20 20  tatement = 1;.  
ab20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ab30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ab40: 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f 2a   }..   .      /*
ab50: 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61   If the query wa
ab60: 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20  s read-only, we 
ab70: 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62  need do no rollb
ab80: 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65  ack at all. Othe
ab90: 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
aba0: 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68 65  proceed with the
abb0: 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e   special handlin
abc0: 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  g..      */.    
abd0: 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e 6c    if( notReadOnl
abe0: 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
abf0: 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
ac00: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
ac10: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
ac20: 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74 65  OCKED && isState
ac30: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
ac40: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
ac50: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
ac60: 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  mt;.          p-
ac70: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53  >rc = SQLITE_BUS
ac80: 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  Y;.        } els
ac90: 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49  e if( (mrc==SQLI
aca0: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
acb0: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
acc0: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
acd0: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
ace0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
acf0: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
ad00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ad10: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
ad20: 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
ad30: 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
ad40: 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
ad50: 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
ad60: 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
ad70: 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
ad80: 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
ad90: 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
ada0: 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
adb0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 76  */.          inv
adc0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
add0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
ade0: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  b);.          sq
adf0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
ae00: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
ae10: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
ae20: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
ae30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
ae40: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
ae50: 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
ae60: 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
ae70: 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
ae80: 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20 20   vdbe, then.    
ae90: 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  ** we do either 
aea0: 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
aeb0: 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
aec0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
aed0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
aee0: 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
aef0: 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
af00: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
af10: 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
af20: 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
af30: 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20 20  s occured. .    
af40: 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  */.    if( db->a
af50: 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62 2d  utoCommit && db-
af60: 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d 3d  >activeVdbeCnt==
af70: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
af80: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
af90: 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
afa0: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
afb0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
afc0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
afd0: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
afe0: 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  ag is true, and 
aff0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
b000: 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   was .        **
b010: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68   successful or h
b020: 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
b030: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73  constraint. This
b040: 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
b050: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72  .        ** is r
b060: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20  equired..       
b070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
b080: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
b090: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
b0a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b0b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b0c0: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b0d0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
b0e0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
b0f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b100: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
b110: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
b120: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b130: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
b140: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b150: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b160: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b170: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b180: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
b190: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
b1a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
b1b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b1c0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
b1e0: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
b1f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b200: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b210: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
b220: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
b230: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
b240: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
b250: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b260: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b270: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
b280: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
b290: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
b2a0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
b2b0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
b2c0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b2d0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
b2e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
b2f0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b300: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b310: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
b320: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b330: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
b340: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
b350: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b360: 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  .    /* If xFunc
b370: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
b380: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
b390: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b3a0: 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20  backStmt or.    
b3b0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
b3c0: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
b3d0: 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  it once on each 
b3e0: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
b3f0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20  rror occurs.    
b400: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ** and the retur
b410: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20  n code is still 
b420: 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74  SQLITE_OK, set t
b430: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
b440: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
b450: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
b460: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b470: 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20  !xFunc ||.      
b480: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b490: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c  reeCommitStmt ||
b4a0: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
b4b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b4c0: 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20  ckStmt.    );.  
b4d0: 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63    for(i=0; xFunc
b4e0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
b4f0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
b500: 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  rc;.      Btree 
b510: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
b520: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
b530: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
b540: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
b550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
b560: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
b570: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
b580: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b590: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
b5a0: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
b5b0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53       sqlite3SetS
b5c0: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
b5d0: 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  g, 0);.        }
b5e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b5f0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
b600: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
b610: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
b620: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
b630: 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  nt was committed
b640: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
b650: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
b660: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
b670: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
b680: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
b690: 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63        if( !xFunc
b6a0: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
b6b0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b6c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
b6d0: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
b6e0: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
b6f0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
b700: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b710: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
b720: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
b730: 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
b740: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
b750: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
b760: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
b770: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
b780: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
b790: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
b7a0: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
b7b0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
b7c0: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
b7d0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
b7e0: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
b7f0: 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  0);.      db->fl
b800: 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
b810: 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
b820: 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
b830: 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
b840: 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
b850: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b860: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
b870: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20  >aMutex);.  }.. 
b880: 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
b890: 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
b8a0: 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
b8b0: 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
b8c0: 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
b8d0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
b8e0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b8f0: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  --;.  }.  p->mag
b900: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b910: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
b920: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
b930: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
b940: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
b950: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
b960: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 68 65  NOMEM;.  }.  che
b970: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b980: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  db);..  return S
b990: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
b9a0: 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
b9b0: 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
b9c0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
b9d0: 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
b9e0: 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
b9f0: 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
ba00: 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
ba10: 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
ba20: 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
ba30: 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
ba40: 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
ba50: 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
ba60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ba70: 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20  Clean up a VDBE 
ba80: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20  after execution 
ba90: 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  but do not delet
baa0: 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20  e the VDBE just 
bab0: 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e  yet..** Write an
bac0: 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
bad0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
bae0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
baf0: 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ult code..**.** 
bb00: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
bb10: 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56  ne is run, the V
bb20: 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65  DBE should be re
bb30: 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74  ady to be execut
bb40: 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a  ed.** again..**.
bb50: 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74  ** To look at it
bb60: 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68   another way, th
bb70: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74  is routine reset
bb80: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
bb90: 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61  he.** virtual ma
bba0: 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f  chine from VDBE_
bbb0: 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42  MAGIC_RUN or VDB
bbc0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63  E_MAGIC_HALT bac
bbd0: 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  k to.** VDBE_MAG
bbe0: 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20  IC_INIT..*/.int 
bbf0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
bc00: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
bc10: 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
bc20: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
bc30: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
bc40: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
bc50: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
bc60: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
bc70: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
bc80: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
bc90: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
bca0: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
bcb0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
bcc0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
bcd0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
bce0: 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
bcf0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
bd00: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
bd10: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
bd20: 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
bd30: 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
bd40: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
bd50: 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
bd60: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
bd70: 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
bd80: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
bd90: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
bda0: 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
bdb0: 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
bdc0: 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
bdd0: 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
bde0: 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
bdf0: 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
be00: 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
be10: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
be20: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
be30: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
be40: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
be50: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
be60: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
be70: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
be80: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
be90: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
bea0: 5f 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72  _UTF8,sqlite3_fr
beb0: 65 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  ee);.      db->e
bec0: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
bed0: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
bee0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
bef0: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
bf00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
bf10: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
bf20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bf30: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
bf40: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
bf50: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
bf60: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
bf70: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
bf80: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
bf90: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
bfa0: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
bfb0: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
bfc0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
bfd0: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
bfe0: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
bff0: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
c000: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
c010: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
c020: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
c030: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
c040: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
c050: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
c060: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
c070: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
c080: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
c090: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
c0a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
c0b0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
c0c0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
c0d0: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
c0e0: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
c0f0: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
c100: 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
c110: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
c120: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
c130: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
c140: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c150: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
c160: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
c170: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
c180: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
c190: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
c1a0: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
c1b0: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
c1c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c1d0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c1e0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
c1f0: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
c200: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
c210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
c220: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
c230: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c240: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
c250: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c260: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
c270: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
c280: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
c290: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
c2a0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
c2b0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c2c0: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
c2d0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
c2e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
c2f0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
c310: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
c320: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
c330: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
c340: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
c350: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
c360: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c370: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
c380: 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ed = 0;.  return
c390: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
c3a0: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
c3b0: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
c3c0: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
c3d0: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
c3e0: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
c3f0: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
c400: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
c410: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
c420: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
c430: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
c440: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
c450: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
c460: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c470: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
c480: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
c490: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
c4a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
c4b0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c4c0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
c4d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
c4e0: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
c4f0: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
c500: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
c510: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
c520: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c530: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
c540: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
c550: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
c560: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c570: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
c580: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
c590: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
c5a0: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
c5b0: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
c5c0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
c5d0: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
c5e0: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
c5f0: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
c600: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
c610: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
c620: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
c630: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
c640: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
c650: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
c660: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
c670: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
c680: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
c690: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
c6a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
c6b0: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
c6c0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
c6d0: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
c6e0: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
c6f0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
c700: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
c710: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
c720: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
c730: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
c740: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
c750: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
c760: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c770: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
c780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c790: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
c7a0: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
c7b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
c7c0: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
c7d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
c7e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
c7f0: 43 6c 65 61 6e 75 70 28 70 29 3b 0a 20 20 69 66  Cleanup(p);.  if
c800: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
c810: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
c820: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
c830: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
c840: 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d  t( p->db->pVdbe=
c850: 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d  =p );.    p->db-
c860: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
c870: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
c880: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
c890: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
c8a0: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
c8b0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
c8c0: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
c8d0: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
c8e0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
c8f0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
c900: 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c  eP4(pOp->p4type,
c910: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66   pOp->p4.p);.#if
c920: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
c930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
c940: 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  ree(pOp->zCommen
c950: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
c960: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
c970: 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a  3_free(p->aOp);.
c980: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
c990: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
c9a0: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
c9b0: 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65  e3_free(p->aLabe
c9c0: 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  l);.  if( p->aMe
c9d0: 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  m ){.    sqlite3
c9e0: 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65 6d 5b 31  _free(&p->aMem[1
c9f0: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
ca00: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
ca10: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
ca20: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
ca30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ca40: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  p->aColName);.  
ca50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
ca60: 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  zSql);.  p->magi
ca70: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
ca80: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  EAD;.  sqlite3_f
ca90: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ree(p);.}../*.**
caa0: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
cab0: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
cac0: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
cad0: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
cae0: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
caf0: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  w.  Return an er
cb00: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f  ror code.  If no
cb10: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69   MoveTo is pendi
cb20: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ng, this.** rout
cb30: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67  ine does nothing
cb40: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c   and returns SQL
cb50: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
cb60: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
cb70: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70  Moveto(Cursor *p
cb80: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65  ){.  if( p->defe
cb90: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20  rredMoveto ){.  
cba0: 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23    int res, rc;.#
cbb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
cbc0: 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  T.    extern int
cbd0: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
cbe0: 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  count;.#endif.  
cbf0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
cc00: 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d  able );.    rc =
cc10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
cc20: 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  eto(p->pCursor, 
cc30: 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
cc40: 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
cc50: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cc60: 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49  n rc;.    *p->pI
cc70: 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ncrKey = 0;.    
cc80: 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b  p->lastRowid = k
cc90: 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74  eyToInt(p->movet
cca0: 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d  oTarget);.    p-
ccb0: 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
ccc0: 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20  res==0;.    if( 
ccd0: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  res<0 ){.      r
cce0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
ccf0: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
cd00: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
cd10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
cd20: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
cd30: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
cd40: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
cd50: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
cd60: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
cd70: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
cd80: 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
cd90: 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
cda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cdb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
cdc0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
cdd0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
cde0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
cdf0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
ce00: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
ce10: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
ce20: 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73  erialRead().** s
ce30: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ce40: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
ce50: 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28  VdbeSerialWrite(
ce60: 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
ce70: 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
ce80: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
ce90: 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
cea0: 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
ceb0: 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
cec0: 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
ced0: 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
cee0: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
cef0: 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
cf00: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
cf10: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
cf20: 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
cf30: 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
cf40: 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
cf50: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
cf60: 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
cf70: 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
cf80: 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
cf90: 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
cfa0: 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
cfb0: 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
cfc0: 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
cfd0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
cfe0: 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
cff0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
d000: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d010: 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
d020: 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
d030: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
d040: 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
d050: 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
d060: 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
d070: 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
d080: 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
d090: 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
d0a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d0b0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
d0c0: 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
d0d0: 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
d0e0: 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
d0f0: 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
d100: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
d110: 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
d130: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
d140: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
d150: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d170: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
d180: 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
d1b0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d1c0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
d1e0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d1f0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d200: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
d210: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
d220: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
d230: 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
d260: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
d270: 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
d280: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
d290: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d2a0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
d2d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d2e0: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
d300: 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
d310: 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d340: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
d350: 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
d380: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
d390: 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
d3c0: 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
d3d0: 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
d3e0: 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
d3f0: 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
d400: 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
d410: 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
d420: 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
d430: 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
d440: 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
d450: 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
d460: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
d470: 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
d480: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
d490: 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
d4a0: 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
d4b0: 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
d4c0: 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
d4d0: 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
d4e0: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
d4f0: 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
d500: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d510: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
d520: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
d530: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
d540: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
d550: 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
d560: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
d570: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
d580: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
d590: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
d5a0: 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
d5b0: 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
d5c0: 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
d5d0: 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
d5e0: 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
d5f0: 30 30 31 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  001000)<<32)-1).
d600: 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
d610: 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
d620: 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
d630: 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
d640: 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
d650: 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a  turn 8+i;.    }.
d660: 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69      u = i<0 ? -i
d670: 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c   : i;.    if( u<
d680: 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
d690: 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
d6a0: 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
d6b0: 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
d6c0: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
d6d0: 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
d6e0: 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
d6f0: 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
d700: 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
d710: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
d720: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
d730: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
d740: 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
d750: 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d  sert( flags&(MEM
d760: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
d770: 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
d780: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
d790: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
d7a0: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20   += pMem->u.i;. 
d7b0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
d7c0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
d7d0: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
d7e0: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
d7f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
d800: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
d810: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
d820: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
d830: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
d840: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
d850: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d860: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
d870: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
d880: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
d890: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
d8a0: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
d8b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
d8c0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
d8d0: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
d8e0: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
d8f0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
d900: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
d910: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
d920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
d930: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
d940: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
d950: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
d960: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
d970: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
d980: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
d990: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
d9a0: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
d9b0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
d9c0: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
d9d0: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
d9e0: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
d9f0: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
da00: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
da10: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
da20: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
da30: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
da40: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
da50: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
da60: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
da70: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
da80: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
da90: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
daa0: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
dab0: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
dac0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
dad0: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
dae0: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
daf0: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
db00: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
db10: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
db20: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
db30: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
db40: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
db50: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
db60: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
db70: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
db80: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
db90: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
dba0: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
dbb0: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
dbc0: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
dbd0: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
dbe0: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
dbf0: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
dc00: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
dc10: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
dc20: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
dc30: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
dc40: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
dc50: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
dc60: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
dc70: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
dc80: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
dc90: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
dca0: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
dcb0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
dcc0: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
dcd0: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
dce0: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
dcf0: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
dd00: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
dd10: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
dd20: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
dd30: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
dd40: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
dd50: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
dd60: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
dd70: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
dd80: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
dd90: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
dda0: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
ddb0: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
ddc0: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
ddd0: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
dde0: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
ddf0: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
de00: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
de10: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
de20: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
de30: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
de40: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
de50: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
de60: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
de70: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
de80: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
de90: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
dea0: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
deb0: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
dec0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
ded0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
dee0: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
def0: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
df00: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
df10: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
df20: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
df30: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
df40: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
df50: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
df60: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
df70: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
df80: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
df90: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
dfa0: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
dfb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
dfc0: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
dfd0: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
dfe0: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
dff0: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
e000: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
e010: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
e020: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
e030: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
e040: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
e050: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
e060: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
e070: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
e080: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e090: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
e0a0: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
e0b0: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
e0c0: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
e0d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
e0e0: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
e0f0: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
e100: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
e110: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
e120: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
e130: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
e140: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
e150: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
e160: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
e170: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
e180: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
e190: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
e1a0: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
e1b0: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
e1c0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
e1d0: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
e1e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
e1f0: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
e200: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
e210: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
e220: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
e230: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
e240: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
e250: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
e260: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
e270: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
e280: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
e290: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
e2a0: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
e2b0: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
e2c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
e2d0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
e2e0: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
e2f0: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
e300: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
e310: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
e320: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
e330: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
e340: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
e350: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
e360: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
e370: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
e380: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e390: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
e3a0: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
e3b0: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
e3c0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
e3d0: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
e3e0: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
e3f0: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
e400: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
e410: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
e420: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
e430: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
e440: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
e450: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
e460: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
e470: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
e480: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
e490: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
e4a0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
e4b0: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
e4c0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
e4d0: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
e4e0: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
e4f0: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
e500: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
e510: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
e520: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
e530: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
e540: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
e550: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
e560: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
e570: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
e580: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
e590: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
e5a0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
e5b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e5c0: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
e5d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
e5e0: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
e5f0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
e600: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
e610: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
e620: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
e630: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
e640: 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a  [i] = (v&0xFF);.
e650: 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
e660: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e670: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
e680: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
e690: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
e6a0: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
e6b0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
e6c0: 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
e6d0: 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
e6e0: 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20  u.i:0).         
e6f0: 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64      == sqlite3Vd
e700: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
e710: 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
e720: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
e730: 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
e740: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
e750: 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
e760: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
e770: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
e780: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
e790: 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
e7a0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69  em->u.i;.      i
e7b0: 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20  f( len>nBuf ){. 
e7c0: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75         len = nBu
e7d0: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
e7e0: 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
e7f0: 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
e800: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
e810: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
e820: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
e830: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
e840: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
e850: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
e860: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
e870: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
e880: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
e890: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
e8a0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
e8b0: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
e8c0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
e8d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
e8e0: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
e8f0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
e900: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
e910: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
e920: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
e930: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
e940: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
e950: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
e960: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
e970: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
e980: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
e9b0: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
e9c0: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
e9d0: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
e9e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
e9f0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
ea00: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
ea10: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
ea20: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
ea30: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
ea40: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
ea50: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
ea60: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ea70: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
ea80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ea90: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
eaa0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
eab0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
eac0: 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
ead0: 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
eae0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
eaf0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
eb00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
eb10: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
eb20: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
eb30: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
eb40: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
eb50: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
eb60: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
eb70: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
eb80: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
eb90: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
eba0: 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
ebb0: 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
ebc0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
ebd0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
ebe0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
ebf0: 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
ec00: 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
ec10: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
ec20: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ec30: 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
ec40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
ec50: 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
ec60: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
ec70: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
ec80: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
ec90: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
eca0: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
ecb0: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
ecc0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
ecd0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
ece0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ecf0: 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
ed00: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
ed10: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
ed20: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
ed30: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
ed40: 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
ed50: 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
ed60: 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
ed70: 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
ed80: 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
ed90: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
eda0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
edb0: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
edc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
edd0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
ede0: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
edf0: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
ee00: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
ee10: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
ee20: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
ee30: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
ee40: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
ee50: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
ee60: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
ee70: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
ee80: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
ee90: 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
eea0: 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
eeb0: 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
eec0: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
eed0: 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
eee0: 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
eef0: 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
ef00: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
ef10: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
ef20: 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
ef30: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
ef40: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
ef50: 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
ef60: 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
ef70: 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
ef80: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
ef90: 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
efa0: 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
efb0: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
efc0: 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
efd0: 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
efe0: 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
eff0: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
f000: 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
f010: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
f020: 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
f030: 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
f040: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
f050: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
f060: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
f070: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
f080: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
f090: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
f0a0: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
f0b0: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
f0c0: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
f0d0: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
f0e0: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
f0f0: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
f100: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
f110: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
f120: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
f130: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f140: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
f150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
f160: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
f170: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
f180: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
f190: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
f1a0: 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
f1b0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
f1c0: 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
f1d0: 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
f1e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f1f0: 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
f200: 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
f210: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
f220: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
f230: 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
f240: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
f250: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
f260: 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
f270: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
f280: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f290: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
f2a0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
f2b0: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
f2c0: 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
f2d0: 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
f2e0: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
f2f0: 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
f300: 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
f310: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
f320: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
f330: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
f340: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
f350: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
f360: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
f370: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
f380: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f390: 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
f3a0: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
f3b0: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
f3c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
f3d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
f3e0: 68 65 61 64 65 72 20 6f 66 20 61 20 72 65 63 6f  header of a reco
f3f0: 72 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  rd consists of a
f400: 20 73 65 71 75 65 6e 63 65 20 76 61 72 69 61 62   sequence variab
f410: 6c 65 2d 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le-length intege
f420: 72 73 2e 0a 2a 2a 20 54 68 65 73 65 20 69 6e 74  rs..** These int
f430: 65 67 65 72 73 20 61 72 65 20 61 6c 6d 6f 73 74  egers are almost
f440: 20 61 6c 77 61 79 73 20 73 6d 61 6c 6c 20 61 6e   always small an
f450: 64 20 61 72 65 20 65 6e 63 6f 64 65 64 20 61 73  d are encoded as
f460: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
f470: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f480: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 64 76   macro takes adv
f490: 61 6e 74 61 67 65 20 74 68 69 73 20 66 61 63 74  antage this fact
f4a0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 66 61   to provide a fa
f4b0: 73 74 20 64 65 63 6f 64 65 0a 2a 2a 20 6f 66 20  st decode.** of 
f4c0: 74 68 65 20 69 6e 74 65 67 65 72 73 20 69 6e 20  the integers in 
f4d0: 61 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 2e  a record header.
f4e0: 20 20 49 74 20 69 73 20 66 61 73 74 65 72 20 66    It is faster f
f4f0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
f500: 73 65 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20  se.** where the 
f510: 69 6e 74 65 67 65 72 20 69 73 20 61 20 73 69 6e  integer is a sin
f520: 67 6c 65 20 62 79 74 65 2e 20 20 49 74 20 69 73  gle byte.  It is
f530: 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72   a little slower
f540: 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 69 6e 74   when the.** int
f550: 65 67 65 72 20 69 73 20 74 77 6f 20 6f 72 20 6d  eger is two or m
f560: 6f 72 65 20 62 79 74 65 73 2e 20 20 42 75 74 20  ore bytes.  But 
f570: 6f 76 65 72 61 6c 6c 20 69 74 20 69 73 20 66 61  overall it is fa
f580: 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ster..**.** The 
f590: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
f5a0: 73 69 6f 6e 73 20 61 72 65 20 65 71 75 69 76 61  sions are equiva
f5b0: 6c 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lent:.**.**     
f5c0: 78 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61  x = sqlite3GetVa
f5d0: 72 69 6e 74 33 32 28 20 41 2c 20 26 42 20 29 3b  rint32( A, &B );
f5e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 47  .**.**     x = G
f5f0: 65 74 56 61 72 69 6e 74 28 20 41 2c 20 42 20 29  etVarint( A, B )
f600: 3b 0a 2a 2a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ;.**.*/.#define 
f610: 47 65 74 56 61 72 69 6e 74 28 41 2c 42 29 20 20  GetVarint(A,B)  
f620: 28 28 42 20 3d 20 2a 28 41 29 29 3c 3d 30 78 37  ((B = *(A))<=0x7
f630: 66 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 47  f ? 1 : sqlite3G
f640: 65 74 56 61 72 69 6e 74 33 32 28 41 2c 20 26 42  etVarint32(A, &B
f650: 29 29 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20  ))..#if 0./*.** 
f660: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
f670: 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
f680: 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
f690: 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 69  ex records speci
f6a0: 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65  fied by .** {nKe
f6b0: 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b  y1, pKey1} and {
f6c0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72  nKey2, pKey2}, r
f6d0: 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 74  eturning a negat
f6e0: 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ive, zero.** or 
f6f0: 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72  positive integer
f700: 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   if {nKey1, pKey
f710: 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  1} is less than,
f720: 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a   equal to or .**
f730: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b 6e   greater than {n
f740: 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42  Key2, pKey2}.  B
f750: 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  oth Key1 and Key
f760: 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 73  2 must be byte s
f770: 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73  trings.** compos
f780: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
f790: 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
f7a0: 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2a 0a 2a  f the VDBE..**.*
f7b0: 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
f7c0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
f7d0: 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
f7e0: 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
f7f0: 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
f800: 6c 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c 20  lengths differ, 
f810: 4b 65 79 32 20 6d 75 73 74 20 62 65 20 74 68 65  Key2 must be the
f820: 20 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65 20   shorter of the 
f830: 74 77 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  two..*/.int sqli
f840: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
f850: 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 75 73  pare(.  void *us
f860: 65 72 44 61 74 61 2c 0a 20 20 69 6e 74 20 6e 4b  erData,.  int nK
f870: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
f880: 2a 70 4b 65 79 31 2c 20 0a 20 20 69 6e 74 20 6e  *pKey1, .  int n
f890: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
f8a0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 4b 65 79   *pKey2.){.  Key
f8b0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
f8c0: 20 28 4b 65 79 49 6e 66 6f 2a 29 75 73 65 72 44   (KeyInfo*)userD
f8d0: 61 74 61 3b 0a 20 20 75 33 32 20 64 31 2c 20 64  ata;.  u32 d1, d
f8e0: 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  2;          /* O
f8f0: 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
f900: 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
f910: 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
f920: 69 64 78 31 2c 20 69 64 78 32 3b 20 20 20 20 20  idx1, idx2;     
f930: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
f940: 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
f950: 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
f960: 0a 20 20 75 33 32 20 73 7a 48 64 72 31 2c 20 73  .  u32 szHdr1, s
f970: 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 75 6d 62 65  zHdr2;  /* Numbe
f980: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
f990: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
f9a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c  = 0;.  int nFiel
f9b0: 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
f9c0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
f9d0: 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
f9e0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
f9f0: 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
fa00: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
fa10: 68 61 72 20 2a 61 4b 65 79 32 20 3d 20 28 63 6f  har *aKey2 = (co
fa20: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
fa30: 72 20 2a 29 70 4b 65 79 32 3b 0a 0a 20 20 4d 65  r *)pKey2;..  Me
fa40: 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 6d 20 6d 65  m mem1;.  Mem me
fa50: 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d  m2;.  mem1.enc =
fa60: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
fa70: 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
fa80: 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31  Info->db;.  mem1
fa90: 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65  .flags = 0;.  me
faa0: 6d 32 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m2.enc = pKeyInf
fab0: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 64  o->enc;.  mem2.d
fac0: 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
fad0: 3b 0a 20 20 6d 65 6d 32 2e 66 6c 61 67 73 20 3d  ;.  mem2.flags =
fae0: 20 30 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   0;.  .  idx1 = 
faf0: 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79 31 2c  GetVarint(aKey1,
fb00: 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d   szHdr1);.  d1 =
fb10: 20 73 7a 48 64 72 31 3b 0a 20 20 69 64 78 32 20   szHdr1;.  idx2 
fb20: 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65 79  = GetVarint(aKey
fb30: 32 2c 20 73 7a 48 64 72 32 29 3b 0a 20 20 64 32  2, szHdr2);.  d2
fb40: 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69   = szHdr2;.  nFi
fb50: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
fb60: 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
fb70: 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
fb80: 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20  idx2<szHdr2 ){. 
fb90: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
fba0: 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72  pe1;.    u32 ser
fbb0: 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20  ial_type2;..    
fbc0: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69  /* Read the seri
fbd0: 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65  al types for the
fbe0: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e   next element in
fbf0: 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20   each key. */.  
fc00: 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61 72    idx1 += GetVar
fc10: 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  int( aKey1+idx1,
fc20: 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
fc30: 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65  .    if( d1>=nKe
fc40: 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64 62  y1 && sqlite3Vdb
fc50: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
fc60: 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29  erial_type1)>0 )
fc70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32   break;.    idx2
fc80: 20 2b 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61   += GetVarint( a
fc90: 4b 65 79 32 2b 69 64 78 32 2c 20 73 65 72 69 61  Key2+idx2, seria
fca0: 6c 5f 74 79 70 65 32 20 29 3b 0a 20 20 20 20 69  l_type2 );.    i
fcb0: 66 28 20 64 32 3e 3d 6e 4b 65 79 32 20 26 26 20  f( d2>=nKey2 && 
fcc0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
fcd0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
fce0: 74 79 70 65 32 29 3e 30 20 29 20 62 72 65 61 6b  type2)>0 ) break
fcf0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
fd00: 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
fd10: 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
fd20: 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
fd30: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
fd40: 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
fd50: 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
fd60: 6d 31 29 3b 0a 20 20 20 20 64 32 20 2b 3d 20 73  m1);.    d2 += s
fd70: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
fd80: 47 65 74 28 26 61 4b 65 79 32 5b 64 32 5d 2c 20  Get(&aKey2[d2], 
fd90: 73 65 72 69 61 6c 5f 74 79 70 65 32 2c 20 26 6d  serial_type2, &m
fda0: 65 6d 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em2);..    /* Do
fdb0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
fdc0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
fdd0: 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
fde0: 65 28 26 6d 65 6d 31 2c 20 26 6d 65 6d 32 2c 20  e(&mem1, &mem2, 
fdf0: 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49  i<nField ? pKeyI
fe00: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20  nfo->aColl[i] : 
fe10: 30 29 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 31  0);.    if( mem1
fe20: 2e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e 20 29  .flags&MEM_Dyn )
fe30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
fe40: 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20  elease(&mem1);. 
fe50: 20 20 20 69 66 28 20 6d 65 6d 32 2e 66 6c 61 67     if( mem2.flag
fe60: 73 26 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69  s&MEM_Dyn ) sqli
fe70: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
fe80: 65 28 26 6d 65 6d 32 29 3b 0a 20 20 20 20 69 66  e(&mem2);.    if
fe90: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
fea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
feb0: 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
fec0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   One of the keys
fed0: 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
fee0: 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  ds, but all the 
fef0: 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
ff00: 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72  t point.  ** wer
ff10: 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20  e equal. If the 
ff20: 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20  incrKey flag is 
ff30: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73  true, then the s
ff40: 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a  econd key is.  *
ff50: 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72  * treated as lar
ff60: 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
ff70: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
ff80: 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b   pKeyInfo->incrK
ff90: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
ffa0: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
ffb0: 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72  f( !pKeyInfo->pr
ffc0: 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20  efixIsEqual ){. 
ffd0: 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79       if( d1<nKey
ffe0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  1 ){.        rc 
fff0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
10000 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b   if( d2<nKey2 ){
10010 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
10020 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6f 63 63 75 72  ;  /* Only occur
10030 73 20 6f 6e 20 61 20 63 6f 72 72 75 70 74 20 64  s on a corrupt d
10040 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
10050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10060 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
10070 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26  fo->aSortOrder &
10080 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  & i<pKeyInfo->nF
10090 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  ield.           
100a0 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d      && pKeyInfo-
100b0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
100c0 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a  {.    rc = -rc;.
100d0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
100e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
100f0 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
10100 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
10110 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
10120 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10130 20 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 69 6e 64   a.** single ind
10140 65 78 20 72 65 63 6f 72 64 20 74 68 61 74 20 68  ex record that h
10150 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10160 70 61 72 73 65 64 20 6f 75 74 20 69 6e 74 6f 20  parsed out into 
10170 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 76 61  individual.** va
10180 6c 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  lues..**.** A re
10190 63 6f 72 64 20 69 73 20 61 6e 20 6f 62 6a 65 63  cord is an objec
101a0 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  t that contains 
101b0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 66 69 65 6c  one or more fiel
101c0 64 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 52  ds of data..** R
101d0 65 63 6f 72 64 73 20 61 72 65 20 75 73 65 64 20  ecords are used 
101e0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 6e  to store the con
101f0 74 65 6e 74 20 6f 66 20 61 20 74 61 62 6c 65 20  tent of a table 
10200 72 6f 77 20 61 6e 64 20 74 6f 20 73 74 6f 72 65  row and to store
10210 0a 2a 2a 20 74 68 65 20 6b 65 79 20 6f 66 20 61  .** the key of a
10220 6e 20 69 6e 64 65 78 2e 20 20 41 20 62 6c 6f 62  n index.  A blob
10230 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
10240 65 63 6f 72 64 20 69 73 20 63 72 65 61 74 65 64  ecord is created
10250 20 62 79 0a 2a 2a 20 74 68 65 20 4f 50 5f 4d 61   by.** the OP_Ma
10260 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20  keRecord opcode 
10270 6f 66 20 74 68 65 20 56 44 42 45 20 61 6e 64 20  of the VDBE and 
10280 69 73 20 64 69 73 61 73 73 65 6d 62 6c 69 65 64  is disassemblied
10290 20 62 79 20 74 68 65 0a 2a 2a 20 4f 50 5f 43 6f   by the.** OP_Co
102a0 6c 75 6d 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a  lumn opcode..**.
102b0 2a 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 72  ** This structur
102c0 65 20 68 6f 6c 64 73 20 61 20 72 65 63 6f 72 64  e holds a record
102d0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
102e0 79 20 62 65 65 6e 20 64 69 73 61 73 73 65 6d 62  y been disassemb
102f0 6c 65 64 0a 2a 2a 20 69 6e 74 6f 20 69 74 73 20  led.** into its 
10300 63 6f 6e 73 74 69 74 75 74 65 6e 74 20 66 69 65  constitutent fie
10310 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 56  lds..*/.struct V
10320 64 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20  dbeParsedRecord 
10330 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  {.  KeyInfo *pKe
10340 79 49 6e 66 6f 3b 20 20 2f 2a 20 43 6f 6c 6c 61  yInfo;  /* Colla
10350 74 69 6f 6e 20 61 6e 64 20 73 6f 72 74 2d 6f 72  tion and sort-or
10360 64 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  der information 
10370 2a 2f 0a 20 20 75 31 36 20 6e 46 69 65 6c 64 3b  */.  u16 nField;
10380 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10390 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
103a0 20 61 70 4d 65 6d 5b 5d 20 2a 2f 0a 20 20 75 38   apMem[] */.  u8
103b0 20 6e 65 65 64 46 72 65 65 3b 20 20 20 20 20 20   needFree;      
103c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6d 65 6d    /* True if mem
103d0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
103e0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
103f0 28 29 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 44  () */.  u8 needD
10400 65 73 74 72 6f 79 3b 20 20 20 20 20 2f 2a 20 54  estroy;     /* T
10410 72 75 65 20 69 66 20 61 70 4d 65 6d 5b 5d 73 20  rue if apMem[]s 
10420 73 68 6f 75 6c 64 20 62 65 20 64 65 73 74 72 6f  should be destro
10430 79 65 64 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a  yed on close */.
10440 20 20 4d 65 6d 20 2a 61 70 4d 65 6d 5b 31 5d 3b    Mem *apMem[1];
10450 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20        /* Values 
10460 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  */.};../*.** Giv
10470 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
10480 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
10490 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
104a0 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
104b0 63 6f 72 64 20 69 6e 74 6f 20 61 20 56 64 62 65  cord into a Vdbe
104c0 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72  ParsedRecord str
104d0 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
104e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  a pointer to.** 
104f0 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a  that structure..
10500 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
10510 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74  g function might
10520 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65   provide szSpace
10530 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
10540 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70  .** space at pSp
10550 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65  ace.  This space
10560 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
10570 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
10580 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52  d.** VDbeParsedR
10590 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20  ecord structure 
105a0 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  if it is large e
105b0 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73  nough.  If it is
105c0 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75  .** not big enou
105d0 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74  gh, space is obt
105e0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
105f0 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a  e3_malloc()..**.
10600 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
10610 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64  structure should
10620 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20   be closed by a 
10630 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  call to.** sqlit
10640 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
10650 72 73 65 28 29 2e 0a 2a 2f 20 0a 56 64 62 65 50  rse()..*/ .VdbeP
10660 61 72 73 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  arsedRecord *sql
10670 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 50 61  ite3VdbeRecordPa
10680 72 73 65 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  rse(.  KeyInfo *
10690 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a  pKeyInfo,     /*
106a0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
106b0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f  ut the record fo
106c0 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  rmat */.  int nK
106d0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
106e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
106f0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
10700 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
10710 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Key,      /* The
10720 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
10730 2f 0a 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65  /.  void *pSpace
10740 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  ,          /* Sp
10750 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ace available to
10760 20 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20   hold resulting 
10770 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
10780 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20  szSpace         
10790 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
107a0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
107b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  */.){.  const un
107c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
107d0 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
107e0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b  ned char *)pKey;
107f0 0a 20 20 56 64 62 65 50 61 72 73 65 64 52 65 63  .  VdbeParsedRec
10800 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42  ord *p;.  int nB
10810 79 74 65 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64  yte;.  int i, id
10820 78 2c 20 64 3b 0a 20 20 75 33 32 20 73 7a 48 64  x, d;.  u32 szHd
10830 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  r;.  Mem *pMem;.
10840 20 20 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a    .  nByte = siz
10850 65 6f 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66  eof(*p) + sizeof
10860 28 4d 65 6d 2a 29 2a 70 4b 65 79 49 6e 66 6f 2d  (Mem*)*pKeyInfo-
10870 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
10880 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
10890 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
108a0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
108b0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
108c0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20  pace ){.    p = 
108d0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
108e0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
108f0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
10900 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
10910 3b 0a 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65  ;.    p->needFre
10920 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
10930 20 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a      p = pSpace;.
10940 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20      p->needFree 
10950 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  = 0;.  }.  p->pK
10960 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
10970 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
10980 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10990 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64  d + 1;.  p->need
109a0 44 65 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70  Destroy = 1;.  p
109b0 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 70 2d 3e  Mem = (Mem*)&p->
109c0 61 70 4d 65 6d 5b 70 4b 65 79 49 6e 66 6f 2d 3e  apMem[pKeyInfo->
109d0 6e 46 69 65 6c 64 2b 31 5d 3b 0a 20 20 69 64 78  nField+1];.  idx
109e0 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b 65   = GetVarint(aKe
109f0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
10a00 20 73 7a 48 64 72 3b 0a 20 20 69 20 3d 20 30 3b   szHdr;.  i = 0;
10a10 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
10a20 48 64 72 20 26 26 20 69 3c 70 2d 3e 6e 46 69 65  Hdr && i<p->nFie
10a30 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
10a40 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
10a50 69 64 78 20 2b 3d 20 47 65 74 56 61 72 69 6e 74  idx += GetVarint
10a60 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69  ( aKey+idx, seri
10a70 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
10a80 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c  ( d>=nKey && sql
10a90 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
10aa0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
10ab0 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e)>0 ) break;.  
10ac0 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
10ad0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
10ae0 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
10af0 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d  Info->db;.    pM
10b00 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
10b10 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
10b20 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
10b30 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
10b40 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
10b50 2d 3e 61 70 4d 65 6d 5b 69 2b 2b 5d 20 3d 20 70  ->apMem[i++] = p
10b60 4d 65 6d 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Mem++;.  }.  p->
10b70 6e 46 69 65 6c 64 20 3d 20 69 3b 0a 20 20 72 65  nField = i;.  re
10b80 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d  turn (void*)p;.}
10b90 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10ba0 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20  tine destroys a 
10bb0 56 64 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VdbeParsedRecord
10bc0 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
10bd0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10be0 64 55 6e 70 61 72 73 65 28 56 64 62 65 50 61 72  dUnparse(VdbePar
10bf0 73 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  sedRecord *p){. 
10c00 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66   if( p ){.    if
10c10 28 20 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f 79  ( p->needDestroy
10c20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
10c30 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
10c40 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  i<p->nField; i++
10c50 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10c60 2d 3e 61 70 4d 65 6d 5b 69 5d 2d 3e 66 6c 61 67  ->apMem[i]->flag
10c70 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20  s & MEM_Dyn ){. 
10c80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
10c90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
10ca0 2d 3e 61 70 4d 65 6d 5b 69 5d 29 3b 0a 20 20 20  ->apMem[i]);.   
10cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10cc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
10cd0 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20  needFree ){.    
10ce0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10cf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
10d00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10d10 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
10d20 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
10d30 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
10d40 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
10d50 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
10d60 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
10d70 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
10d80 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
10d90 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
10da0 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  if {nKey1, pKey1
10db0 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  } is less than, 
10dc0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
10dd0 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 50 4b  greater than pPK
10de0 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
10df0 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
10e00 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
10e10 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
10e20 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
10e30 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
10e40 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
10e50 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
10e60 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
10e70 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
10e80 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
10e90 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
10ea0 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
10eb0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
10ec0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
10ed0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
10ee0 20 42 75 74 20 69 66 20 74 68 65 20 6c 65 6e 67   But if the leng
10ef0 74 68 73 20 64 69 66 66 65 72 2c 20 4b 65 79 32  ths differ, Key2
10f00 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 68 6f   must be the sho
10f10 72 74 65 72 20 6f 66 20 74 68 65 20 74 77 6f 2e  rter of the two.
10f20 0a 2a 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61  .**.** Historica
10f30 6c 20 6e 6f 74 65 3a 20 49 6e 20 65 61 72 6c 69  l note: In earli
10f40 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  er versions of t
10f50 68 69 73 20 72 6f 75 74 69 6e 65 20 62 6f 74 68  his routine both
10f60 20 4b 65 79 31 0a 2a 2a 20 61 6e 64 20 4b 65 79   Key1.** and Key
10f70 32 20 77 65 72 65 20 62 6c 6f 62 73 20 6f 62 74  2 were blobs obt
10f80 61 69 6e 65 64 20 66 72 6f 6d 20 4f 50 5f 4d 61  ained from OP_Ma
10f90 6b 65 52 65 63 6f 72 64 2e 20 20 42 75 74 20 77  keRecord.  But w
10fa0 65 20 66 6f 75 6e 64 0a 2a 2a 20 74 68 61 74 20  e found.** that 
10fb0 69 6e 20 74 79 70 69 63 61 6c 20 75 73 65 20 74  in typical use t
10fc0 68 65 20 73 61 6d 65 20 4b 65 79 32 20 77 6f 75  he same Key2 wou
10fd0 6c 64 20 62 65 20 73 75 62 6d 69 74 74 65 64 20  ld be submitted 
10fe0 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 2a  multiple times.*
10ff0 2a 20 69 6e 20 61 20 72 6f 77 2e 20 20 53 6f 20  * in a row.  So 
11000 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
11010 77 61 73 20 61 64 64 65 64 20 74 6f 20 70 61 72  was added to par
11020 73 65 20 74 68 65 20 4b 65 79 32 20 6b 65 79 0a  se the Key2 key.
11030 2a 2a 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e  ** separately an
11040 64 20 73 75 62 6d 69 74 20 74 68 65 20 70 61 72  d submit the par
11050 73 65 64 20 76 65 72 73 69 6f 6e 2e 20 20 49 6e  sed version.  In
11060 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76   this way, we av
11070 6f 69 64 0a 2a 2a 20 70 61 72 73 69 6e 67 20 74  oid.** parsing t
11080 68 65 20 73 61 6d 65 20 4b 65 79 32 20 6d 75 6c  he same Key2 mul
11090 74 69 70 6c 65 20 74 69 6d 65 73 20 69 6e 20 61  tiple times in a
110a0 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   row..*/.int sql
110b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
110c0 6d 70 61 72 65 50 61 72 73 65 64 28 0a 20 20 69  mpareParsed(.  i
110d0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
110e0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20  void *pKey1, .  
110f0 56 64 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VdbeParsedRecord
11100 20 2a 70 50 4b 65 79 32 0a 29 7b 0a 20 20 75 33   *pPKey2.){.  u3
11110 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
11120 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
11130 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
11140 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
11150 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
11160 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
11170 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
11180 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
11190 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
111a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
111b0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
111c0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
111d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
111e0 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
111f0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
11200 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
11210 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
11220 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
11230 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11240 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
11250 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
11260 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
11270 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
11280 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
11290 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
112a0 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61  ->db;.  mem1.fla
112b0 67 73 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78  gs = 0;.  .  idx
112c0 31 20 3d 20 47 65 74 56 61 72 69 6e 74 28 61 4b  1 = GetVarint(aK
112d0 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
112e0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 6e  d1 = szHdr1;.  n
112f0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
11300 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c  ->nField;.  whil
11310 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
11320 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
11330 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
11340 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
11350 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
11360 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
11370 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
11380 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
11390 20 20 20 69 64 78 31 20 2b 3d 20 47 65 74 56 61     idx1 += GetVa
113a0 72 69 6e 74 28 20 61 4b 65 79 31 2b 69 64 78 31  rint( aKey1+idx1
113b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
113c0 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
113d0 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
113e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
113f0 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
11400 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
11410 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
11420 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
11430 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
11440 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
11450 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
11460 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
11470 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
11480 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
11490 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
114a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
114b0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 70  Compare(&mem1, p
114c0 50 4b 65 79 32 2d 3e 61 70 4d 65 6d 5b 69 5d 2c  PKey2->apMem[i],
114d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
114e0 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46              i<nF
114f0 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
11500 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
11510 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 66 6c 61      if( mem1.fla
11520 67 73 26 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c  gs&MEM_Dyn ) sql
11530 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11540 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69  se(&mem1);.    i
11550 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
11560 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11570 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f     i++;.  }..  /
11580 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79  * One of the key
11590 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
115a0 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  lds, but all the
115b0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
115c0 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65  at point.  ** we
115d0 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
115e0 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73   incrKey flag is
115f0 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
11600 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20  second key is.  
11610 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61  ** treated as la
11620 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rger..  */.  if(
11630 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   rc==0 ){.    if
11640 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72  ( pKeyInfo->incr
11650 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
11660 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
11670 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70  if( !pKeyInfo->p
11680 72 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a  refixIsEqual ){.
11690 20 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65        if( d1<nKe
116a0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  y1 ){.        rc
116b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
116c0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
116d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
116e0 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e  rder && i<pKeyIn
116f0 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20  fo->nField.     
11700 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4b 65            && pKe
11710 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
11720 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d  r[i] ){.    rc =
11730 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   -rc;.  }..  ret
11740 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11750 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73   The argument is
11760 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
11770 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74  composed using t
11780 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
11790 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20   opcode..** The 
117a0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
117b0 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  is record should
117c0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28   be an integer (
117d0 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20  specifically.** 
117e0 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64  an integer rowid
117f0 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
11800 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
11810 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a  ber of bytes in.
11820 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e  ** that integer.
11830 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11840 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63  dbeIdxRowidLen(c
11850 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
11860 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20    u32 szHdr;    
11870 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
11880 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75  he header */.  u
11890 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20  32 typeRowid;   
118a0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
118b0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
118c0 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
118d0 69 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48  int32(aKey, &szH
118e0 64 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65  dr);.  sqlite3Ge
118f0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
11900 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
11910 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  owid);.  return 
11920 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11930 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
11940 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a  id);.}.  ../*.**
11950 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
11960 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
11970 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  reated using the
11980 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
11990 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74  pcode..** Read t
119a0 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61  he rowid (the la
119b0 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
119c0 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72  record) and stor
119d0 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a  e it in *rowid..
119e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
119f0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
11a00 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65  g works, or an e
11a10 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
11a20 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
11a30 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
11a40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
11a50 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
11a60 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
11a70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
11a80 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
11a90 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
11aa0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
11ab0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
11ac0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
11ad0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
11ae0 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
11af0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
11b00 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
11b10 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  v;..  sqlite3Btr
11b20 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
11b30 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
11b40 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
11b50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11b60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11b70 0a 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d  .  }.  m.flags =
11b80 20 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a   0;.  m.db = 0;.
11b90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11ba0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
11bb0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
11bc0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
11bd0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11be0 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
11bf0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
11c00 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
11c10 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
11c20 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
11c30 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
11c40 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
11c50 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
11c60 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
11c70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
11c80 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
11c90 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
11ca0 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
11cb0 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
11cc0 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
11cd0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11ce0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
11cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11d00 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
11d10 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
11d20 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
11d30 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20  sor pC is point 
11d40 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
11d50 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
11d60 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20  pKey (of length 
11d70 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e  nKey).  Write in
11d80 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
11d90 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
11da0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
11db0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
11dc0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
11dd0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
11de0 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20  ater than pKey. 
11df0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11e00 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
11e10 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68  .** pKey is eith
11e20 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
11e30 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
11e40 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
11e50 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
11e60 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
11e70 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
11e80 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
11e90 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
11ea0 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
11eb0 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ell..*/.int sqli
11ec0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
11ed0 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a  pare(.  Cursor *
11ee0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
11ef0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
11f00 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
11f10 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  inst */.  int nK
11f20 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
11f30 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
11f40 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
11f50 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f70 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
11f80 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
11f90 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
11fa0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
11fb0 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
11fc0 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
11fd0 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
11fe0 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20  wid;.  Mem m;.  
11ff0 56 64 62 65 50 61 72 73 65 64 52 65 63 6f 72 64  VdbeParsedRecord
12000 20 2a 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a   *pRec;.  char z
12010 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73  Space[200];..  s
12020 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
12030 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
12040 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
12050 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72  Key<=0 ){.    *r
12060 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
12070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12080 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  }.  m.db = 0;.  
12090 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 72  m.flags = 0;.  r
120a0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
120b0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
120c0 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
120d0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
120e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
120f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c  turn rc;.  }.  l
12100 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
12110 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
12120 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 70 52  ((u8*)m.z);.  pR
12130 65 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ec = sqlite3Vdbe
12140 52 65 63 6f 72 64 50 61 72 73 65 28 70 43 2d 3e  RecordParse(pC->
12150 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20  pKeyInfo, nKey, 
12160 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 7a 53 70 61 63 65 2c 20 73 69        zSpace, si
12190 7a 65 6f 66 28 7a 53 70 61 63 65 29 29 3b 0a 20  zeof(zSpace));. 
121a0 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 7b 0a   if( pRec==0 ){.
121b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
121c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a  E_NOMEM;.  }.  *
121d0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
121e0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 50 61  eRecordComparePa
121f0 72 73 65 64 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  rsed(m.n-lenRowi
12200 64 2c 20 6d 2e 7a 2c 20 70 52 65 63 29 3b 0a 20  d, m.z, pRec);. 
12210 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
12220 72 64 55 6e 70 61 72 73 65 28 70 52 65 63 29 3b  rdUnparse(pRec);
12230 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
12240 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
12250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12270 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
12280 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
12290 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
122a0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
122b0 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
122c0 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
122d0 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
122e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
122f0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
12300 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
12310 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
12320 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12330 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
12340 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
12350 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
12360 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
12370 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
12380 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
12390 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
123a0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
123b0 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
123c0 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
123d0 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
123e0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
123f0 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
12400 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
12410 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
12420 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
12430 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
12440 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
12450 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
12460 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
12470 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
12480 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
12490 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
124a0 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
124b0 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
124c0 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
124d0 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
124e0 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
124f0 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
12500 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
12510 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
12520 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
12530 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
12540 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
12550 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
12560 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
12570 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
12580 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
12590 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
125a0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
125b0 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
125c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
125d0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
125e0 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
125f0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
12600 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
12610 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
12620 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
12630 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
12640 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12650 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
12660 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
12670 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
12680 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
12690 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
126a0 76 2d 3e 64 62 3b 0a 7d 0a                       v->db;.}.