/ Hex Artifact Content
Login

Artifact 519ec819a8e549d087899f0c9a912afcdda762b4:


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 2c 20 69 6e 74 20 66 72 65 65 62 75 66  t N, int freebuf
4f00: 66 65 72 73 29 7b 0a 20 20 69 66 28 20 70 20 26  fers){.  if( p &
4f10: 26 20 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  & N ){.    sqlit
4f20: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
4f30: 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66      int malloc_f
4f40: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
4f50: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 77 68  ocFailed;.    wh
4f60: 69 6c 65 28 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20  ile( N-->0 ){.  
4f70: 20 20 20 20 61 73 73 65 72 74 28 20 4e 3c 32 20      assert( N<2 
4f80: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
4f90: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28  .db );.      if(
4fa0: 20 66 72 65 65 62 75 66 66 65 72 73 20 29 7b 0a   freebuffers ){.
4fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4fc0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
4fd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
4fe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4ff0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 45 78 74 65  beMemReleaseExte
5000: 72 6e 61 6c 28 70 29 3b 0a 20 20 20 20 20 20 7d  rnal(p);.      }
5010: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
5020: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
5030: 20 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    p++;.    }.   
5040: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
5050: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  d = malloc_faile
5060: 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66  d;.  }.}..#ifdef
5070: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
5080: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
5090: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
50a0: 52 65 6c 65 61 73 65 42 75 66 66 65 72 73 28 56  ReleaseBuffers(V
50b0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
50c0: 69 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 20 3d  i;.  int nFree =
50d0: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   0;.  assert( sq
50e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
50f0: 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
5100: 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69  ;.  for(ii=1; ii
5110: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29  <=p->nMem; ii++)
5120: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
5130: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a  = &p->aMem[ii];.
5140: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20      if( pMem->z 
5150: 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d  && pMem->flags&M
5160: 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20  EM_Dyn ){.      
5170: 61 73 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78  assert( !pMem->x
5180: 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46 72  Del );.      nFr
5190: 65 65 20 2b 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ee += sqlite3Mal
51a0: 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 7a 29  locSize(pMem->z)
51b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
51c0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
51d0: 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
51e0: 20 72 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d   return nFree;.}
51f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
5200: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
5210: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
5220: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
5230: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
5240: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
5250: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
5260: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
5270: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
5280: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
5290: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
52a0: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
52b0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
52c0: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
52d0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
52e0: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
52f0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
5300: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
5310: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
5320: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
5330: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
5340: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
5350: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
5360: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
5370: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
5380: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
5390: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
53a0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
53b0: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
53c0: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
53d0: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
53e0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f  N QUERY PLAN..*/
53f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
5400: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
5430: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
5440: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
5450: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
5460: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20  QLITE_OK;.  Mem 
5470: 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75  *pMem = p->pResu
5480: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
5490: 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [1];..  assert( 
54a0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
54b0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
54c0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
54d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
54e0: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
54f0: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
5500: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
5510: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5520: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
5530: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
5540: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5550: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
5560: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
5570: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
5580: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
5590: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
55a0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
55b0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
55c0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
55d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
55e0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
55f0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
5600: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
5610: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
5620: 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e  Array(pMem, p->n
5630: 4d 65 6d 2c 20 31 29 3b 0a 0a 20 20 64 6f 7b 0a  Mem, 1);..  do{.
5640: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b      i = p->pc++;
5650: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e  .  }while( i<p->
5660: 6e 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  nOp && p->explai
5670: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
5680: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
5690: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
56a0: 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70  =p->nOp ){.    p
56b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
56c0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
56d0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
56e0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
56f0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
5700: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
5710: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
5720: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
5730: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
5740: 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73  tring(&p->zErrMs
5750: 67 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  g, sqlite3ErrStr
5760: 28 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29  (p->rc), (char*)
5770: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
5780: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70   char *z;.    Op
5790: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
57a0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  i];.    if( p->e
57b0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
57c0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
57d0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
57e0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
57f0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5800: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
5810: 3b 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 20 20 20 20 20 20                  
5830: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
5840: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
5850: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
5860: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5870: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
5880: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
5890: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
58a0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
58b0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
58c0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
58d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
58e0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
58f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e  pMem->n = strlen
5900: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
5910: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5920: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
5930: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
5940: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
5950: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
5960: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5970: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5980: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
5990: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
59b0: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  1 */.    pMem->t
59c0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
59d0: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
59e0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
59f0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
5a00: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
5a10: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
5a40: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5a50: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
5a60: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
5a70: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
5a80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5a90: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
5aa0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
5ab0: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
5ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ad0: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20   /* P3 */.      
5ae0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5af0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5b00: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d     pMem++;.    }
5b10: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
5b20: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
5b30: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
5b40: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
5b50: 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61  .      p->db->ma
5b60: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
5b70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5b80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
5b90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5ba0: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
5bb0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
5bc0: 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70   z = displayP4(p
5bd0: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
5be0: 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65  ;.    if( z!=pMe
5bf0: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71  m->z ){.      sq
5c00: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
5c10: 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20  tr(pMem, z, -1, 
5c20: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
5c30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5c40: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
5c50: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
5c60: 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70  em->n = strlen(p
5c70: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
5c80: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
5c90: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
5ca0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5cb0: 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20  QLITE_TEXT;.    
5cc0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
5cd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
5ce0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
5cf0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
5d00: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20  Mem, 4, 0) ){.  
5d10: 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c        p->db->mal
5d20: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
5d30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
5d40: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5d50: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e    }.      pMem->
5d60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c  flags = MEM_Dyn|
5d70: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
5d80: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5d90: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
5da0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70  e3_snprintf(3, p
5db0: 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20  Mem->z, "%.2x", 
5dc0: 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50  pOp->p5);   /* P
5dd0: 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  5 */.      pMem-
5de0: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5df0: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
5e00: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5e10: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
5e20: 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.  .#ifdef SQLI
5e30: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
5e40: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  f( pOp->zComment
5e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
5e60: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
5e70: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5e80: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f      pMem->z = pO
5e90: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  p->zComment;.   
5ea0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
5eb0: 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  trlen(pMem->z);.
5ec0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e          pMem->en
5ed0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
5ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
5ef0: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
5f00: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5f10: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
5f40: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
5f50: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
5f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5f70: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
5f80: 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65  mn = 8 - 5*(p->e
5f90: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
5fa0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
5fb0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5fc0: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
5fd0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
5fe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5ff0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
6000: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
6020: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
6030: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
6040: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
6050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6060: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
6070: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
6080: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
6090: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
60a0: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
60b0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
60c0: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
60d0: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
60e0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
60f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6100: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
6110: 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63     while( isspac
6120: 65 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b  e(*(u8*)z) ) z++
6130: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51  ;.    printf("SQ
6140: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
6150: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69    }.}.#endif..#i
6160: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6170: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26  E_OMIT_TRACE) &&
6180: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6190: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a  ENABLE_IOTRACE).
61a0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49  /*.** Print an I
61b0: 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73  OTRACE message s
61c0: 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65  howing SQL conte
61d0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
61e0: 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71  te3VdbeIOTraceSq
61f0: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  l(Vdbe *p){.  in
6200: 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  t nOp = p->nOp;.
6210: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
6220: 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72   if( sqlite3IoTr
6230: 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ace==0 ) return;
6240: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
6250: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
6260: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
6270: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6280: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6290: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  4.z!=0 ){.    in
62a0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72  t i, j;.    char
62b0: 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71   z[1000];.    sq
62c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
62d0: 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73  izeof(z), z, "%s
62e0: 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20  ", pOp->p4.z);. 
62f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70     for(i=0; issp
6300: 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68  ace((unsigned ch
6310: 61 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ar)z[i]); i++){}
6320: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
6330: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
6340: 69 66 28 20 69 73 73 70 61 63 65 28 28 75 6e 73  if( isspace((uns
6350: 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29  igned char)z[i])
6360: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
6370: 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20  z[i-1]!=' ' ){. 
6380: 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20           z[j++] 
6390: 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d  = ' ';.        }
63a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
63b0: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a        z[j++] = z
63c0: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
63d0: 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b   }.    z[j] = 0;
63e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72  .    sqlite3IoTr
63f0: 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20  ace("SQL %s\n", 
6400: 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  z);.  }.}.#endif
6410: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
6420: 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45  _TRACE && SQLITE
6430: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
6440: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  */.../*.** Prepa
6450: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
6460: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
6470: 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  on.  This involv
6480: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
6490: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
64a0: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20  stack space and 
64b0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
64c0: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   program counter
64d0: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56  ..** After the V
64e0: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70  DBE has be prepp
64f0: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78  ed, it can be ex
6500: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72  ecuted by one or
6510: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74   more.** calls t
6520: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  o sqlite3VdbeExe
6530: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  c().  .**.** Thi
6540: 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  s is the only wa
6550: 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45  y to move a VDBE
6560: 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
6570: 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45  _INIT to.** VDBE
6580: 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76  _MAGIC_RUN..*/.v
6590: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
65a0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
65b0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
65d0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  e VDBE */.  int 
65e0: 6e 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20  nVar,           
65f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6600: 6d 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20  mber of '?' see 
6610: 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  in the SQL state
6620: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ment */.  int nM
6630: 65 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  em,             
6640: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6650: 65 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c  er of memory cel
6660: 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ls to allocate *
6670: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c  /.  int nCursor,
6680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6690: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
66a0: 63 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63  cursors to alloc
66b0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45  ate */.  int isE
66c0: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20  xplain          
66d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
66e0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b  if the EXPLAIN k
66f0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65  eywords is prese
6700: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  nt */.){.  int n
6710: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6720: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  = p->db;..  asse
6730: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
6740: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6750: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6760: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
6770: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
6780: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
6790: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
67a0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
67b0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
67c0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
67d0: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
67e0: 6e 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20  n later. This.  
67f0: 20 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68   * is because th
6800: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65  e call to resize
6810: 4f 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20  OpArray() below 
6820: 6d 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20  may shrink the. 
6830: 20 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72    * p->aOp[] arr
6840: 61 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72  ay to save memor
6850: 79 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e  y if called when
6860: 20 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   in VDBE_MAGIC_R
6870: 55 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a  UN .   * state..
6880: 20 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63     */.  p->magic
6890: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
68a0: 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  N;..  /* For eac
68b0: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
68c0: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
68d0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
68e0: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
68f0: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
6900: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
6910: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
6920: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
6930: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
6940: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
6950: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
6960: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
6970: 2a 2a 20 43 75 72 73 6f 72 2f 42 74 43 75 72 73  ** Cursor/BtCurs
6980: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
6990: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
69a0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
69b0: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
69c0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
69d0: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
69e0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
69f0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
6a00: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
6a10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
6a20: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
6a30: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
6a40: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
6a50: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
6a60: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
6a70: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
6a80: 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72  cation space for
6a90: 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f   registers..  */
6aa0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d  .  if( p->aMem==
6ab0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
6ac0: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
6ad0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
6ae0: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
6af0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
6b00: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
6b10: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
6b20: 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61      resizeOpArra
6b30: 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  y(p, p->nOp);.  
6b40: 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d    assert( nVar>=
6b50: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45  0 );.    if( isE
6b60: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
6b70: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  0 ){.      p->nM
6b80: 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  em = nMem = 10;.
6b90: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65      }.    p->aMe
6ba0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
6bb0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
6bc0: 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28      nMem*sizeof(
6bd0: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6be0: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
6bf0: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
6c00: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
6c10: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
6c20: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
6c30: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
6c40: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
6c50: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6c60: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6c80: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  ar */.      + nC
6c90: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
6ca0: 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20  sor*) + 1    /* 
6cb0: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
6cc0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
6cd0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6ce0: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
6cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
6d00: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
6d10: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70  .nMem */.      p
6d20: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
6d30: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
6d40: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
6d50: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56  1 */.      p->aV
6d60: 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d  ar = &p->aMem[nM
6d70: 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em+1];.      p->
6d80: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
6d90: 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b     p->okVar = 0;
6da0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
6db0: 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61  = (Mem**)&p->aVa
6dc0: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6dd0: 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a  ->azVar = (char*
6de0: 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67  *)&p->apArg[nArg
6df0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
6e00: 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70  r = (Cursor**)&p
6e10: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
6e20: 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20       p->nCursor 
6e30: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = nCursor;.     
6e40: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
6e50: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
6e60: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
6e70: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
6e80: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
6e90: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
6ea0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
6eb0: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
6ec0: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
6ed0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
6ee0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
6ef0: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
6f00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f10: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
6f20: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
6f30: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6f40: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
6f50: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
6f60: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
6f70: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
6f80: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6f90: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
6fa0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72   = 0;.  p->retur
6fb0: 6e 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  nDepth = 0;.  p-
6fc0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
6fd0: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78  E_Abort;.  p->ex
6fe0: 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61  plain |= isExpla
6ff0: 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  in;.  p->magic =
7000: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b   VDBE_MAGIC_RUN;
7010: 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  p->nChange = 
7020: 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72  0;.  p->cacheCtr
7030: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72   = 1;.  p->minWr
7040: 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20  iteFileFormat = 
7050: 32 35 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64  255;.  p->opened
7060: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23  Statement = 0;.#
7070: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
7080: 4c 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69  LE.  {.    int i
7090: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
70a0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
70b0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
70c0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  nt = 0;.      p-
70d0: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d  >aOp[i].cycles =
70e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   0;.    }.  }.#e
70f0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
7100: 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f  ose a VDBE curso
7110: 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  r and release al
7120: 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  l the resources 
7130: 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20  that cursor .** 
7140: 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e  happens to hold.
7150: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7160: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56  VdbeFreeCursor(V
7170: 64 62 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a  dbe *p, Cursor *
7180: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
7190: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
71a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
71b0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
71c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
71d0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
71e0: 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rsor);.  }.  if(
71f0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
7200: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
7210: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
7220: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7230: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7240: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
7250: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
7260: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
7270: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
7280: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
7290: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
72a0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
72b0: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
72c0: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
72d0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
72e0: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
72f0: 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64  e3SafetyOff(p->d
7300: 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d  b);.    pModule-
7310: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
7320: 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  sor);.    (void)
7330: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
7340: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
7350: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
7360: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
7370: 28 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65  ( !pCx->ephemPse
7380: 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  udoTable ){.    
7390: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78  sqlite3_free(pCx
73a0: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20  ->pData);.  }.  
73b0: 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20 73  memset(pCx, 0, s
73c0: 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29 3b 0a  izeof(Cursor));.
73d0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
73e0: 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 20 2a  e(pCx->aType); *
73f0: 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66  /.  /* sqlite3_f
7400: 72 65 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a 0a  ree(pCx); */.}..
7410: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
7420: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 66  cursors except f
7430: 6f 72 20 56 54 61 62 20 63 75 72 73 6f 72 73 20  or VTab cursors 
7440: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
7450: 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f  ly.** in use..*/
7460: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
7470: 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65  seAllCursorsExce
7480: 70 74 41 63 74 69 76 65 56 74 61 62 73 28 56 64  ptActiveVtabs(Vd
7490: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
74a0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d  .  if( p->apCsr=
74b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
74c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
74d0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
74e0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
74f0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66  apCsr[i];.    if
7500: 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56  ( pC && (!p->inV
7510: 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43  tabMethod || !pC
7520: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20 29  ->pVtabCursor) )
7530: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7540: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
7550: 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61   pC);.      p->a
7560: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
7570: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7580: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
7590: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
75a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
75b0: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
75c0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
75d0: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
75e0: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
75f0: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
7600: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
7610: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
7620: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
7630: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
7640: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
7650: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
7660: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72 65  Vdbe *p, int fre
7670: 65 62 75 66 66 65 72 73 29 7b 0a 20 20 69 6e 74  ebuffers){.  int
7680: 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75   i;.  closeAllCu
7690: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
76a0: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72  eVtabs(p);.  for
76b0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
76c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53  ; i++){.    MemS
76d0: 65 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61  etTypeFlag(&p->a
76e0: 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c  Mem[i], MEM_Null
76f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7700: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
7710: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 66  m[1], p->nMem, f
7720: 72 65 65 62 75 66 66 65 72 73 29 3b 0a 20 20 73  reebuffers);.  s
7730: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7740: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
7750: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
7760: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
7770: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
7780: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
7790: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
77a0: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
77b0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
77c0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
77d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
77e0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
77f0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
7800: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
7810: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
7820: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
7830: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
7840: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
7850: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
7860: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7870: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7880: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7890: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
78a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
78b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
78c0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
78d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
78e0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
78f0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
7900: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
7910: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7920: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7930: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7940: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7950: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7960: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7970: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
7980: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
7990: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
79a0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
79b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
79c0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
79d0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
79e0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
79f0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
7a00: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
7a10: 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20  COLNAME_N, 1);. 
7a20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
7a30: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
7a40: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
7a50: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
7a60: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
7a70: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
7a80: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
7a90: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
7aa0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62  MallocZero(p->db
7ab0: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
7ac0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
7ad0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
7ae0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
7af0: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
7b00: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
7b10: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
7b20: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
7b30: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
7b40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
7b50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7b60: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
7b70: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
7b80: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7b90: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
7ba0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
7bb0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
7bc0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
7bd0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
7be0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
7bf0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7c00: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
7c10: 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f  .**.** If N==P4_
7c20: 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73  STATIC  it means
7c30: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61   that zName is a
7c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f   pointer to a co
7c50: 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a  nstant static.**
7c60: 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63   string and we c
7c70: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
7c80: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
7c90: 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74  is P4_DYNAMIC, t
7ca0: 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69  hen .** the stri
7cb0: 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e  ng is freed usin
7cc0: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
7cd0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
7ce0: 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a  s finished with.
7cf0: 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ** it. Otherwise
7d00: 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61  , N bytes of zNa
7d10: 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a  me are copied..*
7d20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7d30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65  eSetColName(Vdbe
7d40: 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
7d50: 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61  t var, const cha
7d60: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29  r *zName, int N)
7d70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7d80: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
7d90: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
7da0: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
7db0: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
7dc0: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
7dd0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7de0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7df0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74  _NOMEM;.  assert
7e00: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
7e10: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
7e20: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
7e30: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
7e40: 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d  lumn]);.  if( N=
7e50: 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e  =P4_DYNAMIC || N
7e60: 3d 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20  ==P4_STATIC ){. 
7e70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
7e80: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
7e90: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
7ea0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
7eb0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7ec0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7ee0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
7ef0: 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45  zName, N, SQLITE
7f00: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
7f10: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69  NSIENT);.  }.  i
7f20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7f30: 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49   && N==P4_DYNAMI
7f40: 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  C ){.    pColNam
7f50: 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28 7e 4d 45  e->flags &= (~ME
7f60: 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 70  M_Static);.    p
7f70: 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c 6c 6f 63  ColName->zMalloc
7f80: 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 3b 0a   = pColName->z;.
7f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
7fb0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
7fc0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
7fd0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
7fe0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
7ff0: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
8000: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
8010: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
8020: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
8030: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
8040: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
8050: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
8060: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
8070: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
8080: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
8090: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
80a0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
80b0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
80c0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
80d0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
80e0: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
80f0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
8100: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
8110: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
8120: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
8130: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
8140: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
8150: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
8160: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
8170: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
8180: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
8190: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
81a0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
81b0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
81c0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
81d0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
81e0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
81f0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
8200: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8210: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
8220: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
8230: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
8240: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
8250: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
8260: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
8270: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
8280: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
8290: 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20  (db, rc);.  if( 
82a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
82b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
82c0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
82d0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
82e0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
82f0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
8300: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
8310: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
8320: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
8330: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
8340: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
8350: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
8360: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
8370: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
8380: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
8390: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
83a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
83b0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
83c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
83d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
83e0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
83f0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
8400: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
8410: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
8420: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8430: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8440: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8450: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
8460: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
8470: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
8480: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
8490: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
84a0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
84b0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
84c0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
84d0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
84e0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
84f0: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
8500: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
8510: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
8520: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
8530: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
8540: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
8550: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8560: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8570: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
8580: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
8590: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
85a0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
85b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
85c0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
85d0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
85e0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
85f0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
8600: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
8610: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
8620: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
8630: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
8640: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
8650: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
8660: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
8670: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
8680: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
8690: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
86a0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
86b0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
86c0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
86d0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
86e0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
86f0: 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 61 74 20  mory:.  In that 
8700: 63 61 73 65 20 77 65 20 64 6f 0a 20 20 2a 2a 20  case we do.  ** 
8710: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
8720: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
8730: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
8740: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68  e simple case th
8750: 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a 20 20 2a  en.  ** too..  *
8760: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c 65  /.  if( 0==strle
8770: 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n(sqlite3BtreeGe
8780: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
8790: 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e 54  b[0].pBt)) || nT
87a0: 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66  rans<=1 ){.    f
87b0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
87c0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
87d0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
87e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
87f0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8800: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
8810: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8820: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
8830: 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a  aseOne(pBt, 0);.
8840: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8850: 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
8860: 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20  mit only if all 
8870: 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73  databases succes
8880: 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20  sfully complete 
8890: 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a  phase 1. .    **
88a0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42   If one of the B
88b0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
88c0: 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73  ne() calls fails
88d0: 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73  , this indicates
88e0: 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72   an.    ** IO er
88f0: 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69  ror while deleti
8900: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
8910: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
8920: 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c   It is unlikely,
8930: 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c  .    ** but coul
8940: 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69  d happen. In thi
8950: 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70  s case abandon p
8960: 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65  rocessing and re
8970: 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a  turn the error..
8980: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
8990: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
89a0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
89b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
89c0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
89d0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
89e0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
89f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
8a00: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
8a10: 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a  o(pBt);.      }.
8a20: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
8a30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
8a50: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
8a60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
8a70: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
8a80: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
8a90: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
8aa0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
8ab0: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
8ac0: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
8ad0: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
8ae0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
8af0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
8b00: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20  ted atomicly..  
8b10: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8b20: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
8b30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8b40: 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
8b50: 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
8b60: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
8b70: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
8b80: 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e  = 0;   /* File-n
8b90: 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74  ame for the mast
8ba0: 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er journal */.  
8bb0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d    char const *zM
8bc0: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
8bd0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8be0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
8bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
8c00: 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30  ile *pMaster = 0
8c10: 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
8c20: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   = 0;..    /* Se
8c30: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
8c40: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
8c50: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
8c60: 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20    u32 random;.  
8c70: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
8c80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (zMaster);.     
8c90: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
8ca0: 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f  ess(sizeof(rando
8cb0: 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20  m), &random);.  
8cc0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
8cd0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
8ce0: 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d   "%s-mj%08X", zM
8cf0: 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26  ainFile, random&
8d00: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
8d10: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
8d30: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
8d40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
8d50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
8d60: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
8d70: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
8d80: 45 58 49 53 54 53 29 3b 0a 20 20 20 20 7d 77 68  EXISTS);.    }wh
8d90: 69 6c 65 28 20 72 63 3d 3d 31 20 29 3b 0a 20 20  ile( rc==1 );.  
8da0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
8db0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
8dc0: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
8dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
8de0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
8df0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
8e00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8e10: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
8e20: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
8e30: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
8e40: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
8e50: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
8e60: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
8e70: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
8e80: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
8e90: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
8ea0: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
8eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
8ec0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
8ee0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
8ef0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8f00: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
8f10: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
8f20: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
8f30: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
8f40: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
8f50: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
8f60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
8f70: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8f80: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
8f90: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
8fa0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
8fb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
8fc0: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
8fd0: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
8fe0: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
8ff0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
9000: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9010: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
9020: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
9030: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
9040: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
9050: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
9060: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
9070: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9080: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9090: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
90a0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  t;.      if( i==
90b0: 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20  1 ) continue;   
90c0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45  /* Ignore the TE
90d0: 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
90e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
90f0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
9100: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
9110: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
9120: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
9130: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
9140: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
9150: 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f  zFile[0]==0 ) co
9160: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
9170: 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61  re :memory: data
9180: 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20  bases */.       
9190: 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26   if( !needSync &
91a0: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 53  & !sqlite3BtreeS
91b0: 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 29  yncDisabled(pBt)
91c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
91d0: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
91e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
91f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9200: 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65  e(pMaster, zFile
9210: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  , strlen(zFile)+
9220: 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
9230: 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74      offset += st
9240: 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  rlen(zFile)+1;. 
9250: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9260: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
9280: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
9290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
92a0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
92b0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
92c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
92d0: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
92e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
92f0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
9300: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
9310: 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d     /* Sync the m
9320: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9330: 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50  le. If the IOCAP
9340: 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69  _SEQUENTIAL devi
9350: 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69  ce.    ** flag i
9360: 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f  s set this is no
9370: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
9380: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65  */.    zMainFile
9390: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
93a0: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44  etDirname(db->aD
93b0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69  b[0].pBt);.    i
93c0: 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20 20  f( (needSync .  
93d0: 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69 74     && (0==(sqlit
93e0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
93f0: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
9400: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
9410: 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20 20  SEQUENTIAL)).   
9420: 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65 33    && (rc=sqlite3
9430: 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
9440: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
9450: 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  AL))!=SQLITE_OK)
9460: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9470: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9480: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
9490: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
94a0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
94b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
94c0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
94d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
94e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
94f0: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
9500: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
9510: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
9520: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
9530: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
9540: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
9550: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
9560: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
9570: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
9580: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
9590: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
95a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
95b0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
95c0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
95d0: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
95e0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
95f0: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
9600: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9610: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
9620: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
9630: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
9640: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9650: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
9660: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
9670: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
9680: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
9690: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
96a0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
96b0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
96c0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
96d0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
96e0: 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20 20  lure occured..  
96f0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
9700: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
9710: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
9720: 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
9730: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
9740: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
9750: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
9760: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
9770: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9780: 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  (pBt, zMaster);.
9790: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
97a0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
97b0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
97c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
97d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
97e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
97f0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9800: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9810: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
9820: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9830: 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
9840: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9850: 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
9860: 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
9870: 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
9880: 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
9890: 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
98a0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
98b0: 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
98c0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
98d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
98e0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
98f0: 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
9900: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
9910: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
9920: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
9930: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9940: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9950: 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
9960: 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
9970: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
9980: 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
9990: 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
99a0: 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
99b0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
99c0: 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
99d0: 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
99e0: 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
99f0: 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
9a00: 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
9a10: 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
9a20: 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
9a30: 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
9a40: 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
9a50: 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
9a60: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
9a70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
9a80: 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
9a90: 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
9aa0: 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
9ab0: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
9ac0: 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
9ad0: 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
9ae0: 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
9af0: 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
9b00: 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
9b10: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
9b20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
9b30: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
9b40: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9b50: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9b60: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9b70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
9b80: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9b90: 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20  haseTwo(pBt);.  
9ba0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9bb0: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
9bc0: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
9bd0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
9be0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
9bf0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
9c00: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
9c10: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9c20: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
9c30: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
9c40: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
9c50: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
9c60: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
9c70: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
9c80: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
9c90: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
9ca0: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
9cb0: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
9cc0: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
9cd0: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
9ce0: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
9cf0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
9d00: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
9d10: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
9d20: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
9d30: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
9d40: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
9d50: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
9d60: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
9d70: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
9d80: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
9d90: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
9da0: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
9db0: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
9dc0: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
9dd0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
9de0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
9df0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
9e00: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
9e10: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
9e20: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
9e30: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
9e40: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
9e50: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
9e60: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
9e70: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
9e80: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
9e90: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
9ea0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
9eb0: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
9ec0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
9ed0: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
9ee0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
9ef0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
9f00: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
9f10: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
9f20: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
9f30: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
9f40: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
9f50: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
9f60: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
9f70: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
9f80: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
9f90: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
9fa0: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
9fb0: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
9fc0: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
9fd0: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
9fe0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
9ff0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
a000: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
a010: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
a020: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
a030: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
a040: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
a050: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
a060: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
a070: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
a080: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
a090: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
a0a0: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
a0b0: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
a0c0: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
a0d0: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
a0e0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
a0f0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
a100: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
a110: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
a120: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
a130: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
a140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
a150: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
a160: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
a170: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
a180: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a190: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a1a0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a1b0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a1c0: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
a1d0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a1e0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
a1f0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
a200: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
a210: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
a220: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a230: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a240: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
a250: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
a260: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
a270: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
a280: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
a290: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
a2a0: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
a2b0: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
a2c0: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
a2d0: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
a2e0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
a2f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a300: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
a310: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
a320: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
a330: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
a340: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
a350: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
a360: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
a370: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
a380: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
a390: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
a3a0: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
a3b0: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
a3c0: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
a3d0: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
a3e0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
a3f0: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
a400: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
a410: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
a420: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
a430: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
a440: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
a450: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
a460: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
a470: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
a480: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
a490: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
a4a0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
a4b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a4c0: 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a  (*xFunc)(Btree *
a4d0: 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75  pBt) = 0;  /* Fu
a4e0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f  nction to call o
a4f0: 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63  n each btree bac
a500: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  kend */.  int is
a510: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
a520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
a530: 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54  to true if SQLIT
a540: 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52  E_NOMEM or IOERR
a550: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
a560: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
a570: 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
a580: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
a590: 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
a5a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
a5b0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
a5c0: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
a5d0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
a5e0: 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
a5f0: 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
a600: 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
a610: 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
a620: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
a630: 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
a640: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a650: 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
a660: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
a670: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
a680: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
a690: 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
a6a0: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
a6b0: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
a6c0: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
a6d0: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
a6e0: 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
a6f0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a700: 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
a710: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
a720: 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
a730: 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
a740: 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
a750: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
a760: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
a770: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
a780: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
a790: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a7a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
a7b0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  OMEM;.  }.  clos
a7c0: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
a7d0: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
a7e0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
a7f0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
a800: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a810: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
a820: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
a830: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
a840: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
a850: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
a860: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
a870: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
a880: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
a890: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
a8a0: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
a8b0: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a   from p->rc */..
a8c0: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
a8d0: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
a8e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
a8f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a900: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
a910: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20  &p->aMutex);..  
a920: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
a930: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
a940: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
a950: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
a960: 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
a970: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
a980: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
a990: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9b0: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
a9c0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
a9d0: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
a9e0: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
a9f0: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
aa00: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
aa10: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
aa20: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
aa30: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
aa40: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
aa50: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
aa60: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
aa70: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
aa80: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
aa90: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
aaa0: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
aab0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
aac0: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
aad0: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
aae0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
aaf0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ab00: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
ab10: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
ab20: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
ab30: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
ab40: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
ab50: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
ab60: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
ab70: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
ab80: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
ab90: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
aba0: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
abb0: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
abc0: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
abd0: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
abe0: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
abf0: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
ac00: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
ac10: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
ac20: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
ac30: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
ac40: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
ac50: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
ac60: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
ac70: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
ac80: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
ac90: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
aca0: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
acb0: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
acc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
acd0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
ace0: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
acf0: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
ad00: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
ad10: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
ad20: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
ad30: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
ad40: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
ad50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
ad60: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
ad70: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
ad80: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
ad90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ada0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
adb0: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
adc0: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
add0: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
ade0: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
adf0: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
ae00: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
ae10: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
ae20: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
ae30: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
ae40: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
ae50: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
ae60: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
ae70: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
ae80: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
ae90: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
aea0: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
aeb0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
aec0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
aed0: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
aee0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
aef0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
af00: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
af10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
af20: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
af30: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
af40: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
af50: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
af60: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
af70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
af80: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
af90: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
afa0: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
afb0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
afc0: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
afd0: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
afe0: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
aff0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
b000: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
b010: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
b020: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
b030: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b040: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b050: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b060: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
b070: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
b080: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
b090: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b0b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
b0c0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
b0d0: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
b0e0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
b0f0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
b100: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
b110: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
b120: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
b130: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
b140: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
b150: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
b160: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
b170: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
b180: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
b190: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
b1a0: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
b1b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
b1c0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
b1d0: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b1e0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
b1f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b200: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
b210: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
b220: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
b230: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
b240: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
b250: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
b260: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
b270: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
b280: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
b290: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
b2a0: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
b2b0: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
b2c0: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
b2d0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
b2e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
b2f0: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
b300: 74 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69  t(db);.        i
b310: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
b320: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
b330: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b340: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
b350: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
b360: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b370: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
b380: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
b390: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b3a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b3b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3c0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b3d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b3f0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
b400: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
b410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b420: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
b430: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
b440: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
b450: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
b460: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
b470: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b480: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
b490: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
b4a0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
b4b0: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
b4c0: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
b4d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
b4e0: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
b4f0: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
b500: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
b510: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
b520: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b530: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b540: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
b550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
b560: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b570: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b580: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
b590: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
b5a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
b5b0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
b5c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b5d0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75    .    /* If xFu
b5e0: 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nc is not NULL, 
b5f0: 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f  then it is one o
b600: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  f sqlite3BtreeRo
b610: 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20  llbackStmt or.  
b620: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
b630: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c  eCommitStmt. Cal
b640: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63  l it once on eac
b650: 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e  h backend. If an
b660: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
b670: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74    ** and the ret
b680: 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c  urn code is stil
b690: 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74  l SQLITE_OK, set
b6a0: 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
b6b0: 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20   to the new.    
b6c0: 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a  ** error value..
b6d0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
b6e0: 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20  t(!xFunc ||.    
b6f0: 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33    xFunc==sqlite3
b700: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20  BtreeCommitStmt 
b710: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
b720: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b730: 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a  backStmt.    );.
b740: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75      for(i=0; xFu
b750: 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  nc && i<db->nDb;
b760: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
b770: 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65  t rc;.      Btre
b780: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
b790: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
b7a0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
b7b0: 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74    rc = xFunc(pBt
b7c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
b7d0: 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  c && (p->rc==SQL
b7e0: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
b7f0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
b800: 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NT) ){.         
b810: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
b820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
b830: 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
b840: 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Msg, 0);.       
b850: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
b860: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
b870: 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
b880: 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
b890: 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  TE and the state
b8a0: 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74  ment was committ
b8b0: 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ed, .    ** set 
b8c0: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
b8d0: 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
b8e0: 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
b8f0: 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  On && p->pc>=0 )
b900: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75  {.      if( !xFu
b910: 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c  nc || xFunc==sql
b920: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
b930: 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  tmt ){.        s
b940: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
b950: 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
b960: 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
b970: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b980: 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
b990: 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
b9a0: 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
b9b0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a  e = 0;.    }.  .
b9c0: 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
b9d0: 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63  or commit any sc
b9e0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61  hema changes tha
b9f0: 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20  t occurred. */. 
ba00: 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51     if( p->rc!=SQ
ba10: 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66  LITE_OK && db->f
ba20: 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65  lags&SQLITE_Inte
ba30: 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20  rnChanges ){.   
ba40: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49     sqlite3ResetI
ba50: 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62  nternalSchema(db
ba60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  , 0);.      db->
ba70: 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61  flags = (db->fla
ba80: 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs | SQLITE_Inte
ba90: 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20  rnChanges);.    
baa0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
bab0: 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
bac0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
bad0: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
bae0: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a  p->aMutex);.  }.
baf0: 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
bb00: 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
bb10: 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
bb20: 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
bb30: 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
bb40: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
bb50: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
bb60: 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt--;.  }.  p->m
bb70: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
bb80: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
bb90: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
bba0: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
bbb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
bbc0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
bbd0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63  E_NOMEM;.  }.  c
bbe0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
bbf0: 74 28 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e  t(db);..  return
bc00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
bc10: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
bc20: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
bc30: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
bc40: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
bc50: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
bc60: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
bc70: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
bc80: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
bc90: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
bca0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
bcb0: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
bcc0: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
bcd0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bce0: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
bcf0: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
bd00: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
bd10: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
bd20: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
bd30: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
bd40: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
bd50: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
bd60: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
bd70: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
bd80: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
bd90: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
bda0: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
bdb0: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
bdc0: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
bdd0: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
bde0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
bdf0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
be00: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
be10: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
be20: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
be30: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
be40: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
be50: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
be60: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
be70: 65 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  et(Vdbe *p, int 
be80: 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a 20 20  freebuffers){.  
be90: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
bea0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
beb0: 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
bec0: 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
bed0: 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
bee0: 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
bef0: 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
bf00: 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
bf10: 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
bf20: 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
bf30: 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
bf40: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
bf50: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
bf60: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
bf70: 70 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69  p);.  (void)sqli
bf80: 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29  te3SafetyOff(db)
bf90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
bfa0: 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65  DBE has be run e
bfb0: 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74  ven partially, t
bfc0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
bfd0: 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
bfe0: 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61   and error messa
bff0: 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45  ge from the VDBE
c000: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64   into the main d
c010: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
c020: 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20  e.  But.  ** if 
c030: 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73  the VDBE has jus
c040: 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75  t been set to ru
c050: 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63  n but has not ac
c060: 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20  tually executed 
c070: 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63  any.  ** instruc
c080: 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65  tions yet, leave
c090: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c0a0: 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61  se error informa
c0b0: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a  tion unchanged..
c0c0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63    */.  if( p->pc
c0d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  >=0 ){.    if( p
c0e0: 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
c0f0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
c100: 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d  etStr(db->pErr,-
c110: 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c  1,p->zErrMsg,SQL
c120: 49 54 45 5f 55 54 46 38 2c 73 71 6c 69 74 65 33  ITE_UTF8,sqlite3
c130: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 64 62  _free);.      db
c140: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
c150: 63 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  c;.      p->zErr
c160: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
c170: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
c180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c190: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
c1a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c1b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
c1c0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
c1d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c1e0: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
c1f0: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
c200: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
c210: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
c220: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
c230: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
c240: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
c250: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
c260: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
c270: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
c280: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
c290: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
c2a0: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
c2b0: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
c2c0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
c2d0: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
c2e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c2f0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c300: 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
c310: 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
c320: 46 38 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  F8, sqlite3_free
c330: 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
c340: 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
c350: 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
c360: 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
c370: 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
c380: 6e 75 70 28 70 2c 20 66 72 65 65 62 75 66 66 65  nup(p, freebuffe
c390: 72 73 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  rs);..  /* Save 
c3a0: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
c3b0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
c3c0: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
c3d0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
c3e0: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
c3f0: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
c400: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
c410: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
c420: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
c430: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
c440: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
c450: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c460: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
c470: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
c480: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
c490: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
c4a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
c4b0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
c4c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c4d0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
c4e0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
c4f0: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
c500: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
c510: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
c520: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
c530: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
c540: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c550: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
c560: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
c570: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
c580: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
c5a0: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
c5b0: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
c5c0: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
c5d0: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
c5e0: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
c5f0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c600: 49 4e 49 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74  INIT;.  p->abort
c610: 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ed = 0;.  return
c620: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
c630: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
c640: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
c650: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
c660: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
c670: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
c680: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
c690: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
c6a0: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
c6b0: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
c6c0: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
c6d0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
c6e0: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
c6f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c700: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
c710: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
c720: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
c730: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
c740: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c750: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 2c  ite3VdbeReset(p,
c760: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
c770: 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
c780: 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
c790: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6d 61 67  }else if( p->mag
c7a0: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic!=VDBE_MAGIC_I
c7b0: 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  NIT ){.    retur
c7c0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
c7d0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
c7e0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
c7f0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 31 29 3b  1], p->nMem, 1);
c800: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
c810: 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
c820: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c830: 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74  all the destruct
c840: 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64  or for each auxd
c850: 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64  ata entry in pVd
c860: 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68  beFunc for which
c870: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
c880: 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73  nding bit in mas
c890: 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78  k is clear.  Aux
c8a0: 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79  data entries bey
c8b0: 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c  ond 31.** are al
c8c0: 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20  ways destroyed. 
c8d0: 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20   To destroy all 
c8e0: 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c  auxdata entries,
c8f0: 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f   call this.** ro
c900: 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d  utine with mask=
c910: 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  =0..*/.void sqli
c920: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
c930: 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70  Data(VdbeFunc *p
c940: 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61  VdbeFunc, int ma
c950: 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sk){.  int i;.  
c960: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65  for(i=0; i<pVdbe
c970: 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29  Func->nAux; i++)
c980: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78  {.    struct Aux
c990: 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56  Data *pAux = &pV
c9a0: 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69  dbeFunc->apAux[i
c9b0: 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31  ];.    if( (i>31
c9c0: 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69   || !(mask&(1<<i
c9d0: 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75  ))) && pAux->pAu
c9e0: 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  x ){.      if( p
c9f0: 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
ca00: 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
ca10: 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
ca20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ca30: 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b   pAux->pAux = 0;
ca40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ca50: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
ca60: 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f  tire VDBE..*/.vo
ca70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
ca80: 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lete(Vdbe *p){. 
ca90: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
caa0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 43  =0 ) return;.  C
cab0: 6c 65 61 6e 75 70 28 70 2c 20 31 29 3b 0a 20 20  leanup(p, 1);.  
cac0: 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
cad0: 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
cae0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
caf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
cb00: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62  ert( p->db->pVdb
cb10: 65 3d 3d 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64  e==p );.    p->d
cb20: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
cb30: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
cb40: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
cb50: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
cb60: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
cb70: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
cb80: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e     Op *pOp = p->
cb90: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
cba0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c  ; i<p->nOp; i++,
cbb0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
cbc0: 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79 70  reeP4(pOp->p4typ
cbd0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
cbe0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
cbf0: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
cc00: 5f 66 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d  _free(pOp->zComm
cc10: 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20  ent);.#endif    
cc20: 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69   .    }.    sqli
cc30: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29  te3_free(p->aOp)
cc40: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
cc50: 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
cc60: 20 70 2d 3e 6e 56 61 72 2c 20 31 29 3b 0a 20 20   p->nVar, 1);.  
cc70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
cc80: 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70  aLabel);.  if( p
cc90: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  ->aMem ){.    sq
cca0: 6c 69 74 65 33 5f 66 72 65 65 28 26 70 2d 3e 61  lite3_free(&p->a
ccb0: 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72  Mem[1]);.  }.  r
ccc0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
ccd0: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
cce0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
ccf0: 45 5f 4e 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  E_N, 1);.  sqlit
cd00: 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e  e3_free(p->aColN
cd10: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
cd20: 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20  free(p->zSql);. 
cd30: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
cd40: 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73  _MAGIC_DEAD;.  s
cd50: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
cd60: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  }../*.** If a Mo
cd70: 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
cd80: 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
cd90: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
cda0: 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
cdb0: 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75  oveTo now.  Retu
cdc0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
cdd0: 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20  .  If no MoveTo 
cde0: 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73  is pending, this
cdf0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  .** routine does
ce00: 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74   nothing and ret
ce10: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
ce20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ce30: 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43  beCursorMoveto(C
ce40: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28  ursor *p){.  if(
ce50: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
ce60: 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  to ){.    int re
ce70: 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  s, rc;.#ifdef SQ
ce80: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78  LITE_TEST.    ex
ce90: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
cea0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
ceb0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
cec0: 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
ced0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cee0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70  BtreeMoveto(p->p
cef0: 43 75 72 73 6f 72 2c 20 30 2c 20 30 2c 20 70 2d  Cursor, 0, 0, p-
cf00: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
cf10: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
cf20: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
cf30: 0a 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65  .    *p->pIncrKe
cf40: 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61  y = 0;.    p->la
cf50: 73 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49  stRowid = keyToI
cf60: 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  nt(p->movetoTarg
cf70: 65 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69  et);.    p->rowi
cf80: 64 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d  dIsValid = res==
cf90: 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30  0;.    if( res<0
cfa0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
cfb0: 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
cfc0: 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73  p->pCursor, &res
cfd0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
cfe0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cff0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
d000: 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65  _TEST.    sqlite
d010: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
d020: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e  ;.#endif.    p->
d030: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
d040: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65   0;.    p->cache
d050: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
d060: 54 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  TALE;.  }.  retu
d070: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d080: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d090: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
d0a0: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
d0b0: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
d0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d0d0: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
d0e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d0f0: 52 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Read().** sqlite
d100: 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
d110: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d120: 65 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a  erialWrite().**.
d130: 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74  ** encapsulate t
d140: 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72  he code that ser
d150: 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66  ializes values f
d160: 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51  or storage in SQ
d170: 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64  Lite.** data and
d180: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20   index records. 
d190: 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20  Each serialized 
d1a0: 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f  value consists o
d1b0: 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74  f a.** 'serial-t
d1c0: 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20  ype' and a blob 
d1d0: 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72  of data. The ser
d1e0: 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38  ial type is an 8
d1f0: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a  -byte unsigned.*
d200: 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65  * integer, store
d210: 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  d as a varint..*
d220: 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74  *.** In an SQLit
d230: 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20  e index record, 
d240: 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  the serial type 
d250: 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74  is stored direct
d260: 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ly before.** the
d270: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68   blob of data th
d280: 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  at it correspond
d290: 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65  s to. In a table
d2a0: 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72   record, all ser
d2b0: 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65  ial.** types are
d2c0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
d2d0: 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f  tart of the reco
d2e0: 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62  rd, and the blob
d2f0: 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20  s of data at.** 
d300: 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74  the end. Hence t
d310: 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hese functions a
d320: 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20  llow the caller 
d330: 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a  to handle the.**
d340: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64   serial-type and
d350: 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72   data blob seper
d360: 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ately..**.** The
d370: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
d380: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76   describes the v
d390: 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63  arious storage c
d3a0: 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a  lasses for data:
d3b0: 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20  .**.**   serial 
d3c0: 74 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65  type        byte
d3d0: 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74  s of data      t
d3e0: 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ype.**   -------
d3f0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
d400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d  -----------    -
d410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
d420: 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20  *      0        
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
d440: 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a            NULL.*
d450: 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20  *      1        
d460: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
d470: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d480: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d490: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
d4a0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
d4b0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d4c0: 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20  er.**      3    
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69   3            si
d4f0: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d500: 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
d510: 20 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20             4    
d520: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d530: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35  nteger.**      5
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
d560: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
d570: 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20  .**      6      
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
d590: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
d5a0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
d5b0: 20 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20     7            
d5c0: 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
d5d0: 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74        IEEE float
d5e0: 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20  .**      8      
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d600: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
d610: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a  ger constant 0.*
d620: 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20  *      9        
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
d640: 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
d650: 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20  r constant 1.** 
d660: 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20      10,11       
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
d690: 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a   for expansion.*
d6a0: 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65  *    N>=12 and e
d6b0: 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29  ven       (N-12)
d6c0: 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a  /2        BLOB.*
d6d0: 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f  *    N>=13 and o
d6e0: 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29  dd        (N-13)
d6f0: 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a  /2        text.*
d700: 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39  *.** The 8 and 9
d710: 20 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65   types were adde
d720: 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65  d in 3.3.0, file
d730: 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f   format 4.  Prio
d740: 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66  r versions.** of
d750: 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74   SQLite will not
d760: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73   understand thos
d770: 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a  e serial types..
d780: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
d790: 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65   the serial-type
d7a0: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
d7b0: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a  tored in pMem..*
d7c0: 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
d7d0: 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20  eSerialType(Mem 
d7e0: 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f  *pMem, int file_
d7f0: 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66  format){.  int f
d800: 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
d810: 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  gs;.  int n;..  
d820: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  if( flags&MEM_Nu
d830: 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
d840: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   0;.  }.  if( fl
d850: 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  ags&MEM_Int ){. 
d860: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
d870: 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20   whether to use 
d880: 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20  1, 2, 4, 6 or 8 
d890: 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65  bytes. */.#   de
d8a0: 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28  fine MAX_6BYTE (
d8b0: 28 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30  (((i64)0x0000100
d8c0: 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69  0)<<32)-1).    i
d8d0: 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69  64 i = pMem->u.i
d8e0: 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20  ;.    u64 u;.   
d8f0: 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74   if( file_format
d900: 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20  >=4 && (i&1)==i 
d910: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d920: 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  8+i;.    }.    u
d930: 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b   = i<0 ? -i : i;
d940: 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
d950: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
d960: 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72  if( u<=32767 ) r
d970: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28  eturn 2;.    if(
d980: 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65   u<=8388607 ) re
d990: 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20  turn 3;.    if( 
d9a0: 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20  u<=2147483647 ) 
d9b0: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66  return 4;.    if
d9c0: 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
d9d0: 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72   return 5;.    r
d9e0: 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
d9f0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
da00: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
da10: 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
da20: 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
da30: 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e  MEM_Blob) );.  n
da40: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66   = pMem->n;.  if
da50: 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
da60: 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
da70: 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20  Mem->u.i;.  }.  
da80: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
da90: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
daa0: 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
dab0: 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
dac0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
dad0: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
dae0: 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
daf0: 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
db00: 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
db10: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
db20: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
db30: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
db40: 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
db50: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
db60: 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
db70: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
db80: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
db90: 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
dba0: 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
dbb0: 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
dbc0: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
dbd0: 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
dbe0: 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
dbf0: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
dc00: 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
dc10: 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
dc20: 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
dc30: 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
dc40: 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
dc50: 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
dc60: 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
dc70: 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
dc80: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
dc90: 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
dca0: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
dcb0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
dcc0: 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
dcd0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
dce0: 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
dcf0: 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
dd00: 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
dd10: 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
dd20: 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
dd30: 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
dd40: 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
dd50: 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
dd60: 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
dd70: 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
dd80: 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
dd90: 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
dda0: 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
ddb0: 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
ddc0: 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
ddd0: 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
dde0: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
ddf0: 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
de00: 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
de10: 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
de20: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
de30: 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
de40: 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
de50: 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
de60: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
de70: 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
de80: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
de90: 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
dea0: 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
deb0: 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
dec0: 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
ded0: 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
dee0: 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
def0: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
df00: 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
df10: 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
df20: 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
df30: 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
df40: 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
df50: 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
df60: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
df70: 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
df80: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
df90: 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
dfa0: 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
dfb0: 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
dfc0: 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
dfd0: 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
dfe0: 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
dff0: 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
e000: 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
e010: 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
e020: 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
e030: 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
e040: 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
e050: 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
e060: 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
e070: 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
e080: 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
e090: 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
e0a0: 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
e0b0: 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
e0c0: 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
e0d0: 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
e0e0: 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
e0f0: 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
e100: 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
e110: 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
e120: 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
e130: 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
e140: 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
e150: 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
e160: 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
e170: 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
e180: 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
e190: 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
e1a0: 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
e1b0: 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
e1c0: 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
e1d0: 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
e1e0: 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
e1f0: 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
e200: 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
e210: 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
e220: 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
e230: 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
e240: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
e250: 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
e260: 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
e270: 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
e280: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
e290: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
e2a0: 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
e2b0: 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
e2c0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
e2d0: 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
e2e0: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
e2f0: 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
e300: 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
e310: 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
e320: 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
e330: 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
e340: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
e350: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
e360: 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
e370: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
e380: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
e390: 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
e3a0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
e3b0: 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
e3c0: 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
e3d0: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
e3e0: 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
e3f0: 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
e400: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
e410: 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
e420: 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
e430: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e440: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
e450: 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
e460: 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
e470: 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
e480: 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
e490: 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
e4a0: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
e4b0: 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
e4c0: 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
e4d0: 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
e4e0: 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
e4f0: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
e500: 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
e510: 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
e520: 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
e530: 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
e540: 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
e550: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
e560: 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
e570: 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
e580: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
e590: 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
e5a0: 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
e5b0: 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
e5c0: 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
e5d0: 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
e5e0: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
e5f0: 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
e600: 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
e610: 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
e620: 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
e630: 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
e640: 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
e650: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
e660: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
e670: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
e680: 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
e690: 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
e6a0: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
e6b0: 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
e6c0: 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
e6d0: 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
e6e0: 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
e6f0: 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
e700: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
e710: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
e720: 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
e730: 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
e740: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
e750: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
e760: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
e770: 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
e780: 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e  le_format);.  in
e790: 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  t len;..  /* Int
e7a0: 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
e7b0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
e7c0: 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
e7d0: 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
e7e0: 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
e7f0: 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
e800: 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
e810: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
e820: 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
e830: 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
e840: 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
e850: 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
e860: 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
e870: 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
e880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
e890: 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
e8a0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
e8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e8c0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
e8d0: 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
e8e0: 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a  t( len<=nBuf );.
e8f0: 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
e900: 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
e910: 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20   (v&0xFF);.     
e920: 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a   v >>= 8;.    }.
e930: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
e940: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
e950: 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
e960: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
e970: 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
e980: 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
e990: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
e9a0: 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30  ero)?pMem->u.i:0
e9b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  ).             =
e9c0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
e9d0: 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
e9e0: 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61  l_type) );.    a
e9f0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d  ssert( pMem->n<=
ea00: 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20  nBuf );.    len 
ea10: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d  = pMem->n;.    m
ea20: 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
ea30: 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66  >z, len);.    if
ea40: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
ea50: 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
ea60: 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75    len += pMem->u
ea70: 2e 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65  .i;.      if( le
ea80: 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  n>nBuf ){.      
ea90: 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20    len = nBuf;.  
eaa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
eab0: 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d  et(&buf[pMem->n]
eac0: 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e  , 0, len-pMem->n
ead0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
eae0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
eaf0: 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
eb00: 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
eb10: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
eb20: 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
eb30: 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
eb40: 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
eb50: 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
eb60: 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
eb70: 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
eb80: 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
eb90: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
eba0: 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
ebb0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
ebc0: 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
ebd0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
ebe0: 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
ebf0: 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
ec00: 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
ec10: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ec30: 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
ec40: 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
ec50: 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ec70: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
ec80: 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
ec90: 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
eca0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
ecb0: 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
ecc0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
ecd0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
ece0: 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
ecf0: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
ed00: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
ed10: 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
ed20: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
ed30: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
ed40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ed50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
ed60: 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
ed70: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
ed80: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
ed90: 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75   (signed char)bu
eda0: 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[0];.      pMem
edb0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
edc0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
edd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  1;.    }.    cas
ede0: 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
edf0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
ee00: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
ee10: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
ee20: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20  har)buf[0])<<8) 
ee30: 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20  | buf[1];.      
ee40: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ee50: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
ee60: 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
ee70: 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
ee80: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
ee90: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
eea0: 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e  m->u.i = (((sign
eeb0: 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c  ed char)buf[0])<
eec0: 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <16) | (buf[1]<<
eed0: 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20  8) | buf[2];.   
eee0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
eef0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
ef00: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
ef10: 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
ef20: 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
ef30: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
ef40: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66  pMem->u.i = (buf
ef50: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [0]<<24) | (buf[
ef60: 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32  1]<<16) | (buf[2
ef70: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a  ]<<8) | buf[3];.
ef80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ef90: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
efa0: 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
efb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
efc0: 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
efd0: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
efe0: 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69     u64 x = (((si
eff0: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
f000: 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a  )<<8) | buf[1];.
f010: 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62        u32 y = (b
f020: 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[2]<<24) | (bu
f030: 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[3]<<16) | (buf
f040: 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d  [4]<<8) | buf[5]
f050: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
f060: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70  32) | y;.      p
f070: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
f080: 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d  *)&x;.      pMem
f090: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f0a0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f0b0: 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
f0c0: 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
f0d0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
f0e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
f0f0: 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
f100: 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
f110: 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33   u64 x;.      u3
f120: 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65  2 y;.#if !define
f130: 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
f140: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
f150: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
f160: 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66  ).      /* Verif
f170: 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
f180: 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
f190: 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
f1a0: 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  e same.      ** 
f1b0: 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c  byte order.  Or,
f1c0: 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f   that if SQLITE_
f1d0: 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
f1e0: 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20  IT_FLOAT is.    
f1f0: 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
f200: 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
f210: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
f220: 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
f230: 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e        ** endian.
f240: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f250: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
f260: 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
f270: 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
f280: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f290: 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
f2a0: 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20  .      u64 t2 = 
f2b0: 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  t1;.      swapMi
f2c0: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
f2d0: 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  2);.      assert
f2e0: 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69  ( sizeof(r1)==si
f2f0: 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63  zeof(t2) && memc
f300: 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a  mp(&r1, &t2, siz
f310: 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23  eof(r1))==0 );.#
f320: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d  endif..      x =
f330: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
f340: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
f350: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
f360: 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28  [3];.      y = (
f370: 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[4]<<24) | (b
f380: 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[5]<<16) | (bu
f390: 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37  f[6]<<8) | buf[7
f3a0: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
f3b0: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
f3c0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
f3d0: 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =6 ){.        pM
f3e0: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
f3f0: 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  )&x;.        pMe
f400: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f410: 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  nt;.      }else{
f420: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f430: 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
f440: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
f450: 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
f460: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
f470: 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
f480: 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
f490: 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
f4a0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f4b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b  lags = MEM_Real;
f4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f4d0: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
f4e0: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
f4f0: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
f500: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
f510: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
f520: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
f530: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
f540: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f550: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f560: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f570: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f580: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
f590: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
f5a0: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
f5b0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
f5c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
f5d0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
f5e0: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
f5f0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
f600: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
f610: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f620: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
f630: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
f640: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f650: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
f660: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
f670: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
f680: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
f690: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f6a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
f6b0: 72 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f  r of a record co
f6c0: 6e 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75  nsists of a sequ
f6d0: 65 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65  ence variable-le
f6e0: 6e 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a  ngth integers..*
f6f0: 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73  * These integers
f700: 20 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61   are almost alwa
f710: 79 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65  ys small and are
f720: 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69   encoded as a si
f730: 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68  ngle byte..** Th
f740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
f750: 6f 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  o takes advantag
f760: 65 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70  e this fact to p
f770: 72 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65  rovide a fast de
f780: 63 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69  code.** of the i
f790: 6e 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63  ntegers in a rec
f7a0: 6f 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20  ord header.  It 
f7b0: 69 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  is faster for th
f7c0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a  e common case.**
f7d0: 20 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67   where the integ
f7e0: 65 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62  er is a single b
f7f0: 79 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69  yte.  It is a li
f800: 74 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e  ttle slower when
f810: 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20   the.** integer 
f820: 69 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62  is two or more b
f830: 79 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61  ytes.  But overa
f840: 6c 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e  ll it is faster.
f850: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
f860: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73  wing expressions
f870: 20 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a   are equivalent:
f880: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73  .**.**     x = s
f890: 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
f8a0: 32 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a  2( A, &B );.**.*
f8b0: 2a 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72  *     x = GetVar
f8c0: 69 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a  int( A, B );.**.
f8d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61  */.#define GetVa
f8e0: 72 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d  rint(A,B)  ((B =
f8f0: 20 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31   *(A))<=0x7f ? 1
f900: 20 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72   : sqlite3GetVar
f910: 69 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f  int32(A, &B))../
f920: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
f930: 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
f940: 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
f950: 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 74   pKey[], parse t
f960: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74  he.** record int
f970: 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  o a UnpackedReco
f980: 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 52  rd structure.  R
f990: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
f9a0: 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 63  to.** that struc
f9b0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ture..**.** The 
f9c0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
f9d0: 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 73   might provide s
f9e0: 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 20  zSpace bytes of 
f9f0: 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20  memory.** space 
fa00: 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 73  at pSpace.  This
fa10: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 73   space can be us
fa20: 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ed to hold the r
fa30: 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50  eturned.** VDbeP
fa40: 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 75  arsedRecord stru
fa50: 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 6c  cture if it is l
fa60: 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 66  arge enough.  If
fa70: 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69   it is.** not bi
fa80: 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 20  g enough, space 
fa90: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
faa0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
fab0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  )..**.** The ret
fac0: 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 20  urned structure 
fad0: 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
fae0: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a   by a call to.**
faf0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
fb00: 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
fb10: 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64  ()..*/ .Unpacked
fb20: 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56  Record *sqlite3V
fb30: 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
fb40: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
fb50: 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
fb60: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
fb70: 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
fb80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fba0: 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
fbb0: 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
fbc0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
fbd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
fbe0: 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
fbf0: 76 6f 69 64 20 2a 70 53 70 61 63 65 2c 20 20 20  void *pSpace,   
fc00: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
fc10: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c  available to hol
fc20: 64 20 72 65 73 75 6c 74 69 6e 67 20 6f 62 6a 65  d resulting obje
fc30: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70  ct */.  int szSp
fc40: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 2f  ace            /
fc50: 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
fc60: 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29  [] in bytes */.)
fc70: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
fc80: 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
fc90: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
fca0: 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55  char *)pKey;.  U
fcb0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
fcc0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
fcd0: 20 69 6e 74 20 69 2c 20 69 64 78 2c 20 64 3b 0a   int i, idx, d;.
fce0: 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
fcf0: 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20 6e  em *pMem;.  .  n
fd00: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
fd10: 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
fd20: 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
fd30: 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
fd40: 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
fd50: 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
fd60: 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
fd70: 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
fd80: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
fd90: 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 65  urn 0;.    p->ne
fda0: 65 64 46 72 65 65 20 3d 20 31 3b 0a 20 20 7d 65  edFree = 1;.  }e
fdb0: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 70 53 70  lse{.    p = pSp
fdc0: 61 63 65 3b 0a 20 20 20 20 70 2d 3e 6e 65 65 64  ace;.    p->need
fdd0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
fde0: 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
fdf0: 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
fe00: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
fe10: 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 70 2d  nField + 1;.  p-
fe20: 3e 6e 65 65 64 44 65 73 74 72 6f 79 20 3d 20 31  >needDestroy = 1
fe30: 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d  ;.  p->aMem = pM
fe40: 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 70 5b 31 5d  em = (Mem*)&p[1]
fe50: 3b 0a 20 20 69 64 78 20 3d 20 47 65 74 56 61 72  ;.  idx = GetVar
fe60: 69 6e 74 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  int(aKey, szHdr)
fe70: 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
fe80: 20 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   i = 0;.  while(
fe90: 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 69 3c   idx<szHdr && i<
fea0: 70 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  p->nField ){.   
feb0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
fec0: 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 47 65  ;..    idx += Ge
fed0: 74 56 61 72 69 6e 74 28 20 61 4b 65 79 2b 69 64  tVarint( aKey+id
fee0: 78 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  x, serial_type);
fef0: 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79  .    if( d>=nKey
ff00: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
ff10: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
ff20: 69 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62 72  ial_type)>0 ) br
ff30: 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  eak;.    pMem->e
ff40: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
ff50: 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
ff60: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
ff70: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
ff80: 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
ff90: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
ffa0: 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
ffb0: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
ffc0: 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
ffd0: 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
ffe0: 6d 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  m++;.    i++;.  
fff0: 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  }.  p->nField = 
10000 69 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  i;.  return (voi
10010 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
10020 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
10030 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
10040 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a  ecord object.*/.
10050 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
10060 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
10070 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63  cord(UnpackedRec
10080 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
10090 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
100a0 65 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  eedDestroy ){.  
100b0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
100c0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20   Mem *pMem;.    
100d0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
100e0 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
100f0 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
10100 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10110 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
10120 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10130 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
10140 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  (pMem);.        
10150 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10160 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 46      if( p->needF
10170 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
10180 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
10190 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
101a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
101b0 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
101c0 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
101d0 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
101e0 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
101f0 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
10200 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
10210 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
10220 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
10230 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e  ve integer if {n
10240 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20  Key1, pKey1} is 
10250 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
10260 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
10270 65 72 20 74 68 61 6e 20 70 50 4b 65 79 32 2e 20  er than pPKey2. 
10280 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
10290 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
102a0 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
102b0 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
102c0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
102d0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
102e0 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
102f0 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
10300 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
10310 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
10320 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
10330 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
10340 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
10350 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
10360 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
10370 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 42 75 74 20   fields..** But 
10380 69 66 20 74 68 65 20 6c 65 6e 67 74 68 73 20 64  if the lengths d
10390 69 66 66 65 72 2c 20 4b 65 79 32 20 6d 75 73 74  iffer, Key2 must
103a0 20 62 65 20 74 68 65 20 73 68 6f 72 74 65 72 20   be the shorter 
103b0 6f 66 20 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a  of the two..**.*
103c0 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 6e 6f 74  * Historical not
103d0 65 3a 20 49 6e 20 65 61 72 6c 69 65 72 20 76 65  e: In earlier ve
103e0 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72  rsions of this r
103f0 6f 75 74 69 6e 65 20 62 6f 74 68 20 4b 65 79 31  outine both Key1
10400 0a 2a 2a 20 61 6e 64 20 4b 65 79 32 20 77 65 72  .** and Key2 wer
10410 65 20 62 6c 6f 62 73 20 6f 62 74 61 69 6e 65 64  e blobs obtained
10420 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63   from OP_MakeRec
10430 6f 72 64 2e 20 20 42 75 74 20 77 65 20 66 6f 75  ord.  But we fou
10440 6e 64 0a 2a 2a 20 74 68 61 74 20 69 6e 20 74 79  nd.** that in ty
10450 70 69 63 61 6c 20 75 73 65 20 74 68 65 20 73 61  pical use the sa
10460 6d 65 20 4b 65 79 32 20 77 6f 75 6c 64 20 62 65  me Key2 would be
10470 20 73 75 62 6d 69 74 74 65 64 20 6d 75 6c 74 69   submitted multi
10480 70 6c 65 20 74 69 6d 65 73 0a 2a 2a 20 69 6e 20  ple times.** in 
10490 61 20 72 6f 77 2e 20 20 53 6f 20 61 6e 20 6f 70  a row.  So an op
104a0 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 61  timization was a
104b0 64 64 65 64 20 74 6f 20 70 61 72 73 65 20 74 68  dded to parse th
104c0 65 20 4b 65 79 32 20 6b 65 79 0a 2a 2a 20 73 65  e Key2 key.** se
104d0 70 61 72 61 74 65 6c 79 20 61 6e 64 20 73 75 62  parately and sub
104e0 6d 69 74 20 74 68 65 20 70 61 72 73 65 64 20 76  mit the parsed v
104f0 65 72 73 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73  ersion.  In this
10500 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 0a 2a   way, we avoid.*
10510 2a 20 70 61 72 73 69 6e 67 20 74 68 65 20 73 61  * parsing the sa
10520 6d 65 20 4b 65 79 32 20 6d 75 6c 74 69 70 6c 65  me Key2 multiple
10530 20 74 69 6d 65 73 20 69 6e 20 61 20 72 6f 77 2e   times in a row.
10540 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10550 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
10560 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
10570 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
10580 2c 20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  , .  UnpackedRec
10590 6f 72 64 20 2a 70 50 4b 65 79 32 0a 29 7b 0a 20  ord *pPKey2.){. 
105a0 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
105b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
105c0 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
105d0 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
105e0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
105f0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10600 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
10610 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
10620 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
10630 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
10640 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10650 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
10660 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  t i = 0;.  int n
10670 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20  Field;.  int rc 
10680 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
10690 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
106a0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
106b0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
106c0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
106d0 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
106e0 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
106f0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
10700 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  o;.  mem1.enc = 
10710 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
10720 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
10730 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e  nfo->db;.  mem1.
10740 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d  flags = 0;.  mem
10750 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  1.zMalloc = 0;. 
10760 20 0a 20 20 69 64 78 31 20 3d 20 47 65 74 56 61   .  idx1 = GetVa
10770 72 69 6e 74 28 61 4b 65 79 31 2c 20 73 7a 48 64  rint(aKey1, szHd
10780 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64  r1);.  d1 = szHd
10790 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70  r1;.  nField = p
107a0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
107b0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
107c0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
107d0 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
107e0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
107f0 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
10800 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
10810 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
10820 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
10830 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
10840 3d 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65  = GetVarint( aKe
10850 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
10860 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
10870 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
10880 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10890 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
108a0 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
108b0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
108c0 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
108d0 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
108e0 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
108f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
10900 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
10910 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
10920 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
10930 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
10940 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10950 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
10960 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
10970 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
109a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
109b0 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
109c0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
109d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
109e0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  ++;.  }.  if( me
109f0 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m1.zMalloc ) sql
10a00 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
10a10 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a  se(&mem1);..  /*
10a20 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   One of the keys
10a30 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
10a40 64 73 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20  ds, but all the 
10a50 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
10a60 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72  t point.  ** wer
10a70 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20  e equal. If the 
10a80 69 6e 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20  incrKey flag is 
10a90 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73  true, then the s
10aa0 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a  econd key is.  *
10ab0 2a 20 74 72 65 61 74 65 64 20 61 73 20 6c 61 72  * treated as lar
10ac0 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ger..  */.  if( 
10ad0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  rc==0 ){.    if(
10ae0 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b   pKeyInfo->incrK
10af0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
10b00 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
10b10 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72  f( !pKeyInfo->pr
10b20 65 66 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20  efixIsEqual ){. 
10b30 20 20 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79       if( d1<nKey
10b40 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  1 ){.        rc 
10b50 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
10b60 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
10b70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
10b80 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66  der && i<pKeyInf
10b90 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20  o->nField.      
10ba0 20 20 20 20 20 20 20 20 20 26 26 20 70 4b 65 79           && pKey
10bb0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
10bc0 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  [i] ){.    rc = 
10bd0 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  -rc;.  }..  retu
10be0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10bf0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  The argument is 
10c00 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63  an index entry c
10c10 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68  omposed using th
10c20 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
10c30 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c  opcode..** The l
10c40 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ast entry in thi
10c50 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  s record should 
10c60 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73  be an integer (s
10c70 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61  pecifically.** a
10c80 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29  n integer rowid)
10c90 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
10ca0 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
10cb0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a  er of bytes in.*
10cc0 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a  * that integer..
10cd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
10ce0 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f  beIdxRowidLen(co
10cf0 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20  nst u8 *aKey){. 
10d00 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
10d10 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
10d20 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
10d30 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
10d40 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
10d50 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a  f the rowid */..
10d60 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69    sqlite3GetVari
10d70 6e 74 33 32 28 61 4b 65 79 2c 20 26 73 7a 48 64  nt32(aKey, &szHd
10d80 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74  r);.  sqlite3Get
10d90 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
10da0 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f  zHdr-1], &typeRo
10db0 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
10dc0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10dd0 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
10de0 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
10df0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
10e00 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
10e10 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
10e20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
10e30 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
10e40 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
10e50 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
10e60 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
10e70 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
10e80 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10e90 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
10ea0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
10eb0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
10ec0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
10ed0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
10ee0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
10ef0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
10f00 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
10f10 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
10f20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
10f30 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
10f40 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
10f50 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
10f60 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
10f70 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
10f80 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
10f90 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
10fa0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
10fb0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
10fc0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
10fd0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
10fe0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
10ff0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11000 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11010 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20    }.  m.flags = 
11020 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20  0;.  m.db = 0;. 
11030 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a   m.zMalloc = 0;.
11040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11050 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
11060 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
11070 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
11080 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11090 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   rc;.  }.  sqlit
110a0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
110b0 38 2a 29 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b  8*)m.z, &szHdr);
110c0 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
110d0 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
110e0 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79 70 65 52  szHdr-1], &typeR
110f0 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69  owid);.  lenRowi
11100 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
11110 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
11120 65 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74  eRowid);.  sqlit
11130 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
11140 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65  (u8*)&m.z[m.n-le
11150 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77  nRowid], typeRow
11160 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69  id, &v);.  *rowi
11170 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c  d = v.u.i;.  sql
11180 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11190 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
111a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
111b0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
111c0 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
111d0 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
111e0 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 20  sor pC is point 
111f0 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
11200 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
11210 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68 20  pKey (of length 
11220 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69 6e  nKey).  Write in
11230 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
11240 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
11250 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
11260 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
11270 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
11280 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
11290 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 20  ater than pKey. 
112a0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
112b0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
112c0 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74 68  .** pKey is eith
112d0 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
112e0 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
112f0 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
11300 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
11310 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
11320 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
11330 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
11340 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
11350 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
11360 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ell..*/.int sqli
11370 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
11380 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 20 2a  pare(.  Cursor *
11390 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
113a0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
113b0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
113c0 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b  inst */.  int nK
113d0 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b  ey, const u8 *pK
113e0 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  ey,   /* The key
113f0 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
11400 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11420 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
11430 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
11440 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
11450 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
11460 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
11470 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
11480 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f  sor;.  int lenRo
11490 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 20 20  wid;.  Mem m;.  
114a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
114b0 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a 53 70  pRec;.  char zSp
114c0 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73 71 6c  ace[200];..  sql
114d0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
114e0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
114f0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
11500 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65 73  y<=0 ){.    *res
11510 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
11520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11530 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e    m.db = 0;.  m.
11540 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a  flags = 0;.  m.z
11550 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63  Malloc = 0;.  rc
11560 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
11570 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
11580 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c  Cursor, 0, nCell
11590 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
115a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
115b0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65  urn rc;.  }.  le
115c0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
115d0 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28  VdbeIdxRowidLen(
115e0 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 70 52 65  (u8*)m.z);.  pRe
115f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
11600 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e  ecordUnpack(pC->
11610 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20  pKeyInfo, nKey, 
11620 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 7a 53 70 61 63 65 2c 20 73 69        zSpace, si
11650 7a 65 6f 66 28 7a 53 70 61 63 65 29 29 3b 0a 20  zeof(zSpace));. 
11660 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 7b 0a   if( pRec==0 ){.
11670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11680 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a  E_NOMEM;.  }.  *
11690 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
116a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
116b0 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a  .n-lenRowid, m.z
116c0 2c 20 70 52 65 63 29 3b 0a 20 20 73 71 6c 69 74  , pRec);.  sqlit
116d0 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
116e0 63 6b 65 64 52 65 63 6f 72 64 28 70 52 65 63 29  ckedRecord(pRec)
116f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
11700 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
11710 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11720 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
11730 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
11740 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65  e value to be re
11750 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71  turned by subseq
11760 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a  uent calls to.**
11770 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
11780 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  () on the databa
11790 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20  se handle 'db'. 
117a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
117b0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73  VdbeSetChanges(s
117c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
117d0 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65  nChange){.  asse
117e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
117f0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
11800 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e  ) );.  db->nChan
11810 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20  ge = nChange;.  
11820 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
11830 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a   += nChange;.}..
11840 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67  /*.** Set a flag
11850 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20   in the vdbe to 
11860 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
11870 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69  e counter when i
11880 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a  t is finalised.*
11890 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76  * or reset..*/.v
118a0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
118b0 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65  ountChanges(Vdbe
118c0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67   *v){.  v->chang
118d0 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f  eCntOn = 1;.}../
118e0 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20  *.** Mark every 
118f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
11900 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  nt associated wi
11910 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  th a database co
11920 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65  nnection.** as e
11930 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  xpired..**.** An
11940 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65   expired stateme
11950 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65  nt means that re
11960 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
11970 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a  he statement is.
11980 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53  ** recommend.  S
11990 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65  tatements expire
119a0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70   when things hap
119b0 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68  pen that make th
119c0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20  eir.** programs 
119d0 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76  obsolete.  Remov
119e0 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64  ing user-defined
119f0 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f   functions or co
11a00 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
11a10 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e  nces, or changin
11a20 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69  g an authorizati
11a30 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  on function are 
11a40 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20  the types of.** 
11a50 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65  things that make
11a60 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
11a70 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a  ents obsolete..*
11a80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
11a90 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
11aa0 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  ements(sqlite3 *
11ab0 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  db){.  Vdbe *p;.
11ac0 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56    for(p = db->pV
11ad0 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  dbe; p; p=p->pNe
11ae0 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69  xt){.    p->expi
11af0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  red = 1;.  }.}..
11b00 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11b10 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69   database associ
11b20 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
11b30 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a  be..*/.sqlite3 *
11b40 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64  sqlite3VdbeDb(Vd
11b50 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e  be *v){.  return
11b60 20 76 2d 3e 64 62 3b 0a 7d 0a                     v->db;.}.