/ Hex Artifact Content
Login

Artifact 30c1bbc1d2876c5bbe84d52dab9980ed032bca98:


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 34 20 32  eaux.c,v 1.434 2
02c0: 30 30 39 2f 30 31 2f 32 30 20 31 37 3a 30 36 3a  009/01/20 17:06:
02d0: 32 37 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  27 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 20 0a 20  b->nDb; i++){ . 
9030: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
9040: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9050: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9060: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
9070: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
9080: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
9090: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
90a0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
90b0: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
90c0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
90d0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
90e0: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
90f0: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
9100: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
9110: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
9120: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
9130: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
9140: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
9150: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
9160: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
9170: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
9180: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
9190: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
91a0: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
91b0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
91c0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
91d0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
91e0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
91f0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
9200: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
9210: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9220: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
9230: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
9240: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9250: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9260: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9270: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9280: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9290: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
92a0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
92b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
92c0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
92d0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
92e0: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
92f0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
9300: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
9310: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
9320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
9330: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
9340: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
9350: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
9360: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
9370: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9380: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
9390: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
93a0: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
93b0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
93c0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
93d0: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
93e0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
93f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
9400: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
9410: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
9420: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
9430: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
9440: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
9450: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
9460: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
9470: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
9480: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
9490: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
94a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
94b0: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
94c0: 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
94d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
94e0: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
94f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9500: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
9510: 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
9520: 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61  ndom);.      zMa
9530: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
9540: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
9550: 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65  %08X", zMainFile
9560: 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66  , iRandom&0x7fff
9570: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
9580: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
9590: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
95a0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
95b0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
95c0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
95d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
95e0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
95f0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
9600: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
9610: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
9620: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9630: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
9640: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
9650: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
9660: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9670: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
9680: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
9690: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
96a0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
96b0: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
96c0: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
96d0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
96e0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
96f0: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
9700: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
9710: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
9720: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9730: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9740: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
9750: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
9760: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
9770: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
9780: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
9790: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
97a0: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
97b0: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
97c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
97d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
97e0: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
97f0: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
9800: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
9810: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9820: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
9830: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
9840: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
9850: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
9860: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9870: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
9880: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
9890: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
98a0: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
98b0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
98c0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
98d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
98e0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
98f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9900: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
9910: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
9920: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
9930: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
9940: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9950: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
9960: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
9970: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
9980: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
9990: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
99a0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
99b0: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
99c0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
99d0: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
99e0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
99f0: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
9a00: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
9a10: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
9a20: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
9a30: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
9a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9a50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9a60: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
9a70: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
9a80: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
9a90: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
9aa0: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
9ab0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
9ac0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
9ad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9ae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9af0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9b00: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
9b10: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9b20: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9b30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
9b40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9b50: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
9b60: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9b70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9b80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
9b90: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
9ba0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
9bb0: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
9bc0: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
9bd0: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
9be0: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
9bf0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
9c00: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
9c10: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
9c20: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
9c30: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
9c40: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
9c50: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
9c60: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
9c70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
9c80: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
9c90: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
9ca0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
9cb0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
9cc0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
9cd0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9ce0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
9cf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9d00: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
9d10: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9d20: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9d30: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
9d40: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
9d50: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
9d60: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
9d70: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
9d80: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9d90: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
9da0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
9db0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
9dc0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9dd0: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
9de0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9df0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
9e00: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
9e10: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
9e20: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
9e30: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
9e40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9e50: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
9e60: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
9e70: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
9e80: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
9e90: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
9ea0: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
9eb0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
9ec0: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
9ed0: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
9ee0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
9ef0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
9f00: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9f10: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
9f20: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
9f30: 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ured..    */.   
9f40: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9f50: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9f60: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
9f70: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
9f80: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9f90: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
9fa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9fb0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9fc0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
9fd0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
9fe0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9ff0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
a000: 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
a010: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a030: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
a040: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
a050: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a060: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
a070: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
a080: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
a090: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
a0a0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
a0b0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
a0c0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
a0d0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
a0e0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
a0f0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
a100: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
a110: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
a120: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a130: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
a140: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
a150: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
a160: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
a170: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
a180: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a190: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
a1a0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
a1b0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
a1c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
a1d0: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
a1e0: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
a1f0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
a200: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
a210: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
a220: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
a230: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
a240: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
a250: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
a260: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
a270: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
a280: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
a290: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
a2a0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
a2b0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
a2c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
a2d0: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
a2e0: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
a2f0: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
a300: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
a310: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
a320: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
a330: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
a340: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
a350: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
a360: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
a370: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
a380: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a390: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
a3a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a3b0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
a3c0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
a3d0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
a3e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
a3f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
a400: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
a410: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a420: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
a430: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
a440: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
a450: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
a460: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
a470: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
a480: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
a490: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
a4a0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a4b0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
a4c0: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
a4d0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
a4e0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
a4f0: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
a500: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
a510: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
a520: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
a530: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
a540: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
a550: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
a560: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
a570: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
a580: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
a590: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
a5a0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
a5b0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
a5c0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
a5d0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
a5e0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
a5f0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
a600: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
a610: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
a620: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
a630: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
a640: 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
a650: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
a660: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
a670: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
a680: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
a690: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
a6a0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
a6b0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
a6c0: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
a6d0: 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te++;.    }.    
a6e0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
a6f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
a700: 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  =db->activeVdbeC
a710: 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
a720: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74  nWrite==db->writ
a730: 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65  eVdbeCnt );.}.#e
a740: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
a750: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
a760: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
a770: 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20  For every Btree 
a780: 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65  that in database
a790: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77   connection db w
a7a0: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65  hich .** has bee
a7b0: 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69  n modified, "tri
a7c0: 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65  p" or invalidate
a7d0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a   each cursor in.
a7e0: 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69  ** that Btree mi
a7f0: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  ght have been mo
a800: 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74  dified so that t
a810: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
a820: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
a830: 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70  gain.  This happ
a840: 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  ens when a rollb
a850: 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20  ack.*** occurs. 
a860: 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70   We have to trip
a870: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
a880: 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20  ursors, even.** 
a890: 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65  cursor from othe
a8a0: 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65  r VMs in differe
a8b0: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
a8c0: 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74  ections,.** so t
a8d0: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d  hat none of them
a8e0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
a8f0: 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68  data at which th
a900: 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74  ey.** were point
a910: 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f  ing and which no
a920: 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  w may have been 
a930: 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74  changed due.** t
a940: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
a950: 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  **.** Remember t
a960: 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63  hat a rollback c
a970: 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73  an delete tables
a980: 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a   complete and.**
a990: 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67   reorder rootpag
a9a0: 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f  es.  So it is no
a9b0: 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73  t sufficient jus
a9c0: 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65  t to save.** the
a9d0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
a9e0: 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74  rsor.  We have t
a9f0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
aa00: 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68   cursor.** so th
aa10: 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75  at it is never u
aa20: 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74  sed again..*/.st
aa30: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
aa40: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
aa50: 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69  ifiedBtrees(sqli
aa60: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
aa70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
aa80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
aa90: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
aaa0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
aab0: 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74    if( p && sqlit
aac0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
aad0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
aae0: 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
aaf0: 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54  Cursors(p, SQLIT
ab00: 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a  E_ABORT);.    }.
ab10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
ab20: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
ab30: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
ab40: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
ab50: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
ab60: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
ab70: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
ab80: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
ab90: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
aba0: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
abb0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
abc0: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
abd0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
abe0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
abf0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
ac00: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
ac10: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
ac20: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
ac30: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
ac40: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
ac50: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
ac60: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
ac70: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
ac80: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
ac90: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
aca0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
acb0: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
acc0: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
acd0: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
ace0: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
acf0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
ad00: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
ad10: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
ad20: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
ad30: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
ad40: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
ad50: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
ad60: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
ad70: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
ad80: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
ad90: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
ada0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78  int i;.  int (*x
adb0: 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74  Func)(Btree *pBt
adc0: 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74  ) = 0;  /* Funct
add0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65  ion to call on e
ade0: 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e  ach btree backen
adf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65  d */.  int isSpe
ae00: 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
ae10: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
ae20: 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e  true if SQLITE_N
ae30: 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f  OMEM or IOERR */
ae40: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
ae50: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
ae60: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
ae70: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
ae80: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
ae90: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
aea0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
aeb0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
aec0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
aed0: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
aee0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
aef0: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
af00: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
af10: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
af20: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
af30: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
af40: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
af50: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
af60: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
af70: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
af80: 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
af90: 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
afa0: 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
afb0: 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
afc0: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
afd0: 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
afe0: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
aff0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
b000: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
b010: 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
b020: 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
b030: 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
b040: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
b050: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
b060: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
b070: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
b080: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
b090: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
b0a0: 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  M;.  }.  closeAl
b0b0: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
b0c0: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
b0d0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
b0e0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
b0f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b100: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
b110: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
b120: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
b130: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
b140: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
b150: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
b160: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
b170: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
b180: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
b190: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
b1a0: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20  om p->rc */..   
b1b0: 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
b1c0: 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
b1d0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
b1e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b1f0: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
b200: 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >aMutex);..    /
b210: 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
b220: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
b230: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
b240: 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
b250: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
b260: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
b270: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
b280: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
b290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2a0: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
b2b0: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
b2c0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
b2d0: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
b2e0: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
b2f0: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
b300: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
b310: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
b320: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
b330: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
b340: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
b350: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
b360: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
b370: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
b380: 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
b390: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
b3a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b3b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
b3c0: 5f 42 4c 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75  _BLOCKED && p->u
b3d0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
b3e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b3f0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b400: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
b410: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
b420: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b430: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
b440: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
b450: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
b460: 5f 46 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20  _FULL).         
b470: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e            && p->
b480: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
b490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  ){.          xFu
b4a0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
b4b0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
b4c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b4d0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
b4e0: 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
b4f0: 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
b500: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
b510: 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
b520: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
b530: 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
b540: 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
b550: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
b560: 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
b570: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
b580: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
b590: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
b5a0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
b5b0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b5c0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b5d0: 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
b5e0: 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
b5f0: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
b600: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
b610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b620: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
b630: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
b640: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
b650: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
b660: 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20  ly active vdbe, 
b670: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64  then.    ** we d
b680: 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
b690: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
b6a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
b6b0: 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
b6c0: 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
b6d0: 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
b6e0: 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
b6f0: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
b700: 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
b710: 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
b720: 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  red. .    */.   
b730: 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61   if( !sqlite3Vta
b740: 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20  bInSync(db) .   
b750: 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d    && db->autoCom
b760: 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d  mit .     && db-
b770: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28  >writeVdbeCnt==(
b780: 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
b790: 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c  .     && (db->fl
b7a0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d  ags & SQLITE_Com
b7b0: 6d 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20 20  mitBusy)==0.    
b7c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
b7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b7e0: 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
b7f0: 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
b800: 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
b810: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
b820: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
b830: 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68   is true, and th
b840: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
b850: 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  as .        ** s
b860: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74  uccessful or hit
b870: 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
b880: 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d  nstraint. This m
b890: 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20  eans a commit . 
b8a0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
b8b0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  uired..        *
b8c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  /.        int rc
b8d0: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
b8e0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , p);.        if
b8f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
b900: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
b910: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
b920: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
b930: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
b940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b950: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
b960: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
b970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b980: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
b990: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b9a0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
b9b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b9c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b9d0: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
b9e0: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
b9f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
ba00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
ba10: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
ba20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ba30: 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20  else if( !xFunc 
ba40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
ba50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
ba60: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
ba70: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
ba80: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65      if( p->opene
ba90: 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  dStatement ){.  
baa0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
bab0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bac0: 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  itStmt;.        
bad0: 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  } .      }else i
bae0: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
baf0: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
bb00: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
bb10: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
bb20: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
bb30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
bb40: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
bb50: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
bb60: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
bb70: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
bb80: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
bb90: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
bba0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
bbb0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
bbc0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
bbd0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
bbe0: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
bbf0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
bc00: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
bc10: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
bc20: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
bc30: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
bc40: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
bc50: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
bc60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bc70: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
bc80: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
bc90: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
bca0: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
bcb0: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
bcc0: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
bcd0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
bce0: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
bcf0: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
bd00: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
bd10: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
bd20: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
bd30: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
bd40: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
bd50: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
bd60: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
bd70: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
bd80: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
bd90: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
bda0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
bdb0: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
bdc0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
bdd0: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
bde0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
bdf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
be00: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
be10: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
be20: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
be30: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
be40: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
be50: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
be60: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
be70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
be80: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
be90: 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
bea0: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
beb0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   the statement w
bec0: 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20  as committed, . 
bed0: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68     ** set the ch
bee0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20  ange counter. . 
bef0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bf00: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20  >changeCntOn && 
bf10: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
bf20: 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20    if( !xFunc || 
bf30: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
bf40: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b  reeCommitStmt ){
bf50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bf60: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
bf70: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
bf80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bf90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bfa0: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
bfb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bfc0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
bfd0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bfe0: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
bff0: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
c000: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
c010: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
c020: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
c030: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
c040: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
c050: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
c060: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
c070: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
c080: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
c090: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
c0a0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
c0b0: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
c0c0: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
c0d0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
c0e0: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
c0f0: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
c100: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
c110: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
c120: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
c130: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
c140: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
c150: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
c160: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
c170: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
c180: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
c190: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62  Only ){.      db
c1a0: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d  ->writeVdbeCnt--
c1b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
c1c0: 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
c1d0: 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65  beCnt>=db->write
c1e0: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20  VdbeCnt );.  }. 
c1f0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
c200: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
c210: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
c220: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
c230: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c240: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
c250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c260: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
c270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
c280: 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
c290: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
c2a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
c2b0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
c2c0: 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
c2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
c2e0: 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
c2f0: 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
c300: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c310: 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
c320: 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
c330: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c340: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
c350: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
c360: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
c370: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
c380: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
c390: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
c3a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
c3b0: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
c3c0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
c3d0: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
c3e0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
c3f0: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
c400: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
c410: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
c420: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
c430: 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
c440: 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
c450: 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
c460: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
c470: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
c480: 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
c490: 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
c4a0: 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
c4b0: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
c4c0: 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
c4d0: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
c4e0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
c4f0: 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
c500: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
c510: 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
c520: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
c530: 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
c540: 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
c550: 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
c560: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
c570: 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
c580: 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
c590: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f   now..  */.  (vo
c5a0: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
c5b0: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
c5c0: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20  3VdbeHalt(p);.  
c5d0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
c5e0: 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f  etyOff(db);..  /
c5f0: 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
c600: 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
c610: 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
c620: 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
c630: 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
c640: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
c650: 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
c660: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
c670: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
c680: 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
c690: 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
c6a0: 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
c6b0: 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
c6c0: 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
c6d0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
c6e0: 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
c6f0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
c700: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
c710: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
c720: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
c730: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  .    if( p->zErr
c740: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
c750: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
c760: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
c770: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
c780: 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d  r(db->pErr,-1,p-
c790: 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f  >zErrMsg,SQLITE_
c7a0: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
c7b0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
c7c0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
c7d0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62  lloc();.      db
c7e0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
c7f0: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
c800: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
c810: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d  rrMsg);.      p-
c820: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
c830: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
c840: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
c850: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
c860: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
c870: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c880: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c890: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
c8a0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
c8b0: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
c8c0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
c8d0: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
c8e0: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
c8f0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
c900: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
c910: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
c920: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
c930: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
c940: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
c950: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
c960: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
c970: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
c980: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
c990: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c9a0: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
c9b0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
c9c0: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
c9d0: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
c9e0: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
c9f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
ca00: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ca10: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
ca20: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
ca30: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
ca40: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
ca50: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
ca60: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
ca70: 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
ca80: 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
ca90: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
caa0: 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
cab0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
cac0: 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
cad0: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
cae0: 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
caf0: 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
cb00: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
cb10: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
cb20: 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
cb30: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cb40: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
cb50: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
cb60: 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
cb70: 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
cb80: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
cb90: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
cba0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cbb0: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
cbc0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
cbd0: 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
cbe0: 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
cbf0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
cc00: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
cc10: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
cc20: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
cc30: 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
cc40: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
cc50: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
cc60: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
cc70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
cc80: 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
cc90: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
cca0: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
ccb0: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
ccc0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
ccd0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
cce0: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
ccf0: 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
cd00: 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
cd10: 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
cd20: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
cd30: 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
cd40: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
cd50: 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
cd60: 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
cd70: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
cd80: 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
cd90: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
cda0: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
cdb0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
cdc0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cdd0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
cde0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
cdf0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
ce00: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
ce10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ce20: 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
ce30: 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
ce40: 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
ce50: 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ==rc );.  }else 
ce60: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
ce70: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b  BE_MAGIC_INIT ){
ce80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ce90: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
cea0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
ceb0: 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
cec0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
ced0: 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
cee0: 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
cef0: 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
cf00: 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
cf10: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
cf20: 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
cf30: 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
cf40: 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
cf50: 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
cf60: 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
cf70: 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
cf80: 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
cf90: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
cfa0: 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
cfb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cfc0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
cfd0: 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
cfe0: 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
cff0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
d000: 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
d010: 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
d020: 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
d030: 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
d040: 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
d050: 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
d060: 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29  | !(mask&(1<<i))
d070: 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20  ) && pAux->pAux 
d080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  ){.      if( pAu
d090: 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
d0a0: 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
d0b0: 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
d0c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d0d0: 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20  Aux->pAux = 0;. 
d0e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
d0f0: 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
d100: 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
d110: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
d120: 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  te(Vdbe *p){.  i
d130: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
d140: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30  *db;..  if( p==0
d150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20   ) return;.  db 
d160: 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
d170: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70  ->pPrev ){.    p
d180: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
d190: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c   p->pNext;.  }el
d1a0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
d1b0: 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a  db->pVdbe==p );.
d1c0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20      db->pVdbe = 
d1d0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
d1e0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
d1f0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
d200: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
d210: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
d220: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20   ){.    Op *pOp 
d230: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f  = p->aOp;.    fo
d240: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
d250: 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i++, pOp++){.  
d260: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70      freeP4(db, p
d270: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
d280: 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53  >p4.p);.#ifdef S
d290: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
d2a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d2b0: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
d2c0: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
d2d0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d2e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
d2f0: 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  Op);.  }.  relea
d300: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
d310: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
d320: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d330: 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
d340: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
d350: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d360: 28 64 62 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  (db, &p->aMem[1]
d370: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
d380: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
d390: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
d3a0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
d3b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
d3c0: 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
d3d0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
d3e0: 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
d3f0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d400: 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20  E_MAGIC_DEAD;.  
d410: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d420: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  , p);.}../*.** I
d430: 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
d440: 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
d450: 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
d460: 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
d470: 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
d480: 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
d490: 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d  r code.  If no M
d4a0: 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67  oveTo is pending
d4b0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
d4c0: 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61  e does nothing a
d4d0: 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
d4e0: 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
d4f0: 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
d500: 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
d510: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
d520: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
d530: 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b      int res, rc;
d540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d550: 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69  EST.    extern i
d560: 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
d570: 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
d580: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
d590: 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63  sTable );.    rc
d5a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
d5b0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
d5c0: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
d5d0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
d5e0: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
d5f0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
d600: 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64      p->lastRowid
d610: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d   = keyToInt(p->m
d620: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20  ovetoTarget);.  
d630: 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69    p->rowidIsVali
d640: 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30 3b  d = res==0 ?1:0;
d650: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
d660: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d670: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
d680: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
d690: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
d6a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d6b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d6c0: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
d6d0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
d6e0: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
d6f0: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
d700: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
d710: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
d720: 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
d730: 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  p->pCursor ){.  
d740: 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
d750: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
d760: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
d770: 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
d780: 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
d790: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d7a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
d7b0: 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
d7c0: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
d7d0: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
d7e0: 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
d7f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
d800: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d810: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
d820: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
d830: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
d840: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d850: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
d860: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d870: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d880: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
d890: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d8a0: 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
d8b0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
d8c0: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
d8d0: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
d8e0: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
d8f0: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
d900: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
d910: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
d920: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
d930: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
d940: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
d950: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
d960: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
d970: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
d980: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
d990: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
d9a0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
d9b0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
d9c0: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
d9d0: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
d9e0: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
d9f0: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
da00: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
da10: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
da20: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
da30: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
da40: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
da50: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
da60: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
da70: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
da80: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
da90: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
daa0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
dab0: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
dac0: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
dad0: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
dae0: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
daf0: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
db00: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
db10: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
db20: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
db30: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
db40: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
db50: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
db60: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
db70: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
db80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
db90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
dba0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
dbb0: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
dbe0: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
dc10: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
dc20: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
dc30: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
dc40: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
dc50: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
dc80: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
dc90: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
dcc0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
dcd0: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
dce0: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
dcf0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
dd00: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
dd30: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
dd40: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
dd60: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
dd70: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd90: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
dda0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
ddb0: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddd0: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
dde0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
ddf0: 2a 2a 20 20 20 20 20 31 30 2c 31 31 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 20 72 65 73 65 72             reser
de20: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
de30: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
de40: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
de50: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
de60: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
de70: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
de80: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
de90: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
dea0: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
deb0: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
dec0: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
ded0: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
dee0: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
def0: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
df00: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
df10: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
df20: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
df30: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
df40: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
df50: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
df60: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
df70: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
df80: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
df90: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
dfa0: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
dfb0: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
dfc0: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
dfd0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
dfe0: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
dff0: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
e000: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
e010: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
e020: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
e030: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
e040: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
e050: 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
e060: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
e070: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
e080: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
e090: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
e0a0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
e0b0: 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20  rn 8+(u32)i;.   
e0c0: 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f   }.    u = i<0 ?
e0d0: 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28   -i : i;.    if(
e0e0: 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e   u<=127 ) return
e0f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33   1;.    if( u<=3
e100: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b  2767 ) return 2;
e110: 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
e120: 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a  607 ) return 3;.
e130: 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
e140: 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34  83647 ) return 4
e150: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  ;.    if( u<=MAX
e160: 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20  _6BYTE ) return 
e170: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b  5;.    return 6;
e180: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
e190: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20  &MEM_Real ){.   
e1a0: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20   return 7;.  }. 
e1b0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64   assert( pMem->d
e1c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e1d0: 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74  || flags&(MEM_St
e1e0: 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20  r|MEM_Blob) );. 
e1f0: 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20   n = pMem->n;.  
e200: 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
e210: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
e220: 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
e230: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e    }.  assert( n>
e240: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
e250: 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
e260: 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
e270: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
e280: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
e290: 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
e2a0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
e2b0: 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
e2c0: 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  type..*/.int sql
e2d0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
e2e0: 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
e2f0: 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
e300: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
e310: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
e320: 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
e330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
e340: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
e350: 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
e360: 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
e370: 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
e380: 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
e390: 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
e3a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
e3b0: 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
e3c0: 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
e3d0: 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
e3e0: 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
e3f0: 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
e400: 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
e410: 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
e420: 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
e430: 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
e440: 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
e450: 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
e460: 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
e470: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
e480: 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
e490: 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
e4a0: 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
e4b0: 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
e4c0: 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
e4d0: 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
e4e0: 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
e4f0: 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
e500: 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
e510: 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
e520: 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
e530: 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
e540: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
e550: 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
e560: 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
e570: 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
e580: 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
e590: 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
e5a0: 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
e5b0: 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
e5c0: 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
e5d0: 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
e5e0: 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
e5f0: 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
e600: 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
e610: 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
e620: 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
e630: 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
e640: 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
e650: 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
e660: 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
e670: 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
e680: 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
e690: 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
e6a0: 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
e6b0: 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
e6c0: 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
e6d0: 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
e6e0: 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
e6f0: 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
e700: 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
e710: 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
e720: 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
e730: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
e740: 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
e750: 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
e760: 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
e770: 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
e780: 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
e790: 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
e7a0: 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
e7b0: 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
e7c0: 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
e7d0: 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
e7e0: 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
e7f0: 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
e800: 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
e810: 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
e820: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
e830: 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
e840: 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
e850: 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
e860: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
e870: 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
e880: 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
e890: 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
e8a0: 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
e8b0: 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
e8c0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
e8d0: 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
e8e0: 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
e8f0: 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
e900: 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
e910: 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
e920: 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
e930: 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
e940: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
e950: 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
e960: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
e970: 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
e980: 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
e990: 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
e9a0: 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
e9b0: 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
e9c0: 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
e9d0: 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
e9e0: 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
e9f0: 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
ea00: 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
ea10: 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
ea20: 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
ea30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
ea40: 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
ea50: 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
ea60: 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
ea70: 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
ea80: 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
ea90: 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
eaa0: 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
eab0: 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
eac0: 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
ead0: 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
eae0: 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
eaf0: 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
eb00: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
eb10: 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
eb20: 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
eb30: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
eb40: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
eb50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
eb60: 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
eb70: 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
eb80: 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
eb90: 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
eba0: 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
ebb0: 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
ebc0: 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
ebd0: 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
ebe0: 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
ebf0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
ec00: 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
ec10: 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
ec20: 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
ec30: 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75  t in buf[].  nBu
ec40: 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  f must always be
ec50: 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  .** large enough
ec60: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
ec70: 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65  ire field.  Exce
ec80: 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64  pt, if the field
ec90: 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69   is.** a blob wi
eca0: 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64  th a zero-filled
ecb0: 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b   tail, then buf[
ecc0: 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20  ] might be just 
ecd0: 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a  the right.** siz
ece0: 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74  e to hold everyt
ecf0: 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20  hing except for 
ed00: 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
ed10: 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a  tail.  If buf[].
ed20: 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65  ** is only big e
ed30: 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
ed40: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69  e non-zero prefi
ed50: 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69  x, then only wri
ed60: 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69  te that.** prefi
ed70: 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42  x into buf[].  B
ed80: 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c  ut if buf[] is l
ed90: 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68  arge enough to h
eda0: 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20  old both the.** 
edb0: 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74  prefix and the t
edc0: 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74  ail then write t
edd0: 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65  he prefix and se
ede0: 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c  t the tail to al
edf0: 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a  l.** zeros..**.*
ee00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
ee10: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
ee20: 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
ee30: 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
ee40: 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
ee50: 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
ee60: 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
ee70: 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
ee80: 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
ee90: 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
eea0: 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
eeb0: 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73  buf[]..*/ .int s
eec0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
eed0: 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74  Put(u8 *buf, int
eee0: 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d   nBuf, Mem *pMem
eef0: 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
ef00: 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c  t){.  u32 serial
ef10: 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56  _type = sqlite3V
ef20: 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d  dbeSerialType(pM
ef30: 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  em, file_format)
ef40: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20  ;.  int len;..  
ef50: 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
ef60: 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
ef70: 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
ef80: 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
ef90: 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69      u64 v;.    i
efa0: 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  nt i;.    if( se
efb0: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
efc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
efd0: 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
efe0: 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20  pMem->r) );.    
eff0: 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
f000: 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29  em->r, sizeof(v)
f010: 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  );.      swapMix
f020: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29  edEndianFloat(v)
f030: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f040: 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69     v = pMem->u.i
f050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
f060: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62  = i = sqlite3Vdb
f070: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
f080: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
f090: 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42   assert( len<=nB
f0a0: 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  uf );.    while(
f0b0: 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75   i-- ){.      bu
f0c0: 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78  f[i] = (u8)(v&0x
f0d0: 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d  FF);.      v >>=
f0e0: 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   8;.    }.    re
f0f0: 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
f100: 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
f110: 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
f120: 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
f130: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
f140: 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
f150: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
f160: 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
f180: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
f190: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
f1a0: 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73  type) );.    ass
f1b0: 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42  ert( pMem->n<=nB
f1c0: 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  uf );.    len = 
f1d0: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
f1e0: 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
f1f0: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20  , len);.    if( 
f200: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
f210: 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
f220: 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e  len += pMem->u.n
f230: 5a 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Zero;.      if( 
f240: 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20  len>nBuf ){.    
f250: 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a      len = nBuf;.
f260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65        }.      me
f270: 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e  mset(&buf[pMem->
f280: 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d  n], 0, len-pMem-
f290: 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  >n);.    }.    r
f2a0: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
f2b0: 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
f2c0: 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
f2d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f2e0: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
f2f0: 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20  e the data blob 
f300: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75  pointed to by bu
f310: 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 65  f as serial type
f320: 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20   serial_type.** 
f330: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
f340: 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52  sult in pMem.  R
f350: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
f360: 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a   of bytes read..
f370: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
f380: 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20  dbeSerialGet(.  
f390: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
f3a0: 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
f3b0: 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
f3c0: 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
f3d0: 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
f3e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f3f0: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
f400: 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
f410: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
f440: 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
f450: 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63  to */.){.  switc
f460: 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
f470: 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
f480: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
f490: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
f4a0: 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
f4b0: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
f4c0: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
f4d0: 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
f4e0: 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
f4f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
f500: 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
f510: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f520: 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
f530: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
f540: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
f550: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
f560: 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d  buf[0];.      pM
f570: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f580: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
f590: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f5a0: 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
f5b0: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
f5c0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
f5d0: 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64  >u.i = (((signed
f5e0: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
f5f0: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
f600: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f610: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f620: 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
f630: 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
f640: 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
f650: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
f660: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69  Mem->u.i = (((si
f670: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
f680: 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31 5d  )<<16) | (buf[1]
f690: 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20  <<8) | buf[2];. 
f6a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f6b0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
f6c0: 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
f6d0: 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
f6e0: 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
f6f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f700: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62    pMem->u.i = (b
f710: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
f720: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
f730: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
f740: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
f750: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
f760: 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20       return 4;. 
f770: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
f780: 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
f790: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
f7a0: 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28       u64 x = (((
f7b0: 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b  signed char)buf[
f7c0: 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d  0])<<8) | buf[1]
f7d0: 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d 20  ;.      u32 y = 
f7e0: 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28  (buf[2]<<24) | (
f7f0: 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[3]<<16) | (b
f800: 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[4]<<8) | buf[
f810: 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  5];.      x = (x
f820: 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
f830: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
f840: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70 4d  64*)&x;.      pM
f850: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f860: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
f870: 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
f880: 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
f890: 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
f8a0: 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
f8b0: 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
f8c0: 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
f8d0: 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20 20     u64 x;.      
f8e0: 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66 69  u32 y;.#if !defi
f8f0: 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
f900: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
f910: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
f920: 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65 72  NT).      /* Ver
f930: 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72  ify that integer
f940: 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70  s and floating p
f950: 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20  oint values use 
f960: 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20 2a  the same.      *
f970: 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
f980: 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
f990: 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
f9a0: 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
f9b0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
f9c0: 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
f9d0: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
f9e0: 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
f9f0: 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69 61  d.      ** endia
fa00: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
fa10: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
fa20: 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
fa30: 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
fa40: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
fa50: 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
fa60: 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32 20  0;.      u64 t2 
fa70: 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61 70  = t1;.      swap
fa80: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
fa90: 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73 65  (t2);.      asse
faa0: 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
fab0: 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
fac0: 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
fad0: 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
fae0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 78  .#endif..      x
faf0: 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
fb00: 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
fb10: 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
fb20: 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d  uf[3];.      y =
fb30: 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20   (buf[4]<<24) | 
fb40: 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28  (buf[5]<<16) | (
fb50: 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[6]<<8) | buf
fb60: 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [7];.      x = (
fb70: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
fb80: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
fb90: 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  e==6 ){.        
fba0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
fbb0: 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70  4*)&x;.        p
fbc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
fbd0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  _Int;.      }els
fbe0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
fbf0: 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
fc00: 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
fc10: 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
fc20: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
fc30: 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
fc40: 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
fc50: 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
fc60: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
fc70: 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
fc80: 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
fc90: 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
fca0: 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
fcb0: 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
fcc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
fcd0: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
fce0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
fcf0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
fd00: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
fd10: 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
fd20: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
fd30: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
fd40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
fd50: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
fd60: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c  t: {.      int l
fd70: 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  en = (serial_typ
fd80: 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
fd90: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
fda0: 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
fdb0: 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ->n = len;.     
fdc0: 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b   pMem->xDel = 0;
fdd0: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
fde0: 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20  l_type&0x01 ){. 
fdf0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
fe00: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d  gs = MEM_Str | M
fe10: 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20  EM_Ephem;.      
fe20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
fe30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
fe40: 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65  _Blob | MEM_Ephe
fe50: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
fe60: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 20   return len;.   
fe70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
fe80: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  0;.}.../*.** Giv
fe90: 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
fea0: 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
feb0: 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
fec0: 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72 65   parse the.** re
fed0: 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70 61  cord into a Unpa
fee0: 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
fef0: 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61 20  ture.  Return a 
ff00: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
ff10: 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  at structure..**
ff20: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
ff30: 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20 70  function might p
ff40: 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20 62  rovide szSpace b
ff50: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  ytes of memory.*
ff60: 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61 63  * space at pSpac
ff70: 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20 63  e.  This space c
ff80: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68 6f  an be used to ho
ff90: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a  ld the returned.
ffa0: 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65 63  ** VDbeParsedRec
ffb0: 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69 66  ord structure if
ffc0: 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
ffd0: 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a 2a  ugh.  If it is.*
ffe0: 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67 68  * not big enough
fff0: 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61 69  , space is obtai
10000 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
10010 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  _malloc()..**.**
10020 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
10030 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20 62  ructure should b
10040 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63 61  e closed by a ca
10050 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
10060 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
10070 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a  edRecord()..*/ .
10080 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
10090 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
100a0 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
100b0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
100c0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
100d0 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
100e0 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
100f0 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
10100 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10110 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
10120 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
10130 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
10140 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
10150 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
10160 52 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c 2f  Record *pSpace,/
10170 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
10180 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c 74  e to hold result
10190 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ing object */.  
101a0 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20  int szSpace     
101b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
101c0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
101d0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  tes */.){.  cons
101e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
101f0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
10200 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
10210 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52  Key;.  UnpackedR
10220 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74 20  ecord *p;.  int 
10230 6e 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32 20  nByte, d;.  u32 
10240 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20 20  idx;.  u16 u;   
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10260 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
10270 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
10280 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
10290 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  em;.  .  assert(
102a0 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69 7a   sizeof(Mem)>siz
102b0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42 79  eof(*p) );.  nBy
102c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d 29  te = sizeof(Mem)
102d0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
102e0 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+2);.  if( nBy
102f0 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20  te>szSpace ){.  
10300 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
10310 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
10320 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
10330 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
10340 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66  turn 0;.    p->f
10350 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
10360 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41  NEED_FREE | UNPA
10370 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
10380 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
10390 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  p = pSpace;.    
103a0 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43  p->flags = UNPAC
103b0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59  KED_NEED_DESTROY
103c0 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49  ;.  }.  p->pKeyI
103d0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
103e0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
103f0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
10400 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   1;.  p->aMem = 
10410 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29 70  pMem = &((Mem*)p
10420 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67 65  )[1];.  idx = ge
10430 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
10440 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
10450 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
10460 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
10470 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
10480 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
10490 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
104a0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
104b0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69  &aKey[idx], seri
104c0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66  al_type);.    if
104d0 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c  ( d>=nKey && sql
104e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
104f0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
10500 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  e)>0 ) break;.  
10510 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
10520 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
10530 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
10540 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d  Info->db;.    pM
10550 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em->flags = 0;. 
10560 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
10570 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
10580 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10590 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
105a0 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
105b0 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
105c0 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73    u++;.  }.  ass
105d0 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
105e0 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
105f0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
10600 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
10610 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )p;.}../*.** Thi
10620 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72 6f  s routine destro
10630 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63  ys a UnpackedRec
10640 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f  ord object.*/.vo
10650 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
10660 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
10670 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  rd(UnpackedRecor
10680 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
10690 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61  {.    if( p->fla
106a0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45  gs & UNPACKED_NE
106b0 45 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20 20  ED_DESTROY ){.  
106c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
106d0 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20   Mem *pMem;.    
106e0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
106f0 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
10700 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
10710 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
10720 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
10730 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10740 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
10750 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  (pMem);.        
10760 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
10770 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
10780 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44   & UNPACKED_NEED
10790 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20 73  _FREE ){.      s
107a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
107b0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29  pKeyInfo->db, p)
107c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
107d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
107e0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
107f0 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
10800 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
10810 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
10820 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
10830 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
10840 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
10850 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
10860 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
10870 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
10880 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
10890 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
108a0 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
108b0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
108c0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
108d0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20  * created by th 
108e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
108f0 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
10900 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
10910 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
10920 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
10930 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
10940 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
10950 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
10960 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
10970 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
10980 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
10990 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
109a0 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74 68  .** The key with
109b0 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69 73   fewer fields is
109c0 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65   usually compare
109d0 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
109e0 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20  .** longer key. 
109f0 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65 20   However if the 
10a00 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
10a10 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79 32   flags in pPKey2
10a20 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74   is set.** and t
10a30 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  he common prefix
10a40 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  es are equal, th
10a50 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  en key1 is less 
10a60 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72  than key2..** Or
10a70 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   if the UNPACKED
10a80 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66 6c  _MATCH_PREFIX fl
10a90 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
10aa0 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a 2a  e prefixes are.*
10ab0 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74 68  * equal, then th
10ac0 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73 69  e keys are consi
10ad0 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75 61  dered to be equa
10ae0 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72  l and.** the par
10af0 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63 6f  ts beyond the co
10b00 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65 20  mmon prefix are 
10b10 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
10b20 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 49  f the UNPACKED_I
10b30 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61 67  GNORE_ROWID flag
10b40 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
10b50 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 2a  e last byte of.*
10b60 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
10b70 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65 64  pKey1 is ignored
10b80 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
10b90 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a 2a   that pKey1 is.*
10ba0 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20  * an index key, 
10bb0 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77 69  and thus ends wi
10bc0 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75 65  th a rowid value
10bd0 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74 65  .  The last byte
10be0 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64 65  .** of the heade
10bf0 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72 65  r will therefore
10c00 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20 74   be the serial t
10c10 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
10c20 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32  :.** one of 1, 2
10c30 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c  , 3, 4, 5, 6, 8,
10c40 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74 65   or 9 - the inte
10c50 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  ger serial types
10c60 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c 20  ..** The serial 
10c70 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e 61  type of the fina
10c80 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77  l rowid will alw
10c90 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65 20  ays be a single 
10ca0 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f  byte..** By igno
10cb0 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20 62  ring this last b
10cc0 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
10cd0 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65 20  r, we force the 
10ce0 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f  comparison.** to
10cf0 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77 69   ignore the rowi
10d00 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
10d10 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  key1..*/.int sql
10d20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
10d30 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
10d40 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
10d50 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
10d60 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
10d70 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
10d80 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
10d90 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64  ey */.){.  int d
10da0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
10db0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
10dc0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
10dd0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
10de0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
10df0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
10e00 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
10e10 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
10e20 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
10e30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10e40 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
10e50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
10e60 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
10e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
10e80 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
10e90 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
10ea0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10eb0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
10ec0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
10ed0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
10ee0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
10ef0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d  2->pKeyInfo;.  m
10f00 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
10f10 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
10f20 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
10f30 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20  b;.  mem1.flags 
10f40 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c  = 0;.  mem1.zMal
10f50 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64  loc = 0;.  .  id
10f60 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
10f70 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
10f80 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
10f90 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c    if( pPKey2->fl
10fa0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
10fb0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a 20  GNORE_ROWID ){. 
10fc0 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20 7d     szHdr1--;.  }
10fd0 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  .  nField = pKey
10fe0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20  Info->nField;.  
10ff0 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64  while( idx1<szHd
11000 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e  r1 && i<pPKey2->
11010 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
11020 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
11030 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
11040 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
11050 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
11060 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
11070 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
11080 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
11090 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
110a0 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
110b0 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
110c0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
110d0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
110e0 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a  e1)>0 ) break;..
110f0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
11100 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  he values to be 
11110 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f  compared..    */
11120 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
11130 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
11140 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
11150 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29  al_type1, &mem1)
11160 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  ;..    /* Do the
11170 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20   comparison.    
11180 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
11190 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d  te3MemCompare(&m
111a0 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d  em1, &pPKey2->aM
111b0 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  em[i],.         
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111d0 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65    i<nField ? pKe
111e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
111f0 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
11200 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65  !=0 ){.      bre
11210 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b  ak;.    }.    i+
11220 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d  +;.  }.  if( mem
11230 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  1.zMalloc ) sqli
11240 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
11250 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66 28  e(&mem1);..  if(
11260 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a   rc==0 ){.    /*
11270 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e   rc==0 here mean
11280 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68  s that one of th
11290 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
112a0 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 20  f fields and.   
112b0 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
112c0 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
112d0 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
112e0 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
112f0 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20 66  INCRKEY.    ** f
11300 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
11310 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20 62   break the tie b
11320 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32 20  y treating key2 
11330 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20 2a  as larger..    *
11340 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45 44  * If the UPACKED
11350 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66 6c  _PREFIX_MATCH fl
11360 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
11370 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f 6e  keys with common
11380 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a 2a   prefixes.    **
11390 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
113a0 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f 74  to be equal.  Ot
113b0 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f 6e  herwise, the lon
113c0 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 0a  ger key is the .
113d0 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20      ** larger.  
113e0 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74  As it happens, t
113f0 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61  he pPKey2 will a
11400 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e  lways be the lon
11410 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ger.    ** if th
11420 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72 65  ere is a differe
11430 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nce..    */.    
11440 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67  if( pPKey2->flag
11450 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43  s & UNPACKED_INC
11460 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72 63  RKEY ){.      rc
11470 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
11480 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
11490 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52  gs & UNPACKED_PR
114a0 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20 20  EFIX_MATCH ){.  
114b0 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 3d      /* Leave rc=
114c0 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20  =0 */.    }else 
114d0 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  if( idx1<szHdr1 
114e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  ){.      rc = 1;
114f0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
11500 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
11510 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
11520 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20  yInfo->nField.  
11530 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
11540 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
11550 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
11560 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
11570 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a 0a  return rc;.}. ..
11580 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
11590 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
115a0 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
115b0 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
115c0 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
115d0 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
115e0 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
115f0 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
11600 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
11610 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
11620 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
11630 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
11640 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
11650 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
11660 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
11670 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
11680 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
11690 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
116a0 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
116b0 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
116c0 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
116d0 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
116e0 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
116f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11700 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74 43  VdbeIdxRowid(BtC
11710 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
11720 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20   *rowid){.  i64 
11730 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
11740 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a  int rc;.  u32 sz
11750 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  Hdr;        /* S
11760 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
11770 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52  r */.  u32 typeR
11780 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69  owid;    /* Seri
11790 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72  al type of the r
117a0 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65  owid */.  u32 le
117b0 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53  nRowid;     /* S
117c0 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ize of the rowid
117d0 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a   */.  Mem m, v;.
117e0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69  .  /* Get the si
117f0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ze of the index 
11800 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64  entry.  Only ind
11810 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20  ices entries of 
11820 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32  less.  ** than 2
11830 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20  GiB are support 
11840 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65  - anything large
11850 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73   must be databas
11860 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
11870 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
11880 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
11890 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 75 6e  llKey);.  if( un
118a0 6c 69 6b 65 6c 79 28 6e 43 65 6c 6c 4b 65 79 3c  likely(nCellKey<
118b0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
118c0 78 37 66 66 66 66 66 66 66 29 20 29 7b 0a 20 20  x7fffffff) ){.  
118d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
118e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
118f0 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  }..  /* Read in 
11900 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
11910 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
11920 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e 66  x entry */.  m.f
11930 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62  lags = 0;.  m.db
11940 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f   = 0;.  m.zMallo
11950 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  c = 0;.  rc = sq
11960 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
11970 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
11980 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  int)nCellKey, 1,
11990 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
119a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
119b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
119c0 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
119d0 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
119e0 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
119f0 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
11a00 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
11a10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
11a20 48 64 72 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  Hdr==2 );.  test
11a30 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
11a40 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
11a50 6c 79 28 73 7a 48 64 72 3c 32 20 7c 7c 20 28 69  ly(szHdr<2 || (i
11a60 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
11a70 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
11a80 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
11a90 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
11aa0 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
11ab0 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
11ac0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
11ad0 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
11ae0 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
11af0 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
11b00 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
11b10 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
11b20 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
11b30 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
11b40 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
11b50 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
11b60 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
11b70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
11b80 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
11b90 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
11ba0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
11bb0 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
11bc0 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
11bd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
11be0 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
11bf0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
11c00 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
11c10 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
11c20 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
11c30 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
11c40 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
11c50 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
11c60 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
11c70 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
11c80 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
11c90 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
11ca0 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
11cb0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
11cc0 73 65 28 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  se( m.n-lenRowid
11cd0 3d 3d 73 7a 48 64 72 20 29 3b 0a 20 20 69 66 28  ==szHdr );.  if(
11ce0 20 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e 2d 6c 65   unlikely(m.n-le
11cf0 6e 52 6f 77 69 64 3c 73 7a 48 64 72 29 20 29 7b  nRowid<szHdr) ){
11d00 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
11d10 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
11d20 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
11d30 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
11d40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
11d50 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
11d60 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11d70 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
11d80 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
11d90 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
11da0 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
11db0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
11dc0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
11dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11de0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
11df0 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
11e00 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
11e10 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
11e20 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
11e30 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
11e40 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
11e50 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11e60 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
11e70 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
11e80 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c  estcase( m.zMall
11e90 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
11ea0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
11eb0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
11ec0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11ed0 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
11ee0 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
11ef0 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
11f00 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
11f10 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
11f20 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
11f30 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
11f40 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
11f50 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
11f60 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
11f70 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
11f80 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
11f90 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
11fa0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
11fb0 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
11fc0 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
11fd0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
11fe0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79  cess..**.** pKey
11ff0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
12000 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
12010 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
12020 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
12030 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
12040 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
12050 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
12060 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
12070 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
12080 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
12090 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
120a0 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
120b0 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
120c0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
120d0 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
120e0 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
120f0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  ntire key..**.**
12100 20 70 55 6e 70 61 63 6b 65 64 20 6d 61 79 20 62   pUnpacked may b
12110 65 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 76 65  e an unpacked ve
12120 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e 4b  rsion of pKey,nK
12130 65 79 2e 20 20 49 66 20 70 55 6e 70 61 63 6b 65  ey.  If pUnpacke
12140 64 20 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65 64  d is.** supplied
12150 20 69 74 20 69 73 20 75 73 65 64 20 69 6e 20 70   it is used in p
12160 6c 61 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b 65  lace of pKey,nKe
12170 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12180 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
12190 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72  re(.  VdbeCursor
121a0 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
121b0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
121c0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
121d0 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
121e0 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
121f0 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  d,  /* Unpacked 
12200 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20  version of pKey 
12210 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69 6e  and nKey */.  in
12220 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
12230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12240 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
12250 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
12260 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
12270 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
12280 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
12290 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72  ur = pC->pCursor
122a0 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 71  ;.  Mem m;..  sq
122b0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
122c0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
122d0 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
122e0 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
122f0 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a  y>0x7fffffff ){.
12300 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
12310 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12320 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d  OK;.  }.  m.db =
12330 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20   0;.  m.flags = 
12340 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d  0;.  m.zMalloc =
12350 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
12360 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
12370 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
12380 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79  0, (int)nCellKey
12390 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
123a0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
123b0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
123c0 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c  t( pUnpacked->fl
123d0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49  ags & UNPACKED_I
123e0 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20  GNORE_ROWID );. 
123f0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
12400 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
12410 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61  (m.n, m.z, pUnpa
12420 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cked);.  sqlite3
12430 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
12440 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
12450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12460 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
12470 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ts the value to 
12480 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  be returned by s
12490 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
124a0 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68  to.** sqlite3_ch
124b0 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64  anges() on the d
124c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27  atabase handle '
124d0 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  db'. .*/.void sq
124e0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
124f0 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ges(sqlite3 *db,
12500 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20   int nChange){. 
12510 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12520 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12530 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e  mutex) );.  db->
12540 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67  nChange = nChang
12550 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  e;.  db->nTotalC
12560 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65  hange += nChange
12570 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
12580 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62   flag in the vdb
12590 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  e to update the 
125a0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77  change counter w
125b0 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69  hen it is finali
125c0 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e  sed.** or reset.
125d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
125e0 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73  VdbeCountChanges
125f0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e  (Vdbe *v){.  v->
12600 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b  changeCntOn = 1;
12610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65  .}../*.** Mark e
12620 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74  very prepared st
12630 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74  atement associat
12640 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
12650 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
12660 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a   as expired..**.
12670 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74  ** An expired st
12680 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68  atement means th
12690 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e  at recompilation
126a0 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
126b0 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e  t is.** recommen
126c0 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65  d.  Statements e
126d0 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67  xpire when thing
126e0 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61  s happen that ma
126f0 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67  ke their.** prog
12700 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20  rams obsolete.  
12710 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65  Removing user-de
12720 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
12730 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  or collating.** 
12740 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68  sequences, or ch
12750 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72  anging an author
12760 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ization function
12770 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f   are the types o
12780 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74  f.** things that
12790 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73   make prepared s
127a0 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65  tatements obsole
127b0 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  te..*/.void sqli
127c0 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
127d0 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69  dStatements(sqli
127e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
127f0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64   *p;.  for(p = d
12800 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70  b->pVdbe; p; p=p
12810 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d  ->pNext){.    p-
12820 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
12830 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
12840 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
12850 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12860 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69  he Vdbe..*/.sqli
12870 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65  te3 *sqlite3Vdbe
12880 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72  Db(Vdbe *v){.  r
12890 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a     eturn v->db;.}.