/ Hex Artifact Content
Login

Artifact 75c3ac2a3c37747ae66ea0935f8f48bb1879234a:


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 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 33 35 20 32  eaux.c,v 1.435 2
02c0: 30 30 39 2f 30 32 2f 30 33 20 31 36 3a 35 31 3a  009/02/03 16:51:
02d0: 32 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  25 danielk1977 E
02e0: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
0310: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
0320: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0330: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0340: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0350: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0360: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0370: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0380: 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63  to 1 and all opc
0390: 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70 72 69  odes will be pri
03a0: 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 79 20  nted.** as they 
03b0: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
03c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 74 72   instruction str
03d0: 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  eam..*/.#ifdef S
03e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
03f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70  sqlite3VdbeAddop
0400: 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
0410: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  f.../*.** Create
0420: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64   a new virtual d
0430: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a  atabase engine..
0440: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
0450: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74  VdbeCreate(sqlit
0460: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
0470: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
0480: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
0490: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
04a0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
04b0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
04c0: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
04d0: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
04e0: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
04f0: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0500: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0510: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0520: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0530: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0540: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0550: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
0560: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65  .** Remember the
0570: 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 20   SQL string for 
0580: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0590: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
05a0: 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c 28  lite3VdbeSetSql(
05b0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
05c0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
05d0: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
05e0: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
05f0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70  ->zSql==0 );.  p
0600: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  ->zSql = sqlite3
0610: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
0620: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   z, n);.}../*.**
0630: 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20   Return the SQL 
0640: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0650: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
0660: 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ment.*/.const ch
0670: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28  ar *sqlite3_sql(
0680: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0690: 74 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 28  tmt){.  return (
06a0: 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e  (Vdbe *)pStmt)->
06b0: 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  zSql;.}../*.** S
06c0: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
06d0: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
06e0: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
06f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0700: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
0710: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
0720: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
0730: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74  har *zTmp;.  int
0740: 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a   nTmp;.  tmp = *
0750: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
0760: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
0770: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0780: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0790: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
07a0: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
07b0: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
07c0: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
07d0: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
07e0: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
07f0: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
0800: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
0810: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
0820: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e  zSql = zTmp;.  n
0830: 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a  Tmp = pA->nSql;.
0840: 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d    pA->nSql = pB-
0850: 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71  >nSql;.  pB->nSq
0860: 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69 66  l = nTmp;.}..#if
0870: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0880: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63  ./*.** Turn trac
0890: 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f  ing on or off.*/
08a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
08b0: 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20  eTrace(Vdbe *p, 
08c0: 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20  FILE *trace){.  
08d0: 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65  p->trace = trace
08e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
08f0: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62  * Resize the Vdb
0900: 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74  e.aOp array so t
0910: 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61  hat it is at lea
0920: 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72  st one op larger
0930: 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73   than .** it was
0940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75  ..**.** If an ou
0950: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f  t-of-memory erro
0960: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
0970: 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61  esizing the arra
0980: 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  y, return.** SQL
0990: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68  ITE_NOMEM. In th
09a0: 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70  is case Vdbe.aOp
09b0: 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c   and Vdbe.nOpAll
09c0: 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e  oc remain .** un
09d0: 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73  changed (this is
09e0: 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63   so that any opc
09f0: 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  odes already all
0a00: 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a  ocated can be .*
0a10: 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c  * correctly deal
0a20: 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
0a30: 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  th the rest of t
0a40: 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61  he Vdbe)..*/.sta
0a50: 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72  tic int growOpAr
0a60: 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ray(Vdbe *p){.  
0a70: 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20  VdbeOp *pNew;.  
0a80: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
0a90: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
0aa0: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
0ab0: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0ac0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0ad0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0ae0: 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, p->aOp, nNew
0af0: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0b00: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0b10: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6e 4e  p->nOpAlloc = nN
0b20: 65 77 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d  ew;.    p->aOp =
0b30: 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74   pNew;.  }.  ret
0b40: 75 72 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49  urn (pNew ? SQLI
0b50: 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e  TE_OK : SQLITE_N
0b60: 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  OMEM);.}../*.** 
0b70: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75  Add a new instru
0b80: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73  ction to the lis
0b90: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  t of instruction
0ba0: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65  s current in the
0bb0: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72  .** VDBE.  Retur
0bc0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
0bd0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63   the new instruc
0be0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  tion..**.** Para
0bf0: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  meters:.**.**   
0c00: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20   p              
0c10: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0c20: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70  VDBE.**.**    op
0c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
0c40: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69  e opcode for thi
0c50: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a  s instruction.**
0c60: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70  .**    p1, p2, p
0c70: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a  3      Operands.
0c80: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
0c90: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
0ca0: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e  Label() function
0cb0: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65   to fix an addre
0cc0: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71  ss and.** the sq
0cd0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
0ce0: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  4() function to 
0cf0: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  change the value
0d00: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70   of the P4.** op
0d10: 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erand..*/.int sq
0d20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
0d30: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
0d40: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c   int p1, int p2,
0d50: 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20   int p3){.  int 
0d60: 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  i;.  VdbeOp *pOp
0d70: 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b  ;..  i = p->nOp;
0d80: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
0d90: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
0da0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
0db0: 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66  ( op>0 && op<0xf
0dc0: 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  f );.  if( p->nO
0dd0: 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20  pAlloc<=i ){.   
0de0: 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79   if( growOpArray
0df0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  (p) ){.      ret
0e00: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 0;.    }.  }
0e10: 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70  .  p->nOp++;.  p
0e20: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
0e30: 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d  .  pOp->opcode =
0e40: 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e   (u8)op;.  pOp->
0e50: 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70  p5 = 0;.  pOp->p
0e60: 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70  1 = p1;.  pOp->p
0e70: 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70  2 = p2;.  pOp->p
0e80: 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70  3 = p3;.  pOp->p
0e90: 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  4.p = 0;.  pOp->
0ea0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
0eb0: 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  SED;.  p->expire
0ec0: 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
0ed0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f 70  LITE_DEBUG.  pOp
0ee0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
0ef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
0f00: 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 73 71  eAddopTrace ) sq
0f10: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
0f20: 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  (0, i, &p->aOp[i
0f30: 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ]);.#endif.#ifde
0f40: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
0f50: 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30   pOp->cycles = 0
0f60: 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30  ;.  pOp->cnt = 0
0f70: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
0f80: 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n i;.}.int sqlit
0f90: 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62  e3VdbeAddOp0(Vdb
0fa0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  e *p, int op){. 
0fb0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
0fc0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
0fd0: 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74   0, 0, 0);.}.int
0fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0ff0: 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p1(Vdbe *p, int 
1000: 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72  op, int p1){.  r
1010: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1020: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1030: 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  1, 0, 0);.}.int 
1040: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1050: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  2(Vdbe *p, int o
1060: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
1070: 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  2){.  return sql
1080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1090: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29  , op, p1, p2, 0)
10a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ;.}.../*.** Add 
10b0: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
10c0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
10d0: 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65  alue as a pointe
10e0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10f0: 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56  3VdbeAddOp4(.  V
1100: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1110: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1120: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1130: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1150: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1160: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1170: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1180: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1190: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
11a0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
11b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
11c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11d0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
11e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
11f0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f  ,    /* The P4 o
1200: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1210: 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20  p4type          
1220: 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79  /* P4 operand ty
1230: 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  pe */.){.  int a
1240: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
1250: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
1260: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71  1, p2, p3);.  sq
1270: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
1280: 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20  4(p, addr, zP4, 
1290: 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72  p4type);.  retur
12a0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
12b0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79   Create a new sy
12c0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72  mbolic label for
12d0: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
12e0: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
12f0: 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68  be.** coded.  Th
1300: 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c  e symbolic label
1310: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
1320: 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
1330: 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c  r.  The.** label
1340: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
1350: 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20  the P2 value of 
1360: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c  an operation.  L
1370: 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  ater, when.** th
1380: 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c  e label is resol
1390: 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66 69  ved to a specifi
13a0: 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20 56  c address, the V
13b0: 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a  DBE will scan.**
13c0: 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65   through its ope
13d0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20  ration list and 
13e0: 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65  change all value
13f0: 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61  s of P2 which ma
1400: 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c  tch.** the label
1410: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76   into the resolv
1420: 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  ed address..**.*
1430: 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73  * The VDBE knows
1440: 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75 65   that a P2 value
1450: 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61   is a label beca
1460: 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a  use labels are.*
1470: 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76  * always negativ
1480: 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20  e and P2 values 
1490: 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62  are suppose to b
14a0: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a  e non-negative..
14b0: 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61  ** Hence, a nega
14c0: 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69 73  tive P2 value is
14d0: 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61   a label that ha
14e0: 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f  s yet to be reso
14f0: 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f  lved..**.** Zero
1500: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1510: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
1520: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1530: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64  VdbeMakeLabel(Vd
1540: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
1550: 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  .  i = p->nLabel
1560: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ++;.  assert( p-
1570: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1580: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
1590: 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c   i>=p->nLabelAll
15a0: 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  oc ){.    int n 
15b0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  = p->nLabelAlloc
15c0: 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70 2d 3e 61  *2 + 5;.    p->a
15d0: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
15e0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
15f0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
1600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 6e 2a 73 69 7a 65 6f 66          n*sizeof
1630: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
1640: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
1650: 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  loc = sqlite3DbM
1660: 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c  allocSize(p->db,
1670: 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73 69 7a 65   p->aLabel)/size
1680: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1690: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
16a0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
16b0: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a  aLabel[i] = -1;.
16c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d    }.  return -1-
16d0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f  i;.}../*.** Reso
16e0: 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f  lve label "x" to
16f0: 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73 20   be the address 
1700: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
1710: 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65  ruction to.** be
1720: 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20   inserted.  The 
1730: 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75  parameter "x" mu
1740: 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74  st have been obt
1750: 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20  ained from.** a 
1760: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
1770: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
1780: 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  el()..*/.void sq
1790: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
17a0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69  Label(Vdbe *p, i
17b0: 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d  nt x){.  int j =
17c0: 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28   -1-x;.  assert(
17d0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
17e0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
17f0: 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20  assert( j>=0 && 
1800: 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  j<p->nLabel );. 
1810: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
1820: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
1830: 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d  j] = p->nOp;.  }
1840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74  .}../*.** Loop t
1850: 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72  hrough the progr
1860: 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50  am looking for P
1870: 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  2 values that ar
1880: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e  e negative.** on
1890: 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f   jump instructio
18a0: 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 76  ns.  Each such v
18b0: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e  alue is a label.
18c0: 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a    Resolve the.**
18d0: 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e   label by settin
18e0: 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 74  g the P2 value t
18f0: 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f  o its correct no
1900: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a  n-zero value..**
1910: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1920: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   is called once 
1930: 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65  after all opcode
1940: 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65  s have been inse
1950: 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69  rted..**.** Vari
1960: 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72  able *pMaxFuncAr
1970: 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  gs is set to the
1980: 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f   maximum value o
1990: 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e  f any P2 argumen
19a0: 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46  t .** to an OP_F
19b0: 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53  unction, OP_AggS
19c0: 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65  tep or OP_VFilte
19d0: 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69  r opcode. This i
19e0: 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71  s used by .** sq
19f0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1a00: 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65  dy() to size the
1a10: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
1a20: 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ray..**.** This 
1a30: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65  routine also doe
1a40: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1a50: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49  optimization:  I
1a60: 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 69  t scans for.** i
1a70: 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74  nstructions that
1a80: 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20 73   might cause a s
1a90: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
1aa0: 6b 2e 20 20 53 75 63 68 20 69 6e 73 74 72 75 63  k.  Such instruc
1ab0: 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a  tions.** are:.**
1ac0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
1ad0: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
1ae0: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
1af0: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
1b00: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
1b10: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
1b20: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
1b30: 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  name.**.** If no
1b40: 20 73 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f   such instructio
1b50: 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
1b60: 20 65 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74   every Statement
1b70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a   instruction .**
1b80: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61   is changed to a
1b90: 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73 20   Noop.  In this 
1ba0: 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72  way, we avoid cr
1bb0: 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74 65  eating the state
1bc0: 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ment .** journal
1bd0: 20 66 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72   file unnecessar
1be0: 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ily..*/.static v
1bf0: 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  oid resolveP2Val
1c00: 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ues(Vdbe *p, int
1c10: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b   *pMaxFuncArgs){
1c20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
1c30: 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20  nMaxArgs = 0;.  
1c40: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a  Op *pOp;.  int *
1c50: 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62  aLabel = p->aLab
1c60: 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74  el;.  int doesSt
1c70: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1c80: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74  = 0;.  int hasSt
1c90: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30  atementBegin = 0
1ca0: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
1cb0: 3d 20 31 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  = 1;.  p->usesSt
1cc0: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  mtJournal = 0;. 
1cd0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
1ce0: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
1cf0: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
1d00: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
1d10: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
1d20: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
1d30: 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63  _Function || opc
1d40: 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20  ode==OP_AggStep 
1d50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1d60: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
1d70: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
1d80: 70 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p5;.#ifndef SQLI
1d90: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1da0: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
1db0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  f( opcode==OP_VU
1dc0: 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20 69  pdate ){.      i
1dd0: 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41  f( pOp->p2>nMaxA
1de0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
1df0: 20 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64 69 66   pOp->p2;.#endif
1e00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
1e10: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 29  pcode==OP_Halt )
1e20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d  {.      if( pOp-
1e30: 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >p1==SQLITE_CONS
1e40: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
1e50: 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  2==OE_Abort ){. 
1e60: 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65         doesState
1e70: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1e80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1e90: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1ea0: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a  OP_Statement ){.
1eb0: 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d 65        hasStateme
1ec0: 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20 20  ntBegin = 1;.   
1ed0: 20 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f     p->usesStmtJo
1ee0: 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
1ef0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1f00: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29 7b 0a 20  =OP_Destroy ){. 
1f10: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
1f20: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
1f30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1f40: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e 73 61 63  code==OP_Transac
1f50: 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e 70 32 21  tion && pOp->p2!
1f60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
1f70: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 23 69 66  eadOnly = 0;.#if
1f80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f90: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1fa0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1fb0: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
1fc0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
1fd0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 64 6f  name ){.      do
1fe0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1ff0: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  ack = 1;.    }el
2000: 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f  se if( opcode==O
2010: 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a 20 20 20  P_VFilter ){.   
2020: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
2030: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
2040: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
2050: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
2060: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
2070: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 6e 20 3d  ger );.      n =
2080: 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20   pOp[-1].p1;.   
2090: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
20a0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
20b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
20d0: 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70  dbeOpcodeHasProp
20e0: 65 72 74 79 28 6f 70 63 6f 64 65 2c 20 4f 50 46  erty(opcode, OPF
20f0: 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70 4f 70 2d  LG_JUMP) && pOp-
2100: 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  >p2<0 ){.      a
2110: 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70  ssert( -1-pOp->p
2120: 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  2<p->nLabel );. 
2130: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61       pOp->p2 = a
2140: 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32  Label[-1-pOp->p2
2150: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
2160: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
2170: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  db, p->aLabel);.
2180: 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b    p->aLabel = 0;
2190: 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ..  *pMaxFuncArg
21a0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20  s = nMaxArgs;.. 
21b0: 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20   /* If we never 
21c0: 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  rollback a state
21d0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21e0: 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  , then statement
21f0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
2200: 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65  ns are not neede
2210: 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76  d.  So change ev
2220: 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ery OP_Statement
2230: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74  .  ** opcode int
2240: 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54  o an OP_Noop.  T
2250: 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c  his avoid a call
2260: 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65   to sqlite3OsOpe
2270: 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a  nExclusive().  *
2280: 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65  * which can be e
2290: 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65  xpensive on some
22a0: 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f   platforms..  */
22b0: 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d  .  if( hasStatem
22c0: 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65  entBegin && !doe
22d0: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
22e0: 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e 75 73 65  ck ){.    p->use
22f0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  sStmtJournal = 0
2300: 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  ;.    for(pOp=p-
2310: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
2320: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
2330: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
2340: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2350: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2360: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2370: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2380: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2390: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
23a0: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
23b0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
23c0: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
23d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
23e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
23f0: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
2400: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
2410: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2420: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
2430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
2440: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
2450: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2460: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2470: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2480: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2490: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
24a0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
24b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
24c0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
24d0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
24e0: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
24f0: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
2500: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
2510: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2520: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
2530: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
2540: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
2550: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2560: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
2570: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f  p->nOp;.  if( nO
2580: 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  p>0 ){.    int i
2590: 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74  ;.    VdbeOpList
25a0: 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f   const *pIn = aO
25b0: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
25c0: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b  i<nOp; i++, pIn+
25d0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  +){.      int p2
25e0: 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20   = pIn->p2;.    
25f0: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d    VdbeOp *pOut =
2600: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
2610: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70  ;.      pOut->op
2620: 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f  code = pIn->opco
2630: 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  de;.      pOut->
2640: 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20  p1 = pIn->p1;.  
2650: 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 20      if( p2<0 && 
2660: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64  sqlite3VdbeOpcod
2670: 65 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 75  eHasProperty(pOu
2680: 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47  t->opcode, OPFLG
2690: 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20 20 20  _JUMP) ){.      
26a0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64    pOut->p2 = add
26b0: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20  r + ADDR(p2);.  
26c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26d0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32     pOut->p2 = p2
26e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26f0: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e  pOut->p3 = pIn->
2700: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p3;.      pOut->
2710: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
2720: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  SED;.      pOut-
2730: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20  >p4.p = 0;.     
2740: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23   pOut->p5 = 0;.#
2750: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2760: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a  UG.      pOut->z
2770: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  Comment = 0;.   
2780: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
2790: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
27a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27b0: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
27c0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
27d0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
27e0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
27f0: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
2800: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
2810: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
2820: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2830: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
2840: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2850: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
2860: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2870: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
2880: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
2890: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
28a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
28b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
28d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
28e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
28f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
2900: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2910: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
2920: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2930: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2940: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
2950: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2960: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2970: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2980: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2990: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
29a0: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
29b0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
29c0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
29d0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
29e0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
29f0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2a00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2a10: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
2a20: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
2a30: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
2a40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a50: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP2(Vdbe *p, in
2a60: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2a70: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2a80: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2a90: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2aa0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2ab0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2ac0: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2ad0: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2ae0: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
2af0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2b00: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b10: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
2b20: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
2b30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
2b40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b50: 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  P3(Vdbe *p, int 
2b60: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
2b70: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
2b80: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
2b90: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2ba0: 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d   if( p && addr>=
2bb0: 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72  0 && p->nOp>addr
2bc0: 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20   && p->aOp ){.  
2bd0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
2be0: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
2bf0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2c00: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
2c10: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
2c20: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
2c30: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
2c40: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2c50: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
2c60: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
2c70: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2c80: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
2c90: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2ca0: 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f    if( p && p->aO
2cb0: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
2cc0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20   p->nOp>0 );.   
2cd0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
2ce0: 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p5 = val;.  }.
2cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2d00: 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f  the P2 operand o
2d10: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64  f instruction ad
2d20: 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  dr so that it po
2d30: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61  ints to.** the a
2d40: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
2d50: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2d60: 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76  o be coded..*/.v
2d70: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a  oid sqlite3VdbeJ
2d80: 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c  umpHere(Vdbe *p,
2d90: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71   int addr){.  sq
2da0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2db0: 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f  2(p, addr, p->nO
2dc0: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  p);.}.../*.** If
2dd0: 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 44   the input FuncD
2de0: 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ef structure is 
2df0: 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20  ephemeral, then 
2e00: 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20  free it.  If.** 
2e10: 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 6e  the FuncDef is n
2e20: 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 65  ot ephermal, the
2e30: 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f  n do nothing..*/
2e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2e50: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69  eEphemeralFuncti
2e60: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  on(sqlite3 *db, 
2e70: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b 0a  FuncDef *pDef){.
2e80: 20 20 69 66 28 20 70 44 65 66 20 26 26 20 28 70    if( pDef && (p
2e90: 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  Def->flags & SQL
2ea0: 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21  ITE_FUNC_EPHEM)!
2eb0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2ec0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 66  3DbFree(db, pDef
2ed0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ee0: 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75  Delete a P4 valu
2ef0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2f00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2f10: 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64  reeP4(sqlite3 *d
2f20: 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76  b, int p4type, v
2f30: 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 20  oid *p4){.  if( 
2f40: 70 34 20 29 7b 0a 20 20 20 20 73 77 69 74 63 68  p4 ){.    switch
2f50: 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ( p4type ){.    
2f60: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
2f70: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
2f80: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
2f90: 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20 20 20  P4_MPRINTF:.    
2fa0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
2fb0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  C:.      case P4
2fc0: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20  _KEYINFO:.      
2fd0: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
2fe0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2ff0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
3000: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
3010: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
3020: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3040: 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a  ase P4_VDBEFUNC:
3050: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
3060: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
3070: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b   (VdbeFunc *)p4;
3080: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3090: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
30a0: 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e 70 46  b, pVdbeFunc->pF
30b0: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 73 71  unc);.        sq
30c0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
30d0: 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e 63  uxData(pVdbeFunc
30e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
30f0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3100: 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20  pVdbeFunc);.    
3110: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3120: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
3130: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
3140: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
3150: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
3160: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
3170: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3180: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
3190: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
31a0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
31b0: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
31c0: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
31d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
31e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a    }.  }.}.../*.*
31f0: 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64  * Change N opcod
3200: 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61  es starting at a
3210: 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a  ddr to No-ops..*
3220: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
3230: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56  beChangeToNoop(V
3240: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
3250: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
3260: 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  p && p->aOp ){. 
3270: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
3280: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
3290: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
32a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69  = p->db;.    whi
32b0: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
32c0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
32d0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
32e0: 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  .p);.      memse
32f0: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
3300: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20  (pOp[0]));.     
3310: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
3320: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f  P_Noop;.      pO
3330: 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  p++;.    }.  }.}
3340: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
3350: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
3360: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
3370: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
3380: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
3390: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
33a0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
33b0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
33c0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
33d0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
33e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
33f0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
3400: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
3410: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
3420: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
3430: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
3440: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
3450: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
3460: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
3470: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
3480: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
3490: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
34a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
34b0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
34c0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
34d0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
34e0: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
34f0: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
3500: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
3510: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
3520: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
3530: 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45  *.** If n==P4_KE
3540: 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74  YINFO it means t
3550: 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69  hat zP4 is a poi
3560: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
3570: 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  o structure..** 
3580: 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f  A copy is made o
3590: 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  f the KeyInfo st
35a0: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d  ructure into mem
35b0: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
35c0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c  m.** sqlite3_mal
35d0: 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64  loc, to be freed
35e0: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
35f0: 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  s finalized..** 
3600: 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41  n==P4_KEYINFO_HA
3610: 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20  NDOFF indicates 
3620: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20  that zP4 points 
3630: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  to a KeyInfo str
3640: 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64  ucture.** stored
3650: 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   in memory that 
3660: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
3670: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
3680: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65  ite3_malloc. The
3690: 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75   .** caller shou
36a0: 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20  ld not free the 
36b0: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77  allocation, it w
36c0: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68 65  ill be freed whe
36d0: 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a  n the Vdbe is.**
36e0: 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a   finalized..** .
36f0: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
3700: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
3710: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
3720: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
3730: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
3740: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
3750: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
3760: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
3770: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
3780: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
3790: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
37a0: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
37b0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
37c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
37d0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
37e0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
37f0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
3800: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
3810: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
3820: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
3830: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
3840: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
3850: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
3860: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
3870: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
3880: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
3890: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
38a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
38b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
38c0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
38d0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
38e0: 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59 49 4e  f (n != P4_KEYIN
38f0: 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65  FO) {.      free
3900: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
3910: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
3920: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
3930: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3940: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
3950: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
3960: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
3970: 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 61  p - 1;.    if( a
3980: 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  ddr<0 ) return;.
3990: 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e    }.  pOp = &p->
39a0: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65  aOp[addr];.  fre
39b0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
39c0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
39d0: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
39e0: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
39f0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
3a00: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
3a10: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
3a20: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
3a30: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
3a40: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
3a50: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
3a60: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
3a70: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
3a80: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
3a90: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
3aa0: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
3ab0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
3ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
3ad0: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
3ae0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
3af0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
3b00: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
3b10: 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  O ){.    KeyInfo
3b20: 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
3b30: 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74  int nField, nByt
3b40: 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d  e;..    nField =
3b50: 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29   ((KeyInfo*)zP4)
3b60: 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42  ->nField;.    nB
3b70: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b  yte = sizeof(*pK
3b80: 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c  eyInfo) + (nFiel
3b90: 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79  d-1)*sizeof(pKey
3ba0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20  Info->aColl[0]) 
3bb0: 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b  + nField;.    pK
3bc0: 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  eyInfo = sqlite3
3bd0: 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  Malloc( nByte );
3be0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  .    pOp->p4.pKe
3bf0: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
3c00: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e  ;.    if( pKeyIn
3c10: 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  fo ){.      u8 *
3c20: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3c30: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3c40: 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a  o, zP4, nByte);.
3c50: 20 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72        aSortOrder
3c60: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f   = pKeyInfo->aSo
3c70: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69  rtOrder;.      i
3c80: 66 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b  f( aSortOrder ){
3c90: 0a 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66  .        pKeyInf
3ca0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  o->aSortOrder = 
3cb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
3cc0: 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  &pKeyInfo->aColl
3cd0: 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20  [nField];.      
3ce0: 20 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66    memcpy(pKeyInf
3cf0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61  o->aSortOrder, a
3d00: 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c  SortOrder, nFiel
3d10: 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
3d20: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3d30: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20  P4_KEYINFO;.    
3d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
3d50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d   = 1;.      pOp-
3d70: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
3d80: 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  USED;.    }.  }e
3d90: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
3da0: 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b  YINFO_HANDOFF ){
3db0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3dc0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3dd0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3de0: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c  4_KEYINFO;.  }el
3df0: 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20  se if( n<0 ){.  
3e00: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
3e10: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
3e20: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
3e30: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65  ned char)n;.  }e
3e40: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
3e50: 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53  0 ) n = sqlite3S
3e60: 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20  trlen30(zP4);.  
3e70: 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71    pOp->p4.z = sq
3e80: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
3e90: 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20  ->db, zP4, n);. 
3ea0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3eb0: 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P4_DYNAMIC;.  }
3ec0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
3ed0: 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  UG./*.** Change 
3ee0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
3ef0: 68 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  he the most rece
3f00: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
3f10: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
3f20: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
3f30: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
3f40: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
3f50: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
3f60: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
3f70: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
3f80: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
3f90: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
3fa0: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
3fb0: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
3fc0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
3fd0: 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56  te3VdbeComment(V
3fe0: 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  dbe *p, const ch
3ff0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
4000: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
4010: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
4020: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
4030: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4040: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
4050: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4060: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
4070: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4080: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
4090: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
40a0: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
40b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
40c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
40d0: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
40e0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
40f0: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
4100: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
4110: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
4120: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
4130: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
4140: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
4150: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
4160: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
4170: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
4180: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c  a_list ap;.  sql
4190: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70  ite3VdbeAddOp0(p
41a0: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73  , OP_Noop);.  as
41b0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
41c0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
41d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
41e0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
41f0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
4200: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
4210: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
4220: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
4230: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d   char **pz = &p-
4240: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
4250: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f  Comment;.    va_
4260: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
4270: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  t);.    sqlite3D
4280: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a  bFree(p->db, *pz
4290: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c  );.    *pz = sql
42a0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e  ite3VMPrintf(p->
42b0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  db, zFormat, ap)
42c0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
42d0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20  ;.  }.}.#endif  
42e0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
42f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
4300: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
4310: 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64  n address..*/.Vd
4320: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
4330: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
4340: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
4350: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
4360: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
4370: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  ;.  assert( (add
4380: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
4390: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
43a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
43b0: 20 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d   return ((addr>=
43c0: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
43d0: 29 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  )?(&p->aOp[addr]
43e0: 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ):0);.}..#if !de
43f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4400: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
4410: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
4420: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
4430: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
4440: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
4450: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
4460: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
4470: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
4480: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
4490: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
44a0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
44b0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
44c0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
44d0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
44e0: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
44f0: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
4500: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
4510: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
4520: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
4530: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
4540: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
4550: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
4560: 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a  _KEYINFO_STATIC:
4570: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
4580: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
4590: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
45a0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
45b0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
45c0: 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
45d0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
45e0: 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66  , zTemp, "keyinf
45f0: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  o(%d", pKeyInfo-
4600: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
4610: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
4620: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
4630: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
4640: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
4650: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
4660: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
4670: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
4680: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
4690: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
46a0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
46b0: 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
46c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
46d0: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
46e0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
46f0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
4700: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
4710: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4720: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4730: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
4740: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
4750: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
4760: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
4770: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4780: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
4790: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
47a0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
47b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
47c0: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
47d0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
47e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
47f0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
4800: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
4810: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
4820: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
4830: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
4840: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
4850: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4860: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4870: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
4880: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
4890: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
48a0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
48b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
48c0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
48d0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
48e0: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
48f0: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
4900: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4910: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
4920: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
4930: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4950: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
4960: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
4970: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
4980: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
4990: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
49a0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
49b0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
49c0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
49d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
49e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
49f0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
4a00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4a10: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4a20: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
4a30: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
4a40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4a50: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
4a60: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4a70: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4a80: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
4a90: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
4aa0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4ab0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
4ac0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4ad0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4ae0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
4af0: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
4b00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4b10: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4b20: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
4b30: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
4b40: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4b50: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
4b60: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20  EM_Null)==0 );. 
4b70: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
4b80: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
4b90: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
4ba0: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
4bb0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
4bc0: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4bd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4be0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4bf0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
4c00: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
4c10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
4c20: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
4c30: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
4c40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4c50: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4c60: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
4c70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4c80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
4c90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4ca0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
4cb0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
4cc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
4cd0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
4ce0: 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20  ->p4.pVtab;.    
4cf0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4d00: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4d10: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
4d20: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
4d30: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
4d40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4d50: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
4d60: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73  ARRAY: {.      s
4d70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4d80: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69  nTemp, zTemp, "i
4d90: 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20  ntarray");.     
4da0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4db0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
4dc0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
4dd0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
4de0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
4df0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
4e00: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
4e10: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
4e20: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
4e30: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
4e40: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
4e50: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
4e60: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
4e70: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
4e80: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
4e90: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f 0a 76 6f  s used..**.*/.vo
4ea0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
4eb0: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
4ec0: 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e 74 20 6d   int i){.  int m
4ed0: 61 73 6b 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ask;.  assert( i
4ee0: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e  >=0 && i<p->db->
4ef0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4f00: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
4f10: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4f20: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4f30: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4f40: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4f50: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4f60: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4f70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4f80: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4f90: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
4fa0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4fb0: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
4fc0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4fd0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4fe0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
4ff0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
5000: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
5010: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
5020: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
5030: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5040: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
5050: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
5060: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
5070: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
5080: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
5090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
50a0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
50b0: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
50c0: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
50d0: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
50e0: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
50f0: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
5100: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
5110: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
5120: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
5130: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
5140: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
5150: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
5160: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
5170: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
5180: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
5190: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
51a0: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
51b0: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
51c0: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
51d0: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
51e0: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
51f0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5200: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
5210: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
5220: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
5230: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
5240: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
5250: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
5260: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b  {.    Mem *pEnd;
5270: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5280: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38   = p->db;.    u8
5290: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
52a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
52b0: 64 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  d;.    for(pEnd=
52c0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
52d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
52e0: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
52f0: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
5300: 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f  ].db );..      /
5310: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
5320: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
5330: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
5340: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
5350: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
5360: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
5370: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
5380: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
5390: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
53a0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
53b0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
53c0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
53d0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
53e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
53f0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
5400: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
5410: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
5420: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
5430: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
5440: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
5450: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
5460: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
5470: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
5480: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
5490: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
54a0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
54b0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
54c0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
54d0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
54e0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
54f0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
5500: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
5510: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
5520: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
5530: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
5540: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
5550: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
5560: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
5570: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
5580: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
5590: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
55a0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
55b0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
55c0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
55d0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
55e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
55f0: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
5600: 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  _Dyn) ){.       
5610: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
5620: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
5630: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d   }else if( p->zM
5640: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
5650: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5660: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
5670: 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c          p->zMall
5680: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
5690: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
56a0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
56b0: 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  }.    db->malloc
56c0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
56d0: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23  failed;.  }.}..#
56e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
56f0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5700: 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
5710: 33 56 64 62 65 52 65 6c 65 61 73 65 42 75 66 66  3VdbeReleaseBuff
5720: 65 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ers(Vdbe *p){.  
5730: 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46  int ii;.  int nF
5740: 72 65 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ree = 0;.  asser
5750: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5760: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
5770: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d  ex) );.  for(ii=
5780: 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  1; ii<=p->nMem; 
5790: 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ii++){.    Mem *
57a0: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
57b0: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d 65  ii];.    if( pMe
57c0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
57d0: 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73  owSet ){.      s
57e0: 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61  qlite3RowSetClea
57f0: 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65  r(pMem->u.pRowSe
5800: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
5810: 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65  ( pMem->z && pMe
5820: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  m->flags&MEM_Dyn
5830: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
5840: 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b  ( !pMem->xDel );
5850: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  .      nFree += 
5860: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
5870: 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70 4d  ize(pMem->db, pM
5880: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 73 71  em->z);.      sq
5890: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
58a0: 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ase(pMem);.    }
58b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 46  .  }.  return nF
58c0: 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ree;.}.#endif..#
58d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
58e0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
58f0: 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20   Give a listing 
5900: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69  of the program i
5910: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
5920: 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  chine..**.** The
5930: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68   interface is th
5940: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
5950: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75  3VdbeExec().  Bu
5960: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  t instead of.** 
5970: 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65  running the code
5980: 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65  , it invokes the
5990: 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66   callback once f
59a0: 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  or each instruct
59b0: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61  ion..** This fea
59c0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
59d0: 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41  implement "EXPLA
59e0: 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  IN"..**.** When 
59f0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65  p->explain==1, e
5a00: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ach instruction 
5a10: 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e  is listed.  When
5a20: 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  .** p->explain==
5a30: 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61  2, only OP_Expla
5a40: 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  in instructions 
5a50: 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74  are listed and t
5a60: 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77  hese.** are show
5a70: 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  n in a different
5a80: 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70   format.  p->exp
5a90: 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20  lain==2 is used 
5aa0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
5ab0: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
5ac0: 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  AN..*/.int sqlit
5ad0: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
5ae0: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
5af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
5b00: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  DBE */.){.  sqli
5b10: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
5b20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
5b30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5b40: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
5b50: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
5b60: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61 73  ->aMem[1];..  as
5b70: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e  sert( p->explain
5b80: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67   );.  if( p->mag
5b90: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
5ba0: 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  UN ) return SQLI
5bb0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73 73  TE_MISUSE;.  ass
5bc0: 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d 3d  ert( db->magic==
5bd0: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
5be0: 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Y );.  assert( p
5bf0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5c00: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
5c10: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
5c20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
5c30: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
5c40: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
5c50: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
5c60: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
5c70: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
5c80: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
5c90: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
5ca0: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
5cb0: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
5cc0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
5cd0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
5ce0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
5cf0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
5d00: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
5d10: 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d  ay(pMem, p->nMem
5d20: 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
5d30: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
5d40: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
5d50: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
5d60: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
5d70: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
5d80: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
5d90: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
5da0: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
5db0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  ed.  */.    db->
5dc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
5dd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5de0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
5df0: 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d    do{.    i = p-
5e00: 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  >pc++;.  }while(
5e10: 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d 3e   i<p->nOp && p->
5e20: 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d  explain==2 && p-
5e30: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d  >aOp[i].opcode!=
5e40: 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20  OP_Explain );.  
5e50: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b  if( i>=p->nOp ){
5e60: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
5e70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
5e80: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
5e90: 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31  }else if( db->u1
5ea0: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29  .isInterrupted )
5eb0: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
5ec0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a  LITE_INTERRUPT;.
5ed0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5ee0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
5ef0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e  e3SetString(&p->
5f00: 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 73  zErrMsg, db, "%s
5f10: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
5f20: 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73  (p->rc));.  }els
5f30: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
5f40: 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26 70      Op *pOp = &p
5f50: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aOp[i];.    if
5f60: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20  ( p->explain==1 
5f70: 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ){.      pMem->f
5f80: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
5f90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
5fa0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5fb0: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  R;.      pMem->u
5fc0: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
5ff0: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
6000: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
6010: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6020: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
6030: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6040: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
6050: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
6060: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
6070: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
6080: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
6090: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
60a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
60b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
60c0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
60d0: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
60e0: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
60f0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6100: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
6110: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
6120: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6130: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
6140: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31  m->u.i = pOp->p1
6150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
6170: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79   */.    pMem->ty
6180: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
6190: 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  GER;.    pMem++;
61a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
61b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
61c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
61d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
61f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
6200: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
6210: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65  INTEGER;.    pMe
6220: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
6230: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
6240: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
6250: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
6260: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
6270: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70  /* P3 */.      p
62a0: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
62b0: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
62c0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    pMem++;.    }.
62d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
62e0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
62f0: 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20  , 32, 0) ){     
6300: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a         /* P4 */.
6310: 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c        p->db->mal
6320: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
6330: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6340: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
6350: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6360: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
6370: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
6380: 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  z = displayP4(pO
6390: 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b  p, pMem->z, 32);
63a0: 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d  .    if( z!=pMem
63b0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
63c0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
63d0: 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53  r(pMem, z, -1, S
63e0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
63f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6400: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
6410: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
6420: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
6430: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
6440: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
6450: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
6460: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
6470: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
6480: 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  XT;.    pMem++;.
6490: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
64a0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
64b0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
64c0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20  emGrow(pMem, 4, 
64d0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  0) ){.        p-
64e0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
64f0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  d = 1;.        r
6500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6510: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
6520: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6530: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
6540: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
6550: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
6560: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6570: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
6580: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
6590: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
65a0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
65b0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
65c0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
65d0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
65e0: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
65f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6600: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
6610: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
6620: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6630: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
6640: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
6650: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
6660: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
6670: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
6680: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
6690: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  .        pMem->e
66a0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
66b0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
66c0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
66d0: 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  XT;.      }else.
66e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
66f0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
6700: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
6730: 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  */.        pMem-
6740: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e  >type = SQLITE_N
6750: 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
6760: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
6770: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70  olumn = 8 - 5*(p
6780: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
6790: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
67a0: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
67b0: 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20  LITE_ROW;.  }.  
67c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
67d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
67e0: 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23  IT_EXPLAIN */..#
67f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
6800: 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  UG./*.** Print t
6810: 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 20  he SQL that was 
6820: 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65  used to generate
6830: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e   a VDBE program.
6840: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6850: 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62  VdbePrintSql(Vdb
6860: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
6870: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
6880: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
6890: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
68a0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
68b0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
68c0: 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20  pcode==OP_Trace 
68d0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
68e0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
68f0: 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a  r *z = pOp->p4.z
6900: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c  ;.    while( sql
6910: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20  ite3Isspace(*z) 
6920: 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74  ) z++;.    print
6930: 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  f("SQL: [%s]\n",
6940: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
6950: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
6960: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
6970: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
6980: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
6990: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ACE)./*.** Print
69a0: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73   an IOTRACE mess
69b0: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20  age showing SQL 
69c0: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  content..*/.void
69d0: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72   sqlite3VdbeIOTr
69e0: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  aceSql(Vdbe *p){
69f0: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e  .  int nOp = p->
6a00: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  nOp;.  VdbeOp *p
6a10: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  Op;.  if( sqlite
6a20: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65  3IoTrace==0 ) re
6a30: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  turn;.  if( nOp<
6a40: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
6a50: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
6a60: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
6a70: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
6a80: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
6a90: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
6aa0: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
6ab0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6ac0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
6ad0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
6ae0: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
6af0: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
6b00: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
6b10: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
6b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
6b30: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
6b40: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
6b50: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
6b60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
6b70: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
6b80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6b90: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
6ba0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
6bb0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
6bc0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
6bd0: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
6be0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
6bf0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
6c00: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
6c10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
6c20: 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  RACE */.../*.** 
6c30: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
6c40: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
6c50: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
6c60: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
6c70: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
6c80: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
6c90: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
6ca0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
6cb0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
6cc0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
6cd0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
6ce0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
6cf0: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
6d00: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
6d10: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
6d20: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
6d30: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
6d40: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
6d50: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
6d60: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
6d70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6d80: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
6d90: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
6da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6db0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
6dc0: 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20   int nVar,      
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27  /* Number of '?'
6df0: 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20   see in the SQL 
6e00: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
6e10: 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20  nt nMem,        
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6e30: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
6e40: 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63  y cells to alloc
6e50: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ate */.  int nCu
6e60: 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rsor,           
6e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6e80: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20  r of cursors to 
6e90: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
6ea0: 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20  t isExplain     
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6ec0: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
6ed0: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
6ee0: 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  present */.){.  
6ef0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
6f00: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
6f10: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
6f20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
6f30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
6f40: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
6f50: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
6f60: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
6f70: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6f80: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
6f90: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
6fa0: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
6fb0: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
6fc0: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
6fd0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
6fe0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
6ff0: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
7000: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
7010: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
7020: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
7030: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
7040: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
7050: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
7060: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
7070: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
7080: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
7090: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
70a0: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
70b0: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
70c0: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
70d0: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
70e0: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
70f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7100: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
7110: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
7120: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
7130: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
7140: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
7150: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
7160: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
7170: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
7180: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
7190: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
71a0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
71b0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
71c0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
71d0: 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72 20  ation space for 
71e0: 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a  registers..  */.
71f0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30    if( p->aMem==0
7200: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67   ){.    int nArg
7210: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ;       /* Maxim
7220: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
7230: 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73  s passed to a us
7240: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  er function. */.
7250: 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c      resolveP2Val
7260: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
7270: 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e     assert( nVar>
7280: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73  =0 );.    if( is
7290: 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  Explain && nMem<
72a0: 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65 6d  10 ){.      nMem
72b0: 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20   = 10;.    }.   
72c0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c 69 74   p->aMem = sqlit
72d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
72e0: 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d 65 6d 2a  b,.        nMem*
72f0: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
7300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
7310: 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61  m */.      + nVa
7320: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20  r*sizeof(Mem)   
7330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
7340: 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e  Var */.      + n
7350: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7370: 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20 20   apArg */.      
7380: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68  + nVar*sizeof(ch
7390: 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  ar*)            
73a0: 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20 20   /* azVar */.   
73b0: 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69 7a     + nCursor*siz
73c0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29  eof(VdbeCursor*)
73d0: 2b 31 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f 0a  +1  /* apCsr */.
73e0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
73f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7400: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65   ){.      p->aMe
7410: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
7420: 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20   /* aMem[] goes 
7430: 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a  from 1..nMem */.
7440: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
7450: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 2f 2a 20  nMem;        /* 
7460: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
7470: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
7480: 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d 3e    p->aVar = &p->
7490: 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20 20  aMem[nMem+1];.  
74a0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56      p->nVar = nV
74b0: 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b 56  ar;.      p->okV
74c0: 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  ar = 0;.      p-
74d0: 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a 29  >apArg = (Mem**)
74e0: 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b 0a  &p->aVar[nVar];.
74f0: 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d        p->azVar =
7500: 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70 41   (char**)&p->apA
7510: 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[nArg];.      
7520: 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62 65  p->apCsr = (Vdbe
7530: 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a 56  Cursor**)&p->azV
7540: 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20  ar[nVar];.      
7550: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
7560: 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  rsor;.      for(
7570: 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b  n=0; n<nVar; n++
7580: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 56  ){.        p->aV
7590: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
75a0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  M_Null;.        
75b0: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
75c0: 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  db;.      }.    
75d0: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
75e0: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
75f0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
7600: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
7610: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
7620: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
7630: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
7640: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
7650: 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d  .  for(n=1; n<p-
7660: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
7670: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
7680: 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  [n].db==db );.  
7690: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70  }.#endif..  p->p
76a0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
76b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
76c0: 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30 3b  ->uniqueCnt = 0;
76d0: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
76e0: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
76f0: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
7700: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
7710: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
7720: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
7730: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
7740: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
7750: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
7760: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f  at = 255;.  p->o
7770: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d  penedStatement =
7780: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
7790: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
77a0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
77b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
77c0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
77d0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
77e0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
77f0: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
7800: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
7810: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
7820: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
7830: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
7840: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
7850: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
7860: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
7870: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
7880: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
7890: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
78a0: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
78b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
78c0: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
78d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
78e0: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
78f0: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
7900: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
7910: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
7920: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
7930: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
7940: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
7950: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
7960: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
7970: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
7980: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
7990: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
79a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
79b0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
79c0: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
79d0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
79e0: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
79f0: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
7a00: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
7a10: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
7a20: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
7a30: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
7a40: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
7a50: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
7a60: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
7a70: 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20  etyOff(p->db);. 
7a80: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
7a90: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
7aa0: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
7ab0: 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62  e3SafetyOn(p->db
7ac0: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
7ad0: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
7ae0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43  #endif.  if( !pC
7af0: 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61  x->ephemPseudoTa
7b00: 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
7b10: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
7b20: 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pCx->pData);.  }
7b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
7b40: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
7b50: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
7b60: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
7b70: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
7b80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b90: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
7ba0: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
7bb0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
7bc0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
7bd0: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
7be0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7bf0: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
7c00: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
7c10: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
7c20: 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26 20  ;.    if( pC && 
7c30: 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f  (!p->inVtabMetho
7c40: 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62 43  d || !pC->pVtabC
7c50: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
7c60: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7c70: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
7c80: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
7c90: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
7ca0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
7cb0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
7cc0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
7cd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
7ce0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
7cf0: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
7d00: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
7d10: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
7d20: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
7d30: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
7d40: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
7d50: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
7d60: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
7d70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7d80: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
7d90: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
7da0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7db0: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
7dc0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
7dd0: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
7de0: 73 28 70 29 3b 0a 20 20 66 6f 72 28 70 4d 65 6d  s(p);.  for(pMem
7df0: 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 69 3d  =&p->aMem[1], i=
7e00: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
7e10: 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
7e20: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
7e30: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b   & MEM_RowSet ){
7e40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f  .      sqlite3Ro
7e50: 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d 3e  wSetClear(pMem->
7e60: 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20 20  u.pRowSet);.    
7e70: 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  }.    MemSetType
7e80: 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e  Flag(pMem, MEM_N
7e90: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ull);.  }.  rele
7ea0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
7eb0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
7ec0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74  );.  if( p->cont
7ed0: 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  extStack ){.    
7ee0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7ef0: 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  , p->contextStac
7f00: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
7f10: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
7f20: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
7f30: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
7f40: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
7f50: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
7f60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
7f70: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
7f80: 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
7f90: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a  sultSet = 0;.}..
7fa0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
7fb0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
7fc0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
7fd0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
7fe0: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
7ff0: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
8000: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
8010: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
8020: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
8030: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
8040: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
8050: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
8060: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
8070: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
8080: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
8090: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
80a0: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
80b0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
80c0: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
80d0: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
80e0: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
80f0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
8100: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8110: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8120: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
8130: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
8140: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
8150: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8160: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
8170: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
8180: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
8190: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
81a0: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
81b0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
81c0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
81d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
81e0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
81f0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
8200: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
8210: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
8220: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
8230: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
8240: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
8250: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
8260: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
8270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8280: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
8290: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
82a0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
82b0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
82c0: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
82d0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
82e0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
82f0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
8300: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
8310: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
8320: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
8330: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
8340: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
8350: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
8360: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
8370: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
8380: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
8390: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
83a0: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
83b0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
83c0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
83d0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
83e0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
83f0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
8400: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
8410: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
8420: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8430: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
8440: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
8470: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
8480: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
84b0: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
84c0: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
84d0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
84e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
84f0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
8500: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
8510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8520: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
8530: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8540: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
8550: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
8560: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8580: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
8590: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
85a0: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
85b0: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
85c0: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
85d0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
85e0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
85f0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
8600: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
8610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
8620: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
8630: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
8640: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
8650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8660: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
8670: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
8680: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
8690: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
86a0: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
86b0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
86c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
86d0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
86e0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
86f0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
8700: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
8710: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
8720: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
8730: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
8740: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8750: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
8760: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
8770: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
8780: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
8790: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
87a0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
87b0: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
87c0: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
87d0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
87e0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
87f0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
8800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
8810: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
8820: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
8830: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8840: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
8850: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
8860: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
8870: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
8880: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
8890: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
88a0: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
88b0: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
88c0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
88d0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
88e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
88f0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
8900: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
8910: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
8920: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
8930: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
8940: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
8950: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
8960: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
8970: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
8980: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
8990: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
89a0: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
89b0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
89c0: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
89d0: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
89e0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
89f0: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
8a00: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
8a10: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
8a20: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
8a30: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
8a40: 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  c(db, &p->zErrMs
8a50: 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
8a60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8a70: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
8a80: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
8a90: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
8aa0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
8ab0: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
8ac0: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
8ad0: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
8ae0: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
8af0: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
8b00: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
8b10: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
8b20: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
8b30: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
8b40: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
8b50: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
8b60: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
8b70: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
8b80: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
8b90: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
8ba0: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
8bb0: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
8bc0: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
8bd0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
8be0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
8bf0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8c00: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
8c10: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
8c20: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
8c30: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
8c40: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
8c50: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
8c60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
8c70: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
8c80: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
8c90: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
8ca0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
8cb0: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
8cc0: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
8cd0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
8ce0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
8cf0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8d00: 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 29 3d  ITE_CommitBusy)=
8d10: 3d 30 20 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  =0 );.    db->fl
8d20: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f  ags |= SQLITE_Co
8d30: 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20 28 76  mmitBusy;.    (v
8d40: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
8d50: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
8d60: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8d70: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8d80: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
8d90: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
8da0: 6e 28 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66  n(db);.    db->f
8db0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
8dc0: 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20  CommitBusy;.    
8dd0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
8de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8df0: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
8e00: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
8e10: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
8e20: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
8e30: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
8e40: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
8e50: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
8e60: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
8e70: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
8e80: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
8e90: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
8ea0: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
8eb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
8ec0: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
8ed0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
8ee0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
8ef0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
8f00: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
8f10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
8f20: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
8f30: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
8f40: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
8f50: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
8f60: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
8f70: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
8f80: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
8f90: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
8fa0: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
8fb0: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
8fc0: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
8fd0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
8fe0: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
8ff0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
9000: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
9010: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
9020: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9030: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9040: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9050: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
9060: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
9070: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9080: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
9090: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
90a0: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
90b0: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
90c0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
90d0: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
90e0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
90f0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
9100: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
9110: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
9120: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
9130: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
9140: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
9150: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
9160: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
9170: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
9180: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
9190: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
91a0: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
91b0: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
91c0: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
91d0: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
91e0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
91f0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9200: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
9210: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9220: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9230: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
9240: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9250: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9260: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
9270: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9280: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9290: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
92a0: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
92b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
92c0: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
92d0: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
92e0: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
92f0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
9300: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
9310: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
9320: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
9330: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
9340: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
9350: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
9360: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
9370: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
9380: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
9390: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
93a0: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
93b0: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
93c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
93d0: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
93e0: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
93f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
9400: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9410: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
9420: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
9430: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
9440: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
9450: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
9460: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
9470: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
9480: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   res;..    /* Se
9490: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
94a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
94b0: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
94c0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
94d0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
94e0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
94f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
9500: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
9510: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
9520: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
9530: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
9540: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
9550: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
9560: 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66   iRandom&0x7ffff
9570: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
9580: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
9590: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
95a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
95b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
95c0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
95d0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
95e0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
95f0: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
9600: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
9610: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
9620: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9630: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
9640: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
9650: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
9660: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
9670: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
9680: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
9690: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
96a0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
96b0: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
96c0: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
96d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
96e0: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
96f0: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
9700: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
9710: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
9720: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9730: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9740: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
9750: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9760: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
9770: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
9780: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
9790: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
97a0: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
97b0: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
97c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
97d0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
97e0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
97f0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
9800: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
9810: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9820: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
9830: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
9840: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
9850: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
9860: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9870: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
9880: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
9890: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
98a0: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
98b0: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
98c0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
98d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
98e0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
98f0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9900: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
9910: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
9920: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
9930: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
9940: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9950: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
9960: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
9970: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
9980: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
9990: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
99a0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
99b0: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
99c0: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
99d0: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
99e0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
99f0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
9a00: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
9a10: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
9a20: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
9a30: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
9a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
9a50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9a60: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
9a70: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
9a80: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
9a90: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
9aa0: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
9ab0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
9ac0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9ad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9ae0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
9af0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
9b00: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
9b10: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9b20: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
9b30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9b40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9b50: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
9b60: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
9b70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9b80: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
9b90: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
9ba0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
9bb0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
9bc0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
9bd0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
9be0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
9bf0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
9c00: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
9c10: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
9c20: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9c30: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
9c40: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
9c50: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
9c60: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
9c70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
9c80: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
9c90: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
9ca0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
9cb0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
9cc0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
9cd0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
9ce0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
9cf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9d00: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
9d10: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
9d20: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
9d30: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
9d40: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
9d50: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
9d60: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
9d70: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
9d80: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9d90: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
9da0: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
9db0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
9dc0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9dd0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
9de0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
9df0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
9e00: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
9e10: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
9e20: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
9e30: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
9e40: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
9e50: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
9e60: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
9e70: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
9e80: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
9e90: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
9ea0: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
9eb0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
9ec0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
9ed0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
9ee0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
9ef0: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
9f00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
9f10: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
9f20: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
9f30: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
9f40: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
9f50: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
9f60: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
9f70: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9f80: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9f90: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9fa0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9fb0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9fc0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
9fd0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
9fe0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9ff0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
a000: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
a010: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a020: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a030: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
a040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
a050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a060: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
a070: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a080: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
a090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
a0a0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
a0b0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
a0c0: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
a0d0: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
a0e0: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
a0f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
a100: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
a110: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
a120: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
a130: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
a140: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
a150: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
a160: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
a170: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
a180: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
a190: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a1a0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
a1b0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
a1c0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
a1d0: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
a1e0: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
a1f0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
a200: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
a210: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
a220: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
a230: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
a240: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
a250: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
a260: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
a270: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
a280: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
a290: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
a2a0: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
a2b0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
a2c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
a2d0: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
a2e0: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
a2f0: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
a300: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
a310: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
a320: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
a330: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
a340: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
a350: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
a360: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
a370: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
a380: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
a390: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
a3a0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a3b0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
a3c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
a3d0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
a3e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
a3f0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
a400: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
a410: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a420: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
a430: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
a440: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
a450: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
a460: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
a470: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
a480: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
a490: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
a4a0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
a4b0: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
a4c0: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
a4d0: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
a4e0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
a4f0: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
a500: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
a510: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
a520: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
a530: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
a540: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
a550: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
a560: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
a570: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
a580: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
a590: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
a5a0: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
a5b0: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
a5c0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
a5d0: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
a5e0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
a5f0: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
a600: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
a610: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
a620: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
a630: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
a640: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
a650: 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
a660: 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
a670: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
a680: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
a690: 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  RUN && p->pc>=0 
a6a0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
a6b0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
a6c0: 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
a6d0: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e++;.    }.    p
a6e0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
a6f0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
a700: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
a710: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t );.  assert( n
a720: 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65  Write==db->write
a730: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
a740: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
a750: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
a760: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
a770: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
a780: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
a790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
a7a0: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
a7b0: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
a7c0: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
a7d0: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
a7e0: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
a7f0: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
a800: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
a810: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
a820: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
a830: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
a840: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
a850: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
a860: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
a870: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
a880: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
a890: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
a8a0: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
a8b0: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
a8c0: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
a8d0: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
a8e0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
a8f0: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
a900: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
a910: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
a920: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
a930: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
a940: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
a950: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
a960: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
a970: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
a980: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
a990: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
a9a0: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
a9b0: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
a9c0: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
a9d0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
a9e0: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
a9f0: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
aa00: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
aa10: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
aa20: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
aa30: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
aa40: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
aa50: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
aa60: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
aa70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
aa80: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
aa90: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
aaa0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
aab0: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
aac0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
aad0: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
aae0: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
aaf0: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
ab00: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
ab10: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
ab20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ab30: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
ab40: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
ab50: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
ab60: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
ab70: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
ab80: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
ab90: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
aba0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
abb0: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
abc0: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
abd0: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
abe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
abf0: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
ac00: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
ac10: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
ac20: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
ac30: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
ac40: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
ac50: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
ac60: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
ac70: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
ac80: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
ac90: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
aca0: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
acb0: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
acc0: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
acd0: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
ace0: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
acf0: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
ad00: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
ad10: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
ad20: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
ad30: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
ad40: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
ad50: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
ad60: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
ad70: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
ad80: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
ad90: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
ada0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
adb0: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
adc0: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
add0: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
ade0: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
adf0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63   */.  int isSpec
ae00: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
ae10: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
ae20: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f  rue if SQLITE_NO
ae30: 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a  MEM or IOERR */.
ae40: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
ae50: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
ae60: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
ae70: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
ae80: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
ae90: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
aea0: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
aeb0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
aec0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
aed0: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
aee0: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
aef0: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
af00: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
af10: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
af20: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
af30: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
af40: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
af50: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
af60: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
af70: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
af80: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
af90: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
afa0: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
afb0: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
afc0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
afd0: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
afe0: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
aff0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
b000: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
b010: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
b020: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
b030: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
b040: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
b050: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
b060: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
b070: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
b080: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
b090: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b0a0: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
b0b0: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
b0c0: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69  iveVtabs(p);.  i
b0d0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
b0e0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
b0f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b100: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
b110: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
b120: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
b130: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
b140: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
b150: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
b160: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
b170: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
b180: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
b190: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
b1a0: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20  m p->rc */..    
b1b0: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
b1c0: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
b1d0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
b1e0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b1f0: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
b200: 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  aMutex);..    /*
b210: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
b220: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
b230: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
b240: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
b250: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
b260: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
b270: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
b280: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
b2b0: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
b2c0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
b2d0: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
b2e0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
b2f0: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
b300: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
b310: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
b320: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
b330: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
b340: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
b350: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
b360: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
b370: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
b380: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
b390: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
b3a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
b3b0: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
b3c0: 42 4c 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75 73  BLOCKED && p->us
b3d0: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
b3f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b400: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b410: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
b420: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
b430: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d      }else if( (m
b440: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b450: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
b460: 46 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20  FULL).          
b470: 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75           && p->u
b480: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
b490: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b4a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b4b0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
b4c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b4d0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
b4e0: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
b4f0: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
b500: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
b510: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
b520: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
b530: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
b540: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
b550: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
b560: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
b570: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
b580: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b590: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b5a0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b5b0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
b5c0: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
b5d0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
b5e0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
b5f0: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
b600: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
b610: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b620: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b630: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
b640: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
b650: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
b660: 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74  y active vdbe, t
b670: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f  hen.    ** we do
b680: 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
b690: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
b6a0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b6b0: 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
b6c0: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
b6d0: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
b6e0: 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
b6f0: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
b700: 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
b710: 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
b720: 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
b730: 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
b740: 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
b750: 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
b760: 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
b770: 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70  writeVdbeCnt==(p
b780: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
b790: 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61       && (db->fla
b7a0: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d 6d  gs & SQLITE_Comm
b7b0: 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20 20 29  itBusy)==0.    )
b7c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b7d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b7e0: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
b7f0: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
b800: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
b810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
b820: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
b830: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
b840: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
b850: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  s .        ** su
b860: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
b870: 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
b880: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
b890: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
b8a0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
b8b0: 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ired..        */
b8c0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
b8d0: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
b8e0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   p);.        if(
b8f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b910: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b920: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
b930: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
b940: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b950: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
b960: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
b970: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b980: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
b990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b9a0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b9b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b9c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b9d0: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
b9e0: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
b9f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ba00: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ba10: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
ba20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
ba30: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
ba40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
ba50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
ba60: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
ba70: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
ba80: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
ba90: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
baa0: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
bab0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
bac0: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
bad0: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
bae0: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
baf0: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
bb00: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
bb10: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
bb20: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
bb30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
bb40: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
bb50: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
bb60: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
bb70: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
bb80: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
bb90: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
bba0: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
bbb0: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
bbc0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
bbd0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78  }.  .    /* If x
bbe0: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
bbf0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
bc00: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
bc10: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a  RollbackStmt or.
bc20: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
bc30: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
bc40: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65  all it once on e
bc50: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
bc60: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
bc70: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72      ** and the r
bc80: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
bc90: 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  ill SQLITE_OK, s
bca0: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
bcb0: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20  de to the new.  
bcc0: 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65    ** error value
bcd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
bce0: 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20  ert(!xFunc ||.  
bcf0: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
bd00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
bd10: 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  t ||.      xFunc
bd20: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  ==sqlite3BtreeRo
bd30: 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29  llbackStmt.    )
bd40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78  ;.    for(i=0; x
bd50: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
bd60: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
bd70: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74  int rc;.      Bt
bd80: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
bd90: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
bda0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
bdb0: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
bdc0: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
bdd0: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
bde0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
bdf0: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
be00: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
be10: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
be20: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be30: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
be40: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
be50: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
be60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
be80: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
be90: 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
bea0: 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
beb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  the statement wa
bec0: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20  s committed, .  
bed0: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61    ** set the cha
bee0: 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge counter. .  
bef0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
bf00: 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70  changeCntOn && p
bf10: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
bf20: 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78   if( !xFunc || x
bf30: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
bf40: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a  eeCommitStmt ){.
bf50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bf60: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
bf70: 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
bf80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bf90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
bfa0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
bfb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bfc0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
bfd0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
bfe0: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
bff0: 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
c000: 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
c010: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
c020: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
c030: 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   && db->flags&SQ
c040: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
c050: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
c060: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
c070: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
c080: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
c090: 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
c0a0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
c0b0: 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
c0c0: 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
c0d0: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
c0e0: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
c0f0: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
c100: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ex);.  }..  /* W
c110: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
c120: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
c130: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
c140: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
c150: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
c160: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
c170: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
c180: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
c190: 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  nly ){.      db-
c1a0: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b  >writeVdbeCnt--;
c1b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
c1c0: 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
c1d0: 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56  eCnt>=db->writeV
c1e0: 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20  dbeCnt );.  }.  
c1f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
c200: 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
c210: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
c220: 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
c230: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c240: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
c250: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
c260: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
c270: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
c280: 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
c290: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
c2a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
c2b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
c2c0: 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
c2d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
c2e0: 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
c2f0: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
c300: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c310: 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
c320: 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
c330: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
c340: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
c350: 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
c360: 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
c370: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
c380: 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
c390: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
c3a0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
c3b0: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
c3c0: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
c3d0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
c3e0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
c3f0: 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
c400: 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
c410: 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
c420: 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
c430: 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
c440: 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
c450: 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
c460: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
c470: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
c480: 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
c490: 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
c4a0: 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
c4b0: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
c4c0: 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
c4d0: 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
c4e0: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
c4f0: 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
c500: 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
c510: 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
c520: 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
c530: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
c540: 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
c550: 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
c560: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
c570: 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
c580: 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
c590: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  now..  */.  (voi
c5a0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
c5b0: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
c5c0: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28  VdbeHalt(p);.  (
c5d0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
c5e0: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
c5f0: 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
c600: 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
c610: 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
c620: 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
c630: 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
c640: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
c650: 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
c660: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
c670: 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
c680: 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
c690: 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
c6a0: 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
c6b0: 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
c6c0: 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
c6d0: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
c6e0: 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
c6f0: 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
c700: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
c710: 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
c720: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
c730: 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d      if( p->zErrM
c740: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
c750: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
c760: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
c770: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
c780: 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  (db->pErr,-1,p->
c790: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
c7a0: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
c7b0: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  IENT);.      sql
c7c0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
c7d0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d  loc();.      db-
c7e0: 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63  >errCode = p->rc
c7f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
c800: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
c810: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rMsg);.      p->
c820: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
c830: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
c840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c850: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
c860: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
c870: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c880: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
c890: 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  K, 0);.    }.  }
c8a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
c8b0: 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
c8c0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
c8d0: 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
c8e0: 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
c8f0: 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
c900: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
c910: 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
c920: 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
c930: 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
c940: 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
c950: 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
c960: 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
c970: 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
c980: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
c990: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
c9a0: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
c9b0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
c9c0: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
c9d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
c9e0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
c9f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
ca00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ca10: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
ca20: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
ca30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
ca40: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
ca50: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
ca60: 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
ca70: 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
ca80: 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
ca90: 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
caa0: 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
cab0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
cac0: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
cad0: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
cae0: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
caf0: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
cb00: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
cb10: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
cb20: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
cb30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
cb40: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
cb50: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
cb60: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
cb70: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
cb80: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
cb90: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
cba0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cbb0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
cbc0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
cbd0: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
cbe0: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
cbf0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
cc00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
cc10: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
cc20: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
cc30: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
cc40: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
cc50: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
cc60: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
cc70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
cc80: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
cc90: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
cca0: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
ccb0: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
ccc0: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
ccd0: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
cce0: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
ccf0: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
cd00: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
cd10: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
cd20: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
cd30: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
cd40: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
cd50: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
cd60: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
cd70: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
cd80: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
cd90: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
cda0: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
cdb0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
cdc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
cdd0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
cde0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
cdf0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
ce00: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
ce10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ce20: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
ce30: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
ce40: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
ce50: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
ce60: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
ce70: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
ce80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce90: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
cea0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
ceb0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
cec0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
ced0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
cee0: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
cef0: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
cf00: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
cf10: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
cf20: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
cf30: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
cf40: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
cf50: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
cf60: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
cf70: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
cf80: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
cf90: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
cfa0: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
cfb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cfc0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
cfd0: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
cfe0: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
cff0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
d000: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
d010: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
d020: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
d030: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
d040: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
d050: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
d060: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
d070: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
d080: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
d090: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
d0a0: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
d0b0: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
d0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
d0d0: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
d0e0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d0f0: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
d100: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
d110: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d120: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
d130: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
d140: 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  db;..  if( p==0 
d150: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
d160: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
d170: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
d180: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
d190: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
d1a0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
d1b0: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
d1c0: 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
d1d0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
d1e0: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
d1f0: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
d200: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
d210: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20   }.  if( p->aOp 
d220: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  ){.    Op *pOp =
d230: 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72   p->aOp;.    for
d240: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
d250: 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i++, pOp++){.   
d260: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
d270: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
d280: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
d290: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
d2a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d2b0: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
d2c0: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
d2d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d2e0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f  DbFree(db, p->aO
d2f0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  p);.  }.  releas
d300: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
d310: 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73  r, p->nVar);.  s
d320: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d330: 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 69   p->aLabel);.  i
d340: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
d350: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d360: 64 62 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29  db, &p->aMem[1])
d370: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
d380: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
d390: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
d3a0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
d3b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d3c0: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
d3d0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d3e0: 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
d3f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
d400: 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73  _MAGIC_DEAD;.  s
d410: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d420: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   p);.}../*.** If
d430: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
d440: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
d450: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
d460: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
d470: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
d480: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
d490: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
d4a0: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
d4b0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
d4c0: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
d4d0: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
d4e0: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
d4f0: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
d500: 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
d510: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
d520: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
d530: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
d540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d550: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
d560: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
d570: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
d580: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
d590: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
d5a0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
d5b0: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
d5c0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
d5d0: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
d5e0: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
d5f0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d600: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
d610: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
d620: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
d630: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
d640: 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b 0a   = res==0 ?1:0;.
d650: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
d660: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d670: 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e  te3BtreeNext(p->
d680: 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
d690: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
d6a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d6b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d6c0: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
d6d0: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
d6e0: 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66  endif.    p->def
d6f0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
d700: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61  .    p->cacheSta
d710: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
d720: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  E;.  }else if( p
d730: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
d740: 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20   int hasMoved;. 
d750: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
d760: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
d770: 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
d780: 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20  r, &hasMoved);. 
d790: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
d7a0: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68  rn rc;.    if( h
d7b0: 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20  asMoved ){.     
d7c0: 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
d7d0: 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
d7e0: 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20       p->nullRow 
d7f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
d800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d810: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
d820: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
d830: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
d840: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d850: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d860: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
d870: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d880: 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
d890: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
d8a0: 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
d8b0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
d8c0: 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
d8d0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
d8e0: 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
d8f0: 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
d900: 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
d910: 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
d920: 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
d930: 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
d940: 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
d950: 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
d960: 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
d970: 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
d980: 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
d990: 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
d9a0: 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
d9b0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
d9c0: 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
d9d0: 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
d9e0: 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
d9f0: 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
da00: 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
da10: 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
da20: 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
da30: 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
da40: 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
da50: 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
da60: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
da70: 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
da80: 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
da90: 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
daa0: 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
dab0: 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
dac0: 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
dad0: 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
dae0: 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
daf0: 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  erately..**.** T
db00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
db10: 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
db20: 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
db30: 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
db40: 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
db50: 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
db60: 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
db70: 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
db80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
dba0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
dbb0: 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
dbe0: 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
dc00: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
dc10: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
dc20: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
dc30: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
dc40: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
dc50: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
dc80: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
dc90: 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
dcb0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
dcc0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
dcd0: 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
dce0: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
dcf0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
dd00: 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
dd30: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
dd40: 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
dd50: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
dd60: 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
dd70: 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
dda0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
ddb0: 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
dde0: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
ddf0: 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
de00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de10: 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
de20: 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
de30: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
de40: 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
de50: 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
de60: 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
de70: 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
de80: 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
de90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
dea0: 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
deb0: 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
dec0: 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
ded0: 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
dee0: 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
def0: 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
df00: 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
df10: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
df20: 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
df30: 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
df40: 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
df50: 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
df60: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
df70: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
df80: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74  e_format){.  int
df90: 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66   flags = pMem->f
dfa0: 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a  lags;.  int n;..
dfb0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
dfc0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
dfd0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
dfe0: 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
dff0: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
e000: 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
e010: 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
e020: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
e030: 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
e040: 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
e050: 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
e060: 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
e070: 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
e080: 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d     if( file_form
e090: 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d  at>=4 && (i&1)==
e0a0: 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  i ){.      retur
e0b0: 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20  n 8+(u32)i;.    
e0c0: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
e0d0: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
e0e0: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
e0f0: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
e100: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
e110: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
e120: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
e130: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
e140: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
e150: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
e160: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
e170: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
e180: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
e190: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
e1a0: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
e1b0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
e1c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
e1d0: 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
e1e0: 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
e1f0: 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  n = pMem->n;.  i
e200: 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
e210: 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
e220: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
e230: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
e240: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
e250: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
e260: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
e270: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
e280: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
e290: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
e2a0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
e2b0: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
e2c0: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
e2d0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e2e0: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
e2f0: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
e300: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
e310: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
e320: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
e330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
e340: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
e350: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
e360: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
e370: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
e380: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
e390: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
e3a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
e3b0: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
e3c0: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
e3d0: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
e3e0: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
e3f0: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
e400: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
e410: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
e420: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
e430: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
e440: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
e450: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
e460: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
e470: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
e480: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
e490: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
e4a0: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
e4b0: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
e4c0: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
e4d0: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
e4e0: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
e4f0: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
e500: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
e510: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
e520: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
e530: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
e540: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
e550: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
e560: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
e570: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
e580: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
e590: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
e5a0: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
e5b0: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
e5c0: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
e5d0: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
e5e0: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
e5f0: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
e600: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
e610: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
e620: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
e630: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
e640: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
e650: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
e660: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
e670: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
e680: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
e690: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
e6a0: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
e6b0: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
e6c0: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
e6d0: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
e6e0: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
e6f0: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
e700: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
e710: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
e720: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
e730: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
e740: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
e750: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
e760: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
e770: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
e780: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
e790: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
e7a0: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
e7b0: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
e7c0: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
e7d0: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
e7e0: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
e7f0: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
e800: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
e810: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
e820: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
e830: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
e840: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
e850: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
e860: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
e870: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
e880: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
e890: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
e8a0: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
e8b0: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
e8c0: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
e8d0: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
e8e0: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
e8f0: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
e900: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
e910: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
e920: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
e930: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
e940: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
e950: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
e960: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
e970: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
e980: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
e990: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
e9a0: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
e9b0: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
e9c0: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
e9d0: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
e9e0: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
e9f0: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
ea00: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
ea10: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
ea20: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
ea30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
ea40: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
ea50: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
ea60: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
ea70: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
ea80: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
ea90: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
eaa0: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
eab0: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
eac0: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
ead0: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
eae0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
eaf0: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
eb00: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
eb10: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
eb20: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
eb30: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
eb40: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
eb50: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
eb60: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
eb70: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
eb80: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
eb90: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
eba0: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
ebb0: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
ebc0: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
ebd0: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
ebe0: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
ebf0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
ec00: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
ec10: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
ec20: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
ec30: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
ec40: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
ec50: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
ec60: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
ec70: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
ec80: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
ec90: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
eca0: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
ecb0: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
ecc0: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
ecd0: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
ece0: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
ecf0: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
ed00: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
ed10: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
ed20: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
ed30: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
ed40: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
ed50: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
ed60: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
ed70: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
ed80: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
ed90: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
eda0: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
edb0: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
edc0: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
edd0: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
ede0: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
edf0: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
ee00: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
ee10: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
ee20: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
ee30: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
ee40: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
ee50: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
ee60: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
ee70: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
ee80: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
ee90: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
eea0: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
eeb0: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
eec0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
eed0: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
eee0: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
eef0: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
ef00: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
ef10: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
ef20: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
ef30: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
ef40: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
ef50: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
ef60: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
ef70: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
ef80: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
ef90: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
efa0: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
efb0: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
efc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
efd0: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
efe0: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
eff0: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
f000: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
f010: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
f020: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
f030: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f040: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
f050: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
f060: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
f070: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
f080: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
f090: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
f0a0: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
f0b0: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
f0c0: 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46  [i] = (u8)(v&0xF
f0d0: 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20  F);.      v >>= 
f0e0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  8;.    }.    ret
f0f0: 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
f100: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
f110: 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
f120: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
f130: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
f140: 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
f150: 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
f160: 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
f170: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
f180: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f190: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f1a0: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
f1b0: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
f1c0: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
f1d0: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
f1e0: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
f1f0: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
f200: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
f210: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
f220: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a  en += pMem->u.nZ
f230: 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  ero;.      if( l
f240: 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20  en>nBuf ){.     
f250: 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20     len = nBuf;. 
f260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
f270: 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e  set(&buf[pMem->n
f280: 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e  ], 0, len-pMem->
f290: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  n);.    }.    re
f2a0: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
f2b0: 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
f2c0: 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
f2d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
f2e0: 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65  *.** Deserialize
f2f0: 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70   the data blob p
f300: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66  ointed to by buf
f310: 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20   as serial type 
f320: 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61  serial_type.** a
f330: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73  nd store the res
f340: 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65  ult in pMem.  Re
f350: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
f360: 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a  of bytes read..*
f370: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  / .int sqlite3Vd
f380: 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
f390: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
f3a0: 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
f3b0: 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
f3c0: 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
f3d0: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f3f0: 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
f400: 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
f410: 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f430: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
f440: 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
f450: 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
f460: 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
f470: 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
f480: 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
f490: 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
f4a0: 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
f4b0: 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
f4c0: 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
f4d0: 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c  ase 0: {  /* NUL
f4e0: 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  L */.      pMem-
f4f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
f500: 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
f510: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
f520: 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
f530: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f540: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f550: 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  = (signed char)b
f560: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[0];.      pMe
f570: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f580: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f590: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
f5a0: 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
f5b0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f5c0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f5d0: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
f5e0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29  char)buf[0])<<8)
f5f0: 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20   | buf[1];.     
f600: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f610: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
f620: 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
f630: 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
f640: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f650: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
f660: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
f670: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
f680: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<16) | (buf[1]<
f690: 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20  <8) | buf[2];.  
f6a0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f6b0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f6c0: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
f6d0: 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
f6e0: 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
f6f0: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
f700: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75   pMem->u.i = (bu
f710: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
f720: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
f730: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
f740: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f750: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f760: 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
f770: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
f780: 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
f790: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
f7a0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 73      u64 x = (((s
f7b0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f7c0: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
f7d0: 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20 28  .      u32 y = (
f7e0: 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[2]<<24) | (b
f7f0: 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[3]<<16) | (bu
f800: 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35  f[4]<<8) | buf[5
f810: 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  ];.      x = (x<
f820: 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20  <32) | y;.      
f830: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
f840: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65  4*)&x;.      pMe
f850: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f860: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f870: 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
f880: 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
f890: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f8a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
f8b0: 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
f8c0: 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
f8d0: 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75    u64 x;.      u
f8e0: 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e  32 y;.#if !defin
f8f0: 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
f900: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f910: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
f920: 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69  T).      /* Veri
f930: 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
f940: 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
f950: 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
f960: 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a  he same.      **
f970: 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
f980: 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
f990: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
f9a0: 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
f9b0: 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68     ** defined th
f9c0: 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69  at 64-bit floati
f9d0: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
f9e0: 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64  really are mixed
f9f0: 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e  .      ** endian
fa00: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
fa10: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
fa20: 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
fa30: 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
fa40: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
fa50: 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30   double r1 = 1.0
fa60: 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20 3d  ;.      u64 t2 =
fa70: 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d   t1;.      swapM
fa80: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
fa90: 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t2);.      asser
faa0: 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
fab0: 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
fac0: 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
fad0: 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
fae0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20  #endif..      x 
faf0: 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c  = (buf[0]<<24) |
fb00: 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20   (buf[1]<<16) | 
fb10: 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75  (buf[2]<<8) | bu
fb20: 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20  f[3];.      y = 
fb30: 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28  (buf[4]<<24) | (
fb40: 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[5]<<16) | (b
fb50: 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[6]<<8) | buf[
fb60: 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  7];.      x = (x
fb70: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
fb80: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
fb90: 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
fba0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
fbb0: 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
fbc0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
fbd0: 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Int;.      }else
fbe0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
fbf0: 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26  ( sizeof(x)==8 &
fc00: 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  & sizeof(pMem->r
fc10: 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20  )==8 );.        
fc20: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
fc30: 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20  loat(x);.       
fc40: 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72   memcpy(&pMem->r
fc50: 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
fc60: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
fc70: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
fc80: 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20  sNaN(pMem->r) ? 
fc90: 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52  MEM_Null : MEM_R
fca0: 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eal;.      }.   
fcb0: 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20     return 8;.   
fcc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
fcd0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
fce0: 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
fcf0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
fd00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
fd10: 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38   = serial_type-8
fd20: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
fd30: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
fd40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
fd50: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
fd60: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  : {.      int le
fd70: 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
fd80: 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d  -12)/2;.      pM
fd90: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
fda0: 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
fdb0: 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20  >n = len;.      
fdc0: 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a  pMem->xDel = 0;.
fdd0: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
fde0: 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20  _type&0x01 ){.  
fdf0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
fe00: 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45  s = MEM_Str | ME
fe10: 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d  M_Ephem;.      }
fe20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
fe30: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
fe40: 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d  Blob | MEM_Ephem
fe50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fe60: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20  return len;.    
fe70: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
fe80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ;.}.../*.** Give
fe90: 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
fea0: 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
feb0: 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
fec0: 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65 63  parse the.** rec
fed0: 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61 63  ord into a Unpac
fee0: 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74  kedRecord struct
fef0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ure.  Return a p
ff00: 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61  ointer to.** tha
ff10: 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  t structure..**.
ff20: 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
ff30: 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70 72  unction might pr
ff40: 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62 79  ovide szSpace by
ff50: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  tes of memory.**
ff60: 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63 65   space at pSpace
ff70: 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63 61  .  This space ca
ff80: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f 6c  n be used to hol
ff90: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  d the returned.*
ffa0: 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63 6f  * VDbeParsedReco
ffb0: 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66 20  rd structure if 
ffc0: 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
ffd0: 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a 2a  gh.  If it is.**
ffe0: 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 2c   not big enough,
fff0: 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69 6e   space is obtain
10000 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
10010 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20  malloc()..**.** 
10020 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  The returned str
10030 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62 65  ucture should be
10040 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61 6c   closed by a cal
10050 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56  l to.** sqlite3V
10060 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
10070 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55  dRecord()..*/ .U
10080 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
10090 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
100a0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
100b0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
100c0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
100d0 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
100e0 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
100f0 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
10100 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10110 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
10120 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
10130 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
10140 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
10150 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
10160 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c 2f 2a  ecord *pSpace,/*
10170 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
10180 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74 69   to hold resulti
10190 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ng object */.  i
101a0 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20  nt szSpace      
101b0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
101c0 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
101d0 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
101e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
101f0 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
10200 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
10210 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  ey;.  UnpackedRe
10220 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  cord *p;.  int n
10230 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32 20 69  Byte, d;.  u32 i
10240 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20 20  dx;.  u16 u;    
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10260 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
10270 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
10280 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
10290 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  m;.  .  assert( 
102a0 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69 7a 65  sizeof(Mem)>size
102b0 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42 79 74  of(*p) );.  nByt
102c0 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  e = sizeof(Mem)*
102d0 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
102e0 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+2);.  if( nByt
102f0 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20  e>szSpace ){.   
10300 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
10310 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
10320 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
10330 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
10340 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c  urn 0;.    p->fl
10350 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
10360 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43  EED_FREE | UNPAC
10370 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
10380 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
10390 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20 70   = pSpace;.    p
103a0 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
103b0 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b  ED_NEED_DESTROY;
103c0 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e  .  }.  p->pKeyIn
103d0 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
103e0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65   p->nField = pKe
103f0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
10400 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 70  1;.  p->aMem = p
10410 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29 70 29  Mem = &((Mem*)p)
10420 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  [1];.  idx = get
10430 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
10440 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
10450 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
10460 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
10470 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 29  && u<p->nField )
10480 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
10490 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
104a0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
104b0 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
104c0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
104d0 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
104e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
104f0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
10500 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
10510 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
10520 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
10530 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
10540 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
10550 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
10560 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
10570 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
10580 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
10590 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
105a0 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
105b0 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
105c0 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65   u++;.  }.  asse
105d0 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
105e0 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
105f0 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
10600 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
10610 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
10620 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79   routine destroy
10630 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  s a UnpackedReco
10640 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  rd object.*/.voi
10650 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
10660 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
10670 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  d(UnpackedRecord
10680 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
10690 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
106a0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
106b0 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20  D_DESTROY ){.   
106c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
106d0 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  Mem *pMem;.     
106e0 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
106f0 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
10700 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
10710 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10720 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  Mem->zMalloc ){.
10730 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10740 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
10750 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
10760 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10770 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
10780 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
10790 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73 71  FREE ){.      sq
107a0 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70  lite3DbFree(p->p
107b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b  KeyInfo->db, p);
107c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
107d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
107e0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
107f0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
10800 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a   index records.*
10810 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b  * specified by {
10820 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e  nKey1, pKey1} an
10830 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65  d pPKey2.  It re
10840 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65  turns a negative
10850 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
10860 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66  itive integer if
10870 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68   key1 is less th
10880 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
10890 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e  .** greater than
108a0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65   key2.  The {nKe
108b0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d  y1, pKey1} key m
108c0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a  ust be a blob.**
108d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20 4f   created by th O
108e0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
108f0 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
10900 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
10910 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
10920 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
10930 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
10940 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
10950 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
10960 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
10970 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
10980 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
10990 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a  mber of fields..
109a0 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68 20  ** The key with 
109b0 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73 20  fewer fields is 
109c0 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73  usually compares
109d0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a   less than the .
109e0 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20  ** longer key.  
109f0 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20 55  However if the U
10a00 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20  NPACKED_INCRKEY 
10a10 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20  flags in pPKey2 
10a20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68  is set.** and th
10a30 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65  e common prefixe
10a40 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
10a50 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  n key1 is less t
10a60 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20  han key2..** Or 
10a70 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  if the UNPACKED_
10a80 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61  MATCH_PREFIX fla
10a90 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65  g is set and the
10aa0 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a   prefixes are.**
10ab0 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65   equal, then the
10ac0 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64   keys are consid
10ad0 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c  ered to be equal
10ae0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74   and.** the part
10af0 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d  s beyond the com
10b00 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20 69  mon prefix are i
10b10 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
10b20 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47   the UNPACKED_IG
10b30 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20  NORE_ROWID flag 
10b40 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
10b50 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a   last byte of.**
10b60 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 70   the header of p
10b70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e  Key1 is ignored.
10b80 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20    It is assumed 
10b90 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a  that pKey1 is.**
10ba0 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61   an index key, a
10bb0 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69 74  nd thus ends wit
10bc0 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e  h a rowid value.
10bd0 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a    The last byte.
10be0 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ** of the header
10bf0 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20   will therefore 
10c00 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  be the serial ty
10c10 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a  pe of the rowid:
10c20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c  .** one of 1, 2,
10c30 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20   3, 4, 5, 6, 8, 
10c40 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67  or 9 - the integ
10c50 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e  er serial types.
10c60 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74  .** The serial t
10c70 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c  ype of the final
10c80 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61   rowid will alwa
10c90 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62  ys be a single b
10ca0 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72  yte..** By ignor
10cb0 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62 79  ing this last by
10cc0 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
10cd0 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20 63  , we force the c
10ce0 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20  omparison.** to 
10cf0 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64  ignore the rowid
10d00 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b   at the end of k
10d10 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ey1..*/.int sqli
10d20 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
10d30 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
10d40 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
10d50 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
10d60 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
10d70 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20  ecord *pPKey2   
10d80 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
10d90 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31  y */.){.  int d1
10da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
10db0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
10dc0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
10dd0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10de0 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
10df0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
10e00 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
10e10 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
10e20 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
10e30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10e40 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
10e50 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
10e60 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a  ;.  int nField;.
10e70 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
10e80 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10e90 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
10ea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10eb0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
10ec0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
10ed0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
10ee0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
10ef0 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65  ->pKeyInfo;.  me
10f00 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
10f10 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
10f20 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
10f30 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d  ;.  mem1.flags =
10f40 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c   0;.  mem1.zMall
10f50 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78  oc = 0;.  .  idx
10f60 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
10f70 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
10f80 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
10f90 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
10fa0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
10fb0 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20 20  NORE_ROWID ){.  
10fc0 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d 0a    szHdr1--;.  }.
10fd0 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
10fe0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
10ff0 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
11000 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
11010 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
11020 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
11030 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
11040 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
11050 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
11060 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
11070 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
11080 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
11090 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
110a0 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
110b0 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
110c0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
110d0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
110e0 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  1)>0 ) break;.. 
110f0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
11100 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
11110 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
11120 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
11130 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
11140 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
11150 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
11160 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
11170 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
11180 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11190 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
111a0 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
111b0 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
111e0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
111f0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
11200 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
11210 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
11220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31  ;.  }.  if( mem1
11230 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  .zMalloc ) sqlit
11240 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
11250 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66 28 20  (&mem1);..  if( 
11260 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  rc==0 ){.    /* 
11270 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
11280 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
11290 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
112a0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20 20   fields and.    
112b0 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ** all the field
112c0 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
112d0 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49  nt were equal. I
112e0 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
112f0 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66 6c  NCRKEY.    ** fl
11300 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
11310 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62 79  break the tie by
11320 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20 61   treating key2 a
11330 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a 2a  s larger..    **
11340 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44 5f   If the UPACKED_
11350 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c 61  PREFIX_MATCH fla
11360 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 6b  g is set, then k
11370 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e 20  eys with common 
11380 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a 20  prefixes.    ** 
11390 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74  are considered t
113a0 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74 68  o be equal.  Oth
113b0 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e 67  erwise, the long
113c0 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a 20  er key is the . 
113d0 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41     ** larger.  A
113e0 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68  s it happens, th
113f0 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c  e pPKey2 will al
11400 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67  ways be the long
11410 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  er.    ** if the
11420 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  re is a differen
11430 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
11440 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73  f( pPKey2->flags
11450 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52   & UNPACKED_INCR
11460 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20  KEY ){.      rc 
11470 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
11480 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
11490 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45  s & UNPACKED_PRE
114a0 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20  FIX_MATCH ){.   
114b0 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d 3d     /* Leave rc==
114c0 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69  0 */.    }else i
114d0 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 29  f( idx1<szHdr1 )
114e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  {.      rc = 1;.
114f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
11500 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
11510 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
11520 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
11530 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
11540 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
11550 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
11560 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
11570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a 2f  eturn rc;.}. ../
11580 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
11590 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
115a0 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
115b0 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
115c0 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
115d0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
115e0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
115f0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
11600 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
11610 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
11620 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
11630 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
11640 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
11650 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
11660 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
11670 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
11680 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
11690 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
116a0 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
116b0 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
116c0 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
116d0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
116e0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
116f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11700 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75  dbeIdxRowid(BtCu
11710 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
11720 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
11730 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
11740 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
11750 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
11760 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
11770 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
11780 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
11790 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
117a0 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
117b0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
117c0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
117d0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
117e0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
117f0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
11800 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
11810 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
11820 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
11830 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
11840 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
11850 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
11860 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
11870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
11880 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
11890 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 75 6e 6c  lKey);.  if( unl
118a0 69 6b 65 6c 79 28 6e 43 65 6c 6c 4b 65 79 3c 3d  ikely(nCellKey<=
118b0 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78  0 || nCellKey>0x
118c0 37 66 66 66 66 66 66 66 29 20 29 7b 0a 20 20 20  7fffffff) ){.   
118d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
118e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
118f0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
11900 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
11910 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
11920 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e 66 6c   entry */.  m.fl
11930 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62 20  ags = 0;.  m.db 
11940 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63  = 0;.  m.zMalloc
11950 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
11960 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
11970 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 69  tree(pCur, 0, (i
11980 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  nt)nCellKey, 1, 
11990 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
119a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
119b0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
119c0 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
119d0 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
119e0 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
119f0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
11a00 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
11a10 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
11a20 64 72 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  dr==2 );.  testc
11a30 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
11a40 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
11a50 79 28 73 7a 48 64 72 3c 32 20 7c 7c 20 28 69 6e  y(szHdr<2 || (in
11a60 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
11a70 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
11a80 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
11a90 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
11aa0 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
11ab0 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
11ac0 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
11ad0 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
11ae0 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
11af0 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
11b00 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
11b10 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
11b20 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
11b30 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
11b40 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
11b50 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
11b60 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
11b70 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
11b80 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
11b90 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
11ba0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
11bb0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
11bc0 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
11bd0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
11be0 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
11bf0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
11c00 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
11c10 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
11c20 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
11c30 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
11c40 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
11c50 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
11c60 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
11c70 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
11c80 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
11c90 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
11ca0 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52  ialTypeLen(typeR
11cb0 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
11cc0 65 28 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 3d  e( m.n-lenRowid=
11cd0 3d 73 7a 48 64 72 20 29 3b 0a 20 20 69 66 28 20  =szHdr );.  if( 
11ce0 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e 2d 6c 65 6e  unlikely(m.n-len
11cf0 52 6f 77 69 64 3c 73 7a 48 64 72 29 20 29 7b 0a  Rowid<szHdr) ){.
11d00 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
11d10 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
11d20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74   }..  /* Fetch t
11d30 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74  he integer off t
11d40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
11d50 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
11d60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11d70 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d  lGet((u8*)&m.z[m
11d80 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79  .n-lenRowid], ty
11d90 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20  peRowid, &v);.  
11da0 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a  *rowid = v.u.i;.
11db0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
11dc0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
11dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11de0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
11df0 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72   if database cor
11e00 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
11e10 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20  ted after m has 
11e20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  been.  ** alloca
11e30 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d  ted.  Free the m
11e40 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
11e50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11e60 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f  T. */.idx_rowid_
11e70 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65  corruption:.  te
11e80 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f  stcase( m.zMallo
11e90 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
11ea0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
11eb0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
11ec0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11ed0 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
11ee0 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
11ef0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
11f00 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
11f10 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73   point to agains
11f20 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
11f30 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20  ing in pKey (of 
11f40 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57  length nKey).  W
11f50 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
11f60 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
11f70 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
11f80 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
11f90 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
11fa0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
11fb0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
11fc0 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53   pKey.  Return S
11fd0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
11fe0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20  ess..**.** pKey 
11ff0 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
12000 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
12010 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
12020 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
12030 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
12040 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
12050 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
12060 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
12070 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
12080 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
12090 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
120a0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
120b0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
120c0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
120d0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
120e0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
120f0 74 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20  tire key..**.** 
12100 70 55 6e 70 61 63 6b 65 64 20 6d 61 79 20 62 65  pUnpacked may be
12110 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 76 65 72   an unpacked ver
12120 73 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b 65  sion of pKey,nKe
12130 79 2e 20 20 49 66 20 70 55 6e 70 61 63 6b 65 64  y.  If pUnpacked
12140 20 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20   is.** supplied 
12150 69 74 20 69 73 20 75 73 65 64 20 69 6e 20 70 6c  it is used in pl
12160 61 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79  ace of pKey,nKey
12170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12180 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72  VdbeIdxKeyCompar
12190 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  e(.  VdbeCursor 
121a0 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
121b0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
121c0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
121d0 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
121e0 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
121f0 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ,  /* Unpacked v
12200 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 61  ersion of pKey a
12210 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e 74  nd nKey */.  int
12220 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
12230 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
12240 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
12250 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
12260 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
12270 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
12280 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
12290 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b  r = pC->pCursor;
122a0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c  .  Mem m;..  sql
122b0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
122c0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
122d0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
122e0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
122f0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
12300 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
12310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12320 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20  K;.  }.  m.db = 
12330 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30  0;.  m.flags = 0
12340 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20  ;.  m.zMalloc = 
12350 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
12360 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
12370 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30  e(pC->pCursor, 0
12380 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
12390 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
123a0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
123b0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
123c0 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
123d0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
123e0 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20  NORE_ROWID );.  
123f0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
12400 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
12410 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
12420 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
12430 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
12440 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
12470 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
12480 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
12490 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
124a0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
124b0 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
124c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
124d0 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
124e0 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
124f0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
12500 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
12510 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
12520 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
12530 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
12540 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
12550 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
12560 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
12570 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
12580 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
12590 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
125a0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
125b0 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
125c0 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
125d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
125e0 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
125f0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
12600 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
12610 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
12620 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
12630 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
12640 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
12650 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
12660 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
12670 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
12680 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
12690 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
126a0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
126b0 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
126c0 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
126d0 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
126e0 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
126f0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
12700 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
12710 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
12720 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
12730 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
12740 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
12750 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
12760 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
12770 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
12780 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
12790 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
127a0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
127b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
127c0 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
127d0 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
127e0 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
127f0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
12800 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
12810 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
12820 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
12830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
12850 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12860 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
12870 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
12880 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
12890 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.