/ Hex Artifact Content
Login

Artifact 7bb91382da8f4e904650ed4a393f7ae83bee8669:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23  lude <ctype.h>.#
02d0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74  include "vdbeInt
02e0: 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  .h"..../*.** Whe
02f0: 6e 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20  n debugging the 
0300: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69  code generator i
0310: 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62  n a symbolic deb
0320: 75 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a  ugger, one can.*
0330: 2a 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65  * set the sqlite
0340: 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61  3_vdbe_addop_tra
0350: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
0360: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
0370: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
0380: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
0390: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03a0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
03c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  nt sqlite3_vdbe_
03d0: 61 64 64 6f 70 5f 74 72 61 63 65 20 3d 20 30 3b  addop_trace = 0;
03e0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
03f0: 43 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72  Create a new vir
0400: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
0410: 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  gine..*/.Vdbe *s
0420: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
0430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
0440: 20 56 64 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20   Vdbe *p;.  p = 
0450: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
0460: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 56  ero(db, sizeof(V
0470: 64 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  dbe) );.  if( p=
0480: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
0490: 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69   p->db = db;.  i
04a0: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a  f( db->pVdbe ){.
04b0: 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70      db->pVdbe->p
04c0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Prev = p;.  }.  
04d0: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70  p->pNext = db->p
04e0: 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76  Vdbe;.  p->pPrev
04f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62   = 0;.  db->pVdb
0500: 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69  e = p;.  p->magi
0510: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
0520: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  NIT;.  return p;
0530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62  .}../*.** Rememb
0540: 65 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e  er the SQL strin
0550: 67 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64  g for a prepared
0560: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
0570: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
0580: 65 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63  etSql(Vdbe *p, c
0590: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
05a0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30  t n){.  if( p==0
05b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
05c0: 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20  ert( p->zSql==0 
05d0: 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73  );.  p->zSql = s
05e0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
05f0: 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a  p->db, z, n);.}.
0600: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0610: 65 20 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64  e SQL associated
0620: 20 77 69 74 68 20 61 20 70 72 65 70 61 72 65 64   with a prepared
0630: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f   statement.*/.co
0640: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0650: 33 56 64 62 65 47 65 74 53 71 6c 28 56 64 62 65  3VdbeGetSql(Vdbe
0660: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
0670: 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->zSql;.}../*.**
0680: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0690: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
06a0: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
06b0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
06c0: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
06d0: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
06e0: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
06f0: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 69   char *zTmp;.  i
0700: 6e 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20 3d  nt nTmp;.  tmp =
0710: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
0720: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
0730: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
0740: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
0750: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
0760: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0770: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0780: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0790: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
07a0: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
07b0: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
07c0: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
07d0: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
07e0: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
07f0: 20 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71 6c   nTmp = pA->nSql
0800: 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20 70  ;.  pA->nSql = p
0810: 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e 6e  B->nSql;.  pB->n
0820: 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a 23  Sql = nTmp;.}..#
0830: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
0840: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72  UG./*.** Turn tr
0850: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a  acing on or off.
0860: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0870: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70  dbeTrace(Vdbe *p
0880: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a  , FILE *trace){.
0890: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61    p->trace = tra
08a0: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ce;.}.#endif../*
08b0: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56  .** Resize the V
08c0: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f  dbe.aOp array so
08d0: 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e   that it contain
08e0: 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a 20  s at least N.** 
08f0: 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  elements..**.** 
0900: 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  If an out-of-mem
0910: 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ory error occurs
0920: 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67 20   while resizing 
0930: 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56 64  the array,.** Vd
0940: 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65 2e  be.aOp and Vdbe.
0950: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0960: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0970: 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 6e  is so that.** an
0980: 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64  y opcodes alread
0990: 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20  y allocated can 
09a0: 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61  be correctly dea
09b0: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e  llocated.** alon
09c0: 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20  g with the rest 
09d0: 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f  of the Vdbe)..*/
09e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
09f0: 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  izeOpArray(Vdbe 
0a00: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56 64  *p, int N){.  Vd
0a10: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  beOp *pNew;.  in
0a20: 74 20 6f 6c 64 53 69 7a 65 20 3d 20 70 2d 3e 6e  t oldSize = p->n
0a30: 4f 70 41 6c 6c 6f 63 3b 0a 20 20 70 4e 65 77 20  OpAlloc;.  pNew 
0a40: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
0a50: 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70  oc(p->db, p->aOp
0a60: 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  , N*sizeof(Op));
0a70: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0a80: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
0a90: 20 4e 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d   N;.    p->aOp =
0aa0: 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 4e   pNew;.    if( N
0ab0: 3e 6f 6c 64 53 69 7a 65 20 29 7b 0a 20 20 20 20  >oldSize ){.    
0ac0: 20 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70    memset(&p->aOp
0ad0: 5b 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 4e  [oldSize], 0, (N
0ae0: 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 7a 65 6f 66  -oldSize)*sizeof
0af0: 28 4f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (Op));.    }.  }
0b00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
0b10: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  new instruction 
0b20: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
0b30: 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72  nstructions curr
0b40: 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44  ent in the.** VD
0b50: 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  BE.  Return the 
0b60: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
0b70: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ew instruction..
0b80: 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73  **.** Parameters
0b90: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20  :.**.**    p    
0ba0: 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74             Point
0bb0: 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a  er to the VDBE.*
0bc0: 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20  *.**    op      
0bd0: 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f          The opco
0be0: 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  de for this inst
0bf0: 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20  ruction.**.**   
0c00: 20 70 31 2c 20 70 32 20 20 20 20 20 20 20 20 20   p1, p2         
0c10: 20 46 69 72 73 74 20 74 77 6f 20 6f 66 20 74 68   First two of th
0c20: 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
0c30: 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   operands..**.**
0c40: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
0c50: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
0c60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
0c70: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
0c80: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
0c90: 56 64 62 65 43 68 61 6e 67 65 50 33 28 29 20 66  VdbeChangeP3() f
0ca0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
0cb0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0cc0: 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P3.** operand
0cd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0ce0: 56 64 62 65 41 64 64 4f 70 28 56 64 62 65 20 2a  VdbeAddOp(Vdbe *
0cf0: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
0d00: 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e  1, int p2){.  in
0d10: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0d20: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0d30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0d40: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0d50: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0d70: 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  {.    resizeOpAr
0d80: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c  ray(p, p->nOpAll
0d90: 6f 63 2a 32 20 2b 20 31 30 30 29 3b 0a 20 20 20  oc*2 + 100);.   
0da0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0db0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0dc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0dd0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0de0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0df0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0e00: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0e10: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e20: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e30: 3e 70 33 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p3 = 0;.  pOp->
0e40: 70 33 74 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55  p3type = P3_NOTU
0e50: 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  SED;.  p->expire
0e60: 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  d = 0;.#ifdef SQ
0e70: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28  LITE_DEBUG.  if(
0e80: 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f 61 64   sqlite3_vdbe_ad
0e90: 64 6f 70 5f 74 72 61 63 65 20 29 20 73 71 6c 69  dop_trace ) sqli
0ea0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
0eb0: 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
0ec0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
0ed0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n i;.}../*.** Ad
0ee0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
0ef0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 33   includes the p3
0f00: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73   value..*/.int s
0f10: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 56 64  qlite3VdbeOp3(Vd
0f20: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0f30: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 63  nt p1, int p2, c
0f40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 69  onst char *zP3,i
0f50: 6e 74 20 70 33 74 79 70 65 29 7b 0a 20 20 69 6e  nt p3type){.  in
0f60: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
0f70: 56 64 62 65 41 64 64 4f 70 28 70 2c 20 6f 70 2c  VdbeAddOp(p, op,
0f80: 20 70 31 2c 20 70 32 29 3b 0a 20 20 73 71 6c 69   p1, p2);.  sqli
0f90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
0fa0: 70 2c 20 61 64 64 72 2c 20 7a 50 33 2c 20 70 33  p, addr, zP3, p3
0fb0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
0fc0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
0fd0: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
0fe0: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
0ff0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
1000: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
1010: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
1020: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
1030: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
1040: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1050: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
1060: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
1070: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
1080: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
1090: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
10a0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
10b0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
10c0: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
10d0: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
10e0: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
10f0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
1100: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
1110: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
1120: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
1130: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
1140: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
1150: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
1160: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
1170: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
1180: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
1190: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
11a0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
11b0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
11c0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
11d0: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
11e0: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
11f0: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
1200: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
1210: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
1220: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
1230: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1240: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1250: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
1260: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
1270: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
1280: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
1290: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
12a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69  _INIT );.  if( i
12b0: 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63  >=p->nLabelAlloc
12c0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65   ){.    p->nLabe
12d0: 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62  lAlloc = p->nLab
12e0: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a  elAlloc*2 + 10;.
12f0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1300: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1310: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1320: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  >aLabel,.       
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
1350: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65  nLabelAlloc*size
1360: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
1370: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
1380: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
1390: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
13a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
13b0: 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  -i;.}../*.** Res
13c0: 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 74  olve label "x" t
13d0: 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 73  o be the address
13e0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
13f0: 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62  truction to.** b
1400: 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 65  e inserted.  The
1410: 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 6d   parameter "x" m
1420: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62  ust have been ob
1430: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61  tained from.** a
1440: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
1450: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1460: 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  bel()..*/.void s
1470: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
1480: 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 2c 20  eLabel(Vdbe *p, 
1490: 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20  int x){.  int j 
14a0: 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 74  = -1-x;.  assert
14b0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
14c0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
14d0: 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 26 26   assert( j>=0 &&
14e0: 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a   j<p->nLabel );.
14f0: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1500: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1510: 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  [j] = p->nOp;.  
1520: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
1530: 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6f 70  n non-zero if op
1540: 63 6f 64 65 20 27 6f 70 27 20 69 73 20 67 75 61  code 'op' is gua
1550: 72 65 6e 74 65 65 64 20 6e 6f 74 20 74 6f 20 70  renteed not to p
1560: 75 73 68 20 6d 6f 72 65 20 76 61 6c 75 65 73 0a  ush more values.
1570: 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 56 44 42 45  ** onto the VDBE
1580: 20 73 74 61 63 6b 20 74 68 61 6e 20 69 74 20 70   stack than it p
1590: 6f 70 73 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ops off..*/.stat
15a0: 69 63 20 69 6e 74 20 6f 70 63 6f 64 65 4e 6f 50  ic int opcodeNoP
15b0: 75 73 68 28 75 38 20 6f 70 29 7b 0a 20 20 2f 2a  ush(u8 op){.  /*
15c0: 20 54 68 65 20 31 30 20 4e 4f 50 55 53 48 5f 4d   The 10 NOPUSH_M
15d0: 41 53 4b 5f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  ASK_n constants 
15e0: 61 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74  are defined in t
15f0: 68 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  he automatically
1600: 0a 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  .  ** generated 
1610: 68 65 61 64 65 72 20 66 69 6c 65 20 6f 70 63 6f  header file opco
1620: 64 65 73 2e 68 2e 20 45 61 63 68 20 69 73 20 61  des.h. Each is a
1630: 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b 2c   16-bit bitmask,
1640: 20 6f 6e 65 0a 20 20 2a 2a 20 62 69 74 20 63 6f   one.  ** bit co
1650: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 65  rresponding to e
1660: 61 63 68 20 6f 70 63 6f 64 65 20 69 6d 70 6c 65  ach opcode imple
1670: 6d 65 6e 74 65 64 20 62 79 20 74 68 65 20 76 69  mented by the vi
1680: 72 74 75 61 6c 0a 20 20 2a 2a 20 6d 61 63 68 69  rtual.  ** machi
1690: 6e 65 20 69 6e 20 76 64 62 65 2e 63 2e 20 54 68  ne in vdbe.c. Th
16a0: 65 20 62 69 74 20 69 73 20 74 72 75 65 20 69 66  e bit is true if
16b0: 20 74 68 65 20 77 6f 72 64 20 22 6e 6f 2d 70 75   the word "no-pu
16c0: 73 68 22 20 61 70 70 65 61 72 73 0a 20 20 2a 2a  sh" appears.  **
16d0: 20 69 6e 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 6e   in a comment on
16e0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 20 61   the same line a
16f0: 73 20 74 68 65 20 22 63 61 73 65 20 4f 50 5f 58  s the "case OP_X
1700: 58 58 3a 22 20 69 6e 20 0a 20 20 2a 2a 20 73 71  XX:" in .  ** sq
1710: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 20  lite3VdbeExec() 
1720: 69 6e 20 76 64 62 65 2e 63 2e 0a 20 20 2a 2a 0a  in vdbe.c..  **.
1730: 20 20 2a 2a 20 49 66 20 74 68 65 20 62 69 74 20    ** If the bit 
1740: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1750: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
1760: 6f 70 63 6f 64 65 20 69 73 20 67 75 61 72 65 6e  opcode is guaren
1770: 74 65 65 64 20 6e 6f 74 0a 20 20 2a 2a 20 74 6f  teed not.  ** to
1780: 20 67 72 6f 77 20 74 68 65 20 73 74 61 63 6b 20   grow the stack 
1790: 77 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  when it is execu
17a0: 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ted. Otherwise, 
17b0: 69 74 20 6d 61 79 20 67 72 6f 77 20 74 68 65 0a  it may grow the.
17c0: 20 20 2a 2a 20 73 74 61 63 6b 20 62 79 20 61 74    ** stack by at
17d0: 20 6d 6f 73 74 20 6f 6e 65 20 65 6e 74 72 79 2e   most one entry.
17e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 4f 50 55 53  .  **.  ** NOPUS
17f0: 48 5f 4d 41 53 4b 5f 30 20 63 6f 72 72 65 73 70  H_MASK_0 corresp
1800: 6f 6e 64 73 20 74 6f 20 6f 70 63 6f 64 65 73 20  onds to opcodes 
1810: 30 20 74 6f 20 31 35 2e 20 4e 4f 50 55 53 48 5f  0 to 15. NOPUSH_
1820: 4d 41 53 4b 5f 31 20 63 6f 6e 74 61 69 6e 73 0a  MASK_1 contains.
1830: 20 20 2a 2a 20 6f 6e 65 20 62 69 74 20 66 6f 72    ** one bit for
1840: 20 6f 70 63 6f 64 65 73 20 31 36 20 74 6f 20 33   opcodes 16 to 3
1850: 31 2c 20 61 6e 64 20 73 6f 20 6f 6e 2e 0a 20 20  1, and so on..  
1860: 2a 2a 0a 20 20 2a 2a 20 31 36 2d 62 69 74 20 62  **.  ** 16-bit b
1870: 69 74 6d 61 73 6b 73 20 28 72 61 74 68 65 72 20  itmasks (rather 
1880: 74 68 61 6e 20 33 32 2d 62 69 74 29 20 61 72 65  than 32-bit) are
1890: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 6f 70   specified in op
18a0: 63 6f 64 65 73 2e 68 20 0a 20 20 2a 2a 20 62 65  codes.h .  ** be
18b0: 63 61 75 73 65 20 74 68 65 20 66 69 6c 65 20 69  cause the file i
18c0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  s generated by a
18d0: 6e 20 61 77 6b 20 70 72 6f 67 72 61 6d 2e 20 41  n awk program. A
18e0: 77 6b 20 6d 61 6e 69 70 75 6c 61 74 65 73 0a 20  wk manipulates. 
18f0: 20 2a 2a 20 61 6c 6c 20 6e 75 6d 62 65 72 73 20   ** all numbers 
1900: 61 73 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e  as floating-poin
1910: 74 20 61 6e 64 20 77 65 20 64 6f 6e 27 74 20 77  t and we don't w
1920: 61 6e 74 20 74 6f 20 72 69 73 6b 20 61 20 72 6f  ant to risk a ro
1930: 75 6e 64 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  unding.  ** erro
1940: 72 20 69 66 20 73 6f 6d 65 6f 6e 65 20 62 75 69  r if someone bui
1950: 6c 64 73 20 77 69 74 68 20 61 6e 20 61 77 6b 20  lds with an awk 
1960: 74 68 61 74 20 75 73 65 73 20 28 66 6f 72 20 65  that uses (for e
1970: 78 61 6d 70 6c 65 29 20 33 32 2d 62 69 74 20 0a  xample) 32-bit .
1980: 20 20 2a 2a 20 49 45 45 45 20 66 6c 6f 61 74 73    ** IEEE floats
1990: 2e 0a 20 20 2a 2f 20 0a 20 20 73 74 61 74 69 63  ..  */ .  static
19a0: 20 63 6f 6e 73 74 20 75 33 32 20 6d 61 73 6b 73   const u32 masks
19b0: 5b 35 5d 20 3d 20 7b 0a 20 20 20 20 4e 4f 50 55  [5] = {.    NOPU
19c0: 53 48 5f 4d 41 53 4b 5f 30 20 2b 20 28 28 28 75  SH_MASK_0 + (((u
19d0: 6e 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d  nsigned)NOPUSH_M
19e0: 41 53 4b 5f 31 29 3c 3c 31 36 29 2c 0a 20 20 20  ASK_1)<<16),.   
19f0: 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 32 20 2b   NOPUSH_MASK_2 +
1a00: 20 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50   (((unsigned)NOP
1a10: 55 53 48 5f 4d 41 53 4b 5f 33 29 3c 3c 31 36 29  USH_MASK_3)<<16)
1a20: 2c 0a 20 20 20 20 4e 4f 50 55 53 48 5f 4d 41 53  ,.    NOPUSH_MAS
1a30: 4b 5f 34 20 2b 20 28 28 28 75 6e 73 69 67 6e 65  K_4 + (((unsigne
1a40: 64 29 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 35 29  d)NOPUSH_MASK_5)
1a50: 3c 3c 31 36 29 2c 0a 20 20 20 20 4e 4f 50 55 53  <<16),.    NOPUS
1a60: 48 5f 4d 41 53 4b 5f 36 20 2b 20 28 28 28 75 6e  H_MASK_6 + (((un
1a70: 73 69 67 6e 65 64 29 4e 4f 50 55 53 48 5f 4d 41  signed)NOPUSH_MA
1a80: 53 4b 5f 37 29 3c 3c 31 36 29 2c 0a 20 20 20 20  SK_7)<<16),.    
1a90: 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 38 20 2b 20  NOPUSH_MASK_8 + 
1aa0: 28 28 28 75 6e 73 69 67 6e 65 64 29 4e 4f 50 55  (((unsigned)NOPU
1ab0: 53 48 5f 4d 41 53 4b 5f 39 29 3c 3c 31 36 29 0a  SH_MASK_9)<<16).
1ac0: 20 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 6f    };.  assert( o
1ad0: 70 3c 33 32 2a 35 20 29 3b 0a 20 20 72 65 74 75  p<32*5 );.  retu
1ae0: 72 6e 20 28 6d 61 73 6b 73 5b 6f 70 3e 3e 35 5d  rn (masks[op>>5]
1af0: 20 26 20 28 31 3c 3c 28 6f 70 26 30 78 31 46 29   & (1<<(op&0x1F)
1b00: 29 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  ));.}..#ifndef N
1b10: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1b20: 33 56 64 62 65 4f 70 63 6f 64 65 4e 6f 50 75 73  3VdbeOpcodeNoPus
1b30: 68 28 75 38 20 6f 70 29 7b 0a 20 20 72 65 74 75  h(u8 op){.  retu
1b40: 72 6e 20 6f 70 63 6f 64 65 4e 6f 50 75 73 68 28  rn opcodeNoPush(
1b50: 6f 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  op);.}.#endif../
1b60: 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67  *.** Loop throug
1b70: 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f  h the program lo
1b80: 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c  oking for P2 val
1b90: 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 65 67  ues that are neg
1ba0: 61 74 69 76 65 2e 0a 2a 2a 20 45 61 63 68 20 73  ative..** Each s
1bb0: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1bc0: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1bd0: 68 65 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74  he label by sett
1be0: 69 6e 67 20 74 68 65 20 50 32 0a 2a 2a 20 76 61  ing the P2.** va
1bf0: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
1c00: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
1c10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1c20: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1c30: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
1c40: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1c50: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1c60: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1c70: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1c80: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1c90: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1ca0: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1cb0: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1cc0: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1cd0: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1ce0: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
1cf0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
1d00: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
1d10: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
1d20: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
1d30: 54 68 65 20 69 6e 74 65 67 65 72 20 2a 70 4d 61  The integer *pMa
1d40: 78 53 74 61 63 6b 20 69 73 20 73 65 74 20 74 6f  xStack is set to
1d50: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
1d60: 62 65 72 20 6f 66 20 76 64 62 65 20 73 74 61 63  ber of vdbe stac
1d70: 6b 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61  k.** entries tha
1d80: 74 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73 69  t static analysi
1d90: 73 20 72 65 76 65 61 6c 73 20 74 68 69 73 20 70  s reveals this p
1da0: 72 6f 67 72 61 6d 20 6d 69 67 68 74 20 6e 65 65  rogram might nee
1db0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1dc0: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
1dd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
1de0: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
1df0: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 48 61 6c  scans for.** Hal
1e00: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 77  t instructions w
1e10: 68 65 72 65 20 50 31 3d 3d 53 51 4c 49 54 45 5f  here P1==SQLITE_
1e20: 43 4f 4e 53 54 52 41 49 4e 54 20 6f 72 20 50 32  CONSTRAINT or P2
1e30: 3d 3d 4f 45 5f 41 62 6f 72 74 20 6f 72 20 66 6f  ==OE_Abort or fo
1e40: 72 0a 2a 2a 20 49 64 78 49 6e 73 65 72 74 20 69  r.** IdxInsert i
1e50: 6e 73 74 72 75 63 74 69 6f 6e 73 20 77 68 65 72  nstructions wher
1e60: 65 20 50 32 21 3d 30 2e 20 20 49 66 20 6e 6f 20  e P2!=0.  If no 
1e70: 73 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  such instruction
1e80: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68   is.** found, th
1e90: 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d 65  en every Stateme
1ea0: 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  nt instruction i
1eb0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
1ec0: 6f 6f 70 2e 20 20 49 6e 0a 2a 2a 20 74 68 69 73  oop.  In.** this
1ed0: 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 20 63   way, we avoid c
1ee0: 72 65 61 74 69 6e 67 20 74 68 65 20 73 74 61 74  reating the stat
1ef0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  ement journal fi
1f00: 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  le unnecessarily
1f10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f20: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
1f30: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
1f40: 4d 61 78 46 75 6e 63 41 72 67 73 2c 20 69 6e 74  MaxFuncArgs, int
1f50: 20 2a 70 4d 61 78 53 74 61 63 6b 29 7b 0a 20 20   *pMaxStack){.  
1f60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61  int i;.  int nMa
1f70: 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 69 6e 74  xArgs = 0;.  int
1f80: 20 6e 4d 61 78 53 74 61 63 6b 20 3d 20 70 2d 3e   nMaxStack = p->
1f90: 6e 4f 70 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  nOp;.  Op *pOp;.
1fa0: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
1fb0: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74  p->aLabel;.  int
1fc0: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1fd0: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  llback = 0;.  in
1fe0: 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  t hasStatementBe
1ff0: 67 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  gin = 0;.  for(p
2000: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
2010: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
2020: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38  , pOp++){.    u8
2030: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2040: 70 63 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20  pcode;..    if( 
2050: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
2060: 69 6f 6e 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ion || opcode==O
2070: 50 5f 41 67 67 53 74 65 70 20 0a 23 69 66 6e 64  P_AggStep .#ifnd
2080: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2090: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
20a0: 20 20 20 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f      || opcode==O
20b0: 50 5f 56 55 70 64 61 74 65 0a 23 65 6e 64 69 66  P_VUpdate.#endif
20c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
20d0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
20e0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
20f0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 7d 0a 20  pOp->p2;.    }. 
2100: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
2110: 50 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20  P_Halt ){.      
2120: 69 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c  if( pOp->p1==SQL
2130: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2140: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2150: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64  ort ){.        d
2160: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
2170: 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
2180: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
2190: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65  opcode==OP_State
21a0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61  ment ){.      ha
21b0: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
21c0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
21d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
21e0: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
21f0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
2200: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
2210: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a  ==OP_VRename ){.
2220: 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d        doesStatem
2230: 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  entRollback = 1;
2240: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
2250: 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65  pcode==OP_VFilte
2260: 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
2270: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2280: 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20  p->nOp - i >= 3 
2290: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22a0: 20 70 4f 70 5b 2d 32 5d 2e 6f 70 63 6f 64 65 3d   pOp[-2].opcode=
22b0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
22c0: 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 32 5d       n = pOp[-2]
22d0: 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  .p1;.      if( n
22e0: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
22f0: 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66  Args = n;.#endif
2300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
2310: 70 63 6f 64 65 4e 6f 50 75 73 68 28 6f 70 63 6f  pcodeNoPush(opco
2320: 64 65 29 20 29 7b 0a 20 20 20 20 20 20 6e 4d 61  de) ){.      nMa
2330: 78 53 74 61 63 6b 2d 2d 3b 0a 20 20 20 20 7d 0a  xStack--;.    }.
2340: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32  .    if( pOp->p2
2350: 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  >=0 ) continue;.
2360: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
2370: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
2380: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 32 20   );.    pOp->p2 
2390: 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d  = aLabel[-1-pOp-
23a0: 3e 70 32 5d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  >p2];.  }.  sqli
23b0: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62  te3_free(p->aLab
23c0: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
23d0: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
23e0: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
23f0: 73 3b 0a 20 20 2a 70 4d 61 78 53 74 61 63 6b 20  s;.  *pMaxStack 
2400: 3d 20 6e 4d 61 78 53 74 61 63 6b 3b 0a 0a 20 20  = nMaxStack;..  
2410: 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72  /* If we never r
2420: 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
2430: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
2440: 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a   then statement.
2450: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
2460: 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64  s are not needed
2470: 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65  .  So change eve
2480: 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a  ry OP_Statement.
2490: 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f    ** opcode into
24a0: 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68   an OP_Noop.  Th
24b0: 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20  is avoid a call 
24c0: 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  to sqlite3OsOpen
24d0: 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a  Exclusive().  **
24e0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78   which can be ex
24f0: 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20  pensive on some 
2500: 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a  platforms..  */.
2510: 20 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65    if( hasStateme
2520: 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73  ntBegin && !does
2530: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
2540: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70  k ){.    for(pOp
2550: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2560: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2570: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
2580: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2590: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
25a0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
25b0: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
25c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
25d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25e0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
25f0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2600: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
2610: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
2620: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2630: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2640: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2650: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
2670: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
2680: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
2690: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
26a0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
26b0: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
26c0: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
26d0: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
26e0: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
26f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2700: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
2710: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
2720: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
2730: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
2740: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2750: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2760: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
2770: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
2780: 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65  oc ){.    resize
2790: 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f  OpArray(p, p->nO
27a0: 70 2a 32 20 2b 20 6e 4f 70 29 3b 0a 20 20 7d 0a  p*2 + nOp);.  }.
27b0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
27c0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
27d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
27e0: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a   addr = p->nOp;.
27f0: 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20    if( nOp>0 ){. 
2800: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
2810: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
2820: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
2830: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
2840: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
2850: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
2860: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
2870: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
2880: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
2890: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
28a0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
28b0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
28c0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p1;.      pOut
28d0: 2d 3e 70 32 20 3d 20 70 32 3c 30 20 3f 20 61 64  ->p2 = p2<0 ? ad
28e0: 64 72 20 2b 20 41 44 44 52 28 70 32 29 20 3a 20  dr + ADDR(p2) : 
28f0: 70 32 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  p2;.      pOut->
2900: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
2910: 20 20 20 20 70 4f 75 74 2d 3e 70 33 74 79 70 65      pOut->p3type
2920: 20 3d 20 70 49 6e 2d 3e 70 33 20 3f 20 50 33 5f   = pIn->p3 ? P3_
2930: 53 54 41 54 49 43 20 3a 20 50 33 5f 4e 4f 54 55  STATIC : P3_NOTU
2940: 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  SED;.#ifdef SQLI
2950: 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69  TE_DEBUG.      i
2960: 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 65 5f  f( sqlite3_vdbe_
2970: 61 64 64 6f 70 5f 74 72 61 63 65 20 29 7b 0a 20  addop_trace ){. 
2980: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2990: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
29a0: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
29b0: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
29c0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
29d0: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
29e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
29f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
2a00: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2a10: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
2a20: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2a30: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
2a40: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
2a50: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
2a60: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
2a70: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
2a80: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
2a90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2aa0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
2ab0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
2ac0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
2ad0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
2ae0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2af0: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
2b00: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2b10: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2b20: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2b40: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2b50: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2b60: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2b70: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2b80: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
2b90: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2ba0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2bb0: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
2bc0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2bd0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2be0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2bf0: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
2c00: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
2c10: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
2c20: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c30: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP2(Vdbe *p, int
2c40: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2c50: 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c 3e 3d  .  assert( val>=
2c60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2c70: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2c80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2c90: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2ca0: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2cb0: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2cc0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2cd0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
2ce0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2cf0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
2d00: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
2d10: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
2d20: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
2d30: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2d40: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2d50: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
2d60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2d70: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
2d80: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2d90: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2da0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
2db0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
2dc0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
2dd0: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
2de0: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
2df0: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
2e00: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
2e10: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
2e20: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
2e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2e40: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2e50: 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a 70 44  tion(FuncDef *pD
2e60: 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20  ef){.  if( pDef 
2e70: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2e80: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2e90: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2ea0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 65 66  qlite3_free(pDef
2eb0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2ec0: 44 65 6c 65 74 65 20 61 20 50 33 20 76 61 6c 75  Delete a P3 valu
2ed0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
2ee0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2ef0: 72 65 65 50 33 28 69 6e 74 20 70 33 74 79 70 65  reeP3(int p3type
2f00: 2c 20 76 6f 69 64 20 2a 70 33 29 7b 0a 20 20 69  , void *p3){.  i
2f10: 66 28 20 70 33 20 29 7b 0a 20 20 20 20 73 77 69  f( p3 ){.    swi
2f20: 74 63 68 28 20 70 33 74 79 70 65 20 29 7b 0a 20  tch( p3type ){. 
2f30: 20 20 20 20 20 63 61 73 65 20 50 33 5f 52 45 41       case P3_REA
2f40: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 33  L:.      case P3
2f50: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
2f60: 73 65 20 50 33 5f 4d 50 52 49 4e 54 46 3a 0a 20  se P3_MPRINTF:. 
2f70: 20 20 20 20 20 63 61 73 65 20 50 33 5f 44 59 4e       case P3_DYN
2f80: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
2f90: 20 50 33 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P3_KEYINFO:.   
2fa0: 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 4e     case P3_KEYIN
2fb0: 46 4f 5f 48 41 4e 44 4f 46 46 3a 20 7b 0a 20 20  FO_HANDOFF: {.  
2fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2fd0: 65 65 28 70 33 29 3b 0a 20 20 20 20 20 20 20 20  ee(p3);.        
2fe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2ff0: 20 20 20 20 20 63 61 73 65 20 50 33 5f 56 44 42       case P3_VDB
3000: 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20  EFUNC: {.       
3010: 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65   VdbeFunc *pVdbe
3020: 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63  Func = (VdbeFunc
3030: 20 2a 29 70 33 3b 0a 20 20 20 20 20 20 20 20 66   *)p3;.        f
3040: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
3050: 74 69 6f 6e 28 70 56 64 62 65 46 75 6e 63 2d 3e  tion(pVdbeFunc->
3060: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
3070: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
3080: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
3090: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
30a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 64  sqlite3_free(pVd
30b0: 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  beFunc);.       
30c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
30d0: 20 20 20 20 20 20 63 61 73 65 20 50 33 5f 46 55        case P3_FU
30e0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20  NCDEF: {.       
30f0: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
3100: 6e 63 74 69 6f 6e 28 28 46 75 6e 63 44 65 66 2a  nction((FuncDef*
3110: 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p3);.        br
3120: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3130: 20 20 20 63 61 73 65 20 50 33 5f 4d 45 4d 3a 20     case P3_MEM: 
3140: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3150: 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69  3ValueFree((sqli
3160: 74 65 33 5f 76 61 6c 75 65 2a 29 70 33 29 3b 0a  te3_value*)p3);.
3170: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3180: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3190: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  .}.../*.** Chang
31a0: 65 20 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72  e N opcodes star
31b0: 74 69 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20  ting at addr to 
31c0: 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20  No-ops..*/.void 
31d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
31e0: 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c  eToNoop(Vdbe *p,
31f0: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e   int addr, int N
3200: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  ){.  if( p && p-
3210: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65  >aOp ){.    Vdbe
3220: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
3230: 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 77 68 69  p[addr];.    whi
3240: 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20  le( N-- ){.     
3250: 20 66 72 65 65 50 33 28 70 4f 70 2d 3e 70 33 74   freeP3(pOp->p3t
3260: 79 70 65 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20  ype, pOp->p3);. 
3270: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c       memset(pOp,
3280: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
3290: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  ]));.      pOp->
32a0: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
32b0: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20  ;.      pOp++;. 
32c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
32d0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
32e0: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
32f0: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
3300: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
3310: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3320: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20   is useful when 
3330: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20  a large program 
3340: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61  is loaded from a
3350: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79  .** static array
3360: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64   using sqlite3Vd
3370: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20  beAddOpList but 
3380: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
3390: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63  a.** few minor c
33a0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72  hanges to the pr
33b0: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ogram..**.** If 
33c0: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 33  n>=0 then the P3
33d0: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61   operand is dyna
33e0: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  mic, meaning tha
33f0: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74  t a copy of.** t
3400: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64  he string is mad
3410: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
3420: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
3430: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
3440: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30   A value of n==0
3450: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65   means copy byte
3460: 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 61  s of zP3 up to a
3470: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  nd including the
3480: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62  .** first null b
3490: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65  yte.  If n>0 the
34a0: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73  n copy n+1 bytes
34b0: 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 49   of zP3..**.** I
34c0: 66 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20  f n==P3_KEYINFO 
34d0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50  it means that zP
34e0: 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  3 is a pointer t
34f0: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  o a KeyInfo stru
3500: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79  cture..** A copy
3510: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
3520: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3530: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  e into memory ob
3540: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
3550: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74  qlite3_malloc, t
3560: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20  o be freed when 
3570: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61  the Vdbe is fina
3580: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 33 5f  lized..** n==P3_
3590: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20  KEYINFO_HANDOFF 
35a0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a  indicates that z
35b0: 50 33 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b  P3 points to a K
35c0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
35d0: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  .** stored in me
35e0: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61  mory that the ca
35f0: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65  ller has obtaine
3600: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3610: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63  alloc. The .** c
3620: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  aller should not
3630: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61   free the alloca
3640: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65  tion, it will be
3650: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
3660: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c  Vdbe is.** final
3670: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68  ized..** .** Oth
3680: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28  er values of n (
3690: 50 33 5f 53 54 41 54 49 43 2c 20 50 33 5f 43 4f  P3_STATIC, P3_CO
36a0: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69  LLSEQ etc.) indi
36b0: 63 61 74 65 20 74 68 61 74 20 7a 50 33 20 70 6f  cate that zP3 po
36c0: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72  ints.** to a str
36d0: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65  ing or structure
36e0: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74   that is guarant
36f0: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72  eed to exist for
3700: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66   the lifetime of
3710: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e  .** the Vdbe. In
3720: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20   these cases we 
3730: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68  can just copy th
3740: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  e pointer..**.**
3750: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20   If addr<0 then 
3760: 63 68 61 6e 67 65 20 50 33 20 6f 6e 20 74 68 65  change P3 on the
3770: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
3780: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74  nserted instruct
3790: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
37a0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
37b0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
37c0: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  dr, const char *
37d0: 7a 50 33 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f  zP3, int n){.  O
37e0: 70 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74  p *pOp;.  assert
37f0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
3800: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3810: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  NIT );.  if( p==
3820: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  0 || p->aOp==0 |
3830: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
3840: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20  ailed ){.    if 
3850: 28 6e 20 21 3d 20 50 33 5f 4b 45 59 49 4e 46 4f  (n != P3_KEYINFO
3860: 29 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 33  ) {.      freeP3
3870: 28 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61  (n, (void*)*(cha
3880: 72 2a 2a 29 26 7a 50 33 29 3b 0a 20 20 20 20 7d  r**)&zP3);.    }
3890: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
38a0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c  .  if( addr<0 ||
38b0: 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b   addr>=p->nOp ){
38c0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
38d0: 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  Op - 1;.    if( 
38e0: 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b  addr<0 ) return;
38f0: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d  .  }.  pOp = &p-
3900: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72  >aOp[addr];.  fr
3910: 65 65 50 33 28 70 4f 70 2d 3e 70 33 74 79 70 65  eeP3(pOp->p3type
3920: 2c 20 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 70 4f  , pOp->p3);.  pO
3930: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 69 66 28  p->p3 = 0;.  if(
3940: 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP3==0 ){.    p
3950: 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 20 20  Op->p3 = 0;.    
3960: 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33  pOp->p3type = P3
3970: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73  _NOTUSED;.  }els
3980: 65 20 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49  e if( n==P3_KEYI
3990: 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  NFO ){.    KeyIn
39a0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
39b0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e 42    int nField, nB
39c0: 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c 64  yte;..    nField
39d0: 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a 50   = ((KeyInfo*)zP
39e0: 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20 20  3)->nField;.    
39f0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
3a00: 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46 69  pKeyInfo) + (nFi
3a10: 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70 4b  eld-1)*sizeof(pK
3a20: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
3a30: 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  ) + nField;.    
3a40: 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
3a50: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  e3_malloc( nByte
3a60: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 20   );.    pOp->p3 
3a70: 3d 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66  = (char*)pKeyInf
3a80: 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49  o;.    if( pKeyI
3a90: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75 6e 73  nfo ){.      uns
3aa0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 53 6f 72  igned char *aSor
3ab0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65  tOrder;.      me
3ac0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a  mcpy(pKeyInfo, z
3ad0: 50 33 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  P3, nByte);.    
3ae0: 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    aSortOrder = p
3af0: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3b00: 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61  der;.      if( a
3b10: 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  SortOrder ){.   
3b20: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
3b30: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
3b40: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
3b50: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
3b60: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  eld];.        me
3b70: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  mcpy(pKeyInfo->a
3b80: 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74  SortOrder, aSort
3b90: 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a  Order, nField);.
3ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
3bb0: 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b  p->p3type = P3_K
3bc0: 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73  EYINFO;.    }els
3bd0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  e{.      p->db->
3be0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
3bf0: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74  ;.      pOp->p3t
3c00: 79 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44  ype = P3_NOTUSED
3c10: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
3c20: 69 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46  if( n==P3_KEYINF
3c30: 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20  O_HANDOFF ){.   
3c40: 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72   pOp->p3 = (char
3c50: 2a 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP3;.    pOp->
3c60: 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49  p3type = P3_KEYI
3c70: 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NFO;.  }else if(
3c80: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d   n<0 ){.    pOp-
3c90: 3e 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33  >p3 = (char*)zP3
3ca0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70  ;.    pOp->p3typ
3cb0: 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = n;.  }else{.
3cc0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e      if( n==0 ) n
3cd0: 20 3d 20 73 74 72 6c 65 6e 28 7a 50 33 29 3b 0a   = strlen(zP3);.
3ce0: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 73 71      pOp->p3 = sq
3cf0: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
3d00: 2d 3e 64 62 2c 20 7a 50 33 2c 20 6e 29 3b 0a 20  ->db, zP3, n);. 
3d10: 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d     pOp->p3type =
3d20: 20 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d   P3_DYNAMIC;.  }
3d30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
3d40: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UG./*.** Replace
3d50: 20 74 68 65 20 50 33 20 66 69 65 6c 64 20 6f 66   the P3 field of
3d60: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
3d70: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
3d80: 74 69 6f 6e 20 77 69 74 68 0a 2a 2a 20 63 6f 6d  tion with.** com
3d90: 6d 65 6e 74 20 74 65 78 74 2e 0a 2a 2f 0a 76 6f  ment text..*/.vo
3da0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
3db0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
3dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3dd0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
3de0: 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74  ist ap;.  assert
3df0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
3e00: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
3e10: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
3e20: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
3e30: 31 5d 2e 70 33 3d 3d 30 20 7c 7c 20 70 2d 3e 64  1].p3==0 || p->d
3e40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3e50: 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  );.  va_start(ap
3e60: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 73 71  , zFormat);.  sq
3e70: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
3e80: 33 28 70 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  3(p, -1, sqlite3
3e90: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
3ea0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 2c 20 50 33  zFormat, ap), P3
3eb0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 76 61 5f  _DYNAMIC);.  va_
3ec0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64 69  end(ap);.}.#endi
3ed0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
3ee0: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
3ef0: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
3f00: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
3f10: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
3f20: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
3f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
3f40: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
3f50: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
3f60: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
3f70: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
3f80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3f90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
3fa0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
3fb0: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
3fc0: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
3fd0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3fe0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
3ff0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
4000: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
4010: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4020: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4030: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4040: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
4050: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
4060: 65 73 20 74 68 65 20 50 33 20 70 61 72 61 6d 65  es the P3 parame
4070: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
4080: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
4090: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
40a0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
40b0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
40c0: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
40d0: 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P3(Op *pOp, char
40e0: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
40f0: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33  mp){.  char *zP3
4100: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d  ;.  assert( nTem
4110: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63  p>=20 );.  switc
4120: 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 29  h( pOp->p3type )
4130: 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45  {.    case P3_KE
4140: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69  YINFO: {.      i
4150: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b  nt i, j;.      K
4160: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
4170: 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70   = (KeyInfo*)pOp
4180: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->p3;.      sqli
4190: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
41a0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
41b0: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
41c0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
41d0: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65    i = strlen(zTe
41e0: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
41f0: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
4200: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
4210: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
4220: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
4230: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
4240: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
4250: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
4260: 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  = strlen(pColl->
4270: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4280: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
4290: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
42a0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
42b0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
42c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
42d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
42e0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
42f0: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
4300: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
4310: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
4320: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
4330: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
4340: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4350: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
4360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
4370: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
4380: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
4390: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
43a0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
43b0: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
43c0: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
43d0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
43e0: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
43f0: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
4400: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
4410: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
4420: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
4430: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
4440: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
4450: 20 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20   );.      zP3 = 
4460: 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65  zTemp;.      bre
4470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4480: 73 65 20 50 33 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P3_COLLSEQ: {
4490: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
44a0: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
44b0: 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20  *)pOp->p3;.     
44c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
44d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
44e0: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
44f0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
4500: 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65  .      zP3 = zTe
4510: 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  mp;.      break;
4520: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4530: 50 33 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P3_FUNCDEF: {.  
4540: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
4550: 66 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 70 4f  f = (FuncDef*)pO
4560: 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c  p->p3;.      sql
4570: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4580: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
4590: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
45a0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
45b0: 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d        zP3 = zTem
45c0: 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  p;.      break;.
45d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
45e0: 33 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20  3_INT64: {.     
45f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4600: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4610: 22 25 6c 6c 64 22 2c 20 2a 28 73 71 6c 69 74 65  "%lld", *(sqlite
4620: 33 5f 69 6e 74 36 34 2a 29 70 4f 70 2d 3e 70 33  3_int64*)pOp->p3
4630: 29 3b 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a  );.      zP3 = z
4640: 54 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Temp;.      brea
4650: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4660: 65 20 50 33 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P3_REAL: {.   
4670: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4680: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4690: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 28 64 6f 75  , "%.16g", *(dou
46a0: 62 6c 65 2a 29 70 4f 70 2d 3e 70 33 29 3b 0a 20  ble*)pOp->p3);. 
46b0: 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 65 6d 70       zP3 = zTemp
46c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
46d0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
46e0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
46f0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50  TABLE.    case P
4700: 33 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  3_VTAB: {.      
4710: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
4720: 74 61 62 20 3d 20 28 73 71 6c 69 74 65 33 5f 76  tab = (sqlite3_v
4730: 74 61 62 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20  tab*)pOp->p3;.  
4740: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4750: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4760: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4770: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4780: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 7a  Module);.      z
4790: 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P3 = zTemp;.    
47a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
47b0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
47c0: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 20 3d  t: {.      zP3 =
47d0: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20   pOp->p3;.      
47e0: 69 66 28 20 7a 50 33 3d 3d 30 20 7c 7c 20 70 4f  if( zP3==0 || pO
47f0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f  p->opcode==OP_No
4800: 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  op ){.        zP
4810: 33 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 7d 0a  3 = "";.      }.
4820: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4830: 72 74 28 20 7a 50 33 21 3d 30 20 29 3b 0a 20 20  rt( zP3!=0 );.  
4840: 72 65 74 75 72 6e 20 7a 50 33 3b 0a 7d 0a 23 65  return zP3;.}.#e
4850: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
4860: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
4870: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
4880: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
4890: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
48a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
48b0: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
48c0: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
48d0: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
48e0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
48f0: 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
4900: 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70  sert( i<sizeof(p
4910: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4920: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4930: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4940: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4950: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4960: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4980: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4990: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
49a0: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
49b0: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
49c0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
49d0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
49e0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
49f0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4a00: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4a10: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4a20: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4a40: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4a50: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
4a60: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
4a70: 2a 7a 50 33 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP3;.  char zPt
4a80: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
4a90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4aa0: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
4ab0: 73 20 25 34 64 20 25 34 64 20 25 73 5c 6e 22 3b  s %4d %4d %s\n";
4ac0: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
4ad0: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
4ae0: 20 20 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50    zP3 = displayP
4af0: 33 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  3(pOp, zPtr, siz
4b00: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70  eof(zPtr));.  fp
4b10: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
4b20: 6d 61 74 31 2c 0a 20 20 20 20 20 20 70 63 2c 20  mat1,.      pc, 
4b30: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
4b40: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
4b50: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
4b60: 2c 20 7a 50 33 29 3b 0a 20 20 66 66 6c 75 73 68  , zP3);.  fflush
4b70: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
4b80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
4b90: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
4ba0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
4bb0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
4bc0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
4bd0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
4be0: 70 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  p ){.    while( 
4bf0: 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61  N-->0 ){.      a
4c00: 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b  ssert( N<2 || p[
4c10: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
4c20: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
4c30: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 2b  dbeMemRelease(p+
4c40: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  +);.    }.  }.}.
4c50: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4c60: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
4c70: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
4c80: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
4c90: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
4ca0: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
4cb0: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
4cc0: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
4cd0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
4ce0: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
4cf0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
4d00: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
4d10: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
4d20: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
4d30: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
4d40: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
4d50: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
4d60: 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 6e 74 20 73 71  LAIN"..*/.int sq
4d70: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
4d80: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
4d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4da0: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73  e VDBE */.){.  s
4db0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
4dc0: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
4dd0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4de0: 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  K;..  assert( p-
4df0: 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66  >explain );.  if
4e00: 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45  ( p->magic!=VDBE
4e10: 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74  _MAGIC_RUN ) ret
4e20: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
4e30: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  E;.  assert( db-
4e40: 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d  >magic==SQLITE_M
4e50: 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61  AGIC_BUSY );.  a
4e60: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
4e70: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
4e80: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  ==SQLITE_BUSY );
4e90: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
4ea0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
4eb0: 6f 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61  oes not put dyna
4ec0: 6d 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f  mic strings onto
4ed0: 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74   the.  ** the st
4ee0: 61 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65  ack, they may be
4ef0: 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20  come dynamic if 
4f00: 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20  the user calls. 
4f10: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
4f20: 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75  mn_text16(), cau
4f30: 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69  sing a translati
4f40: 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63  on to UTF-16 enc
4f50: 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66  oding..  */.  if
4f60: 28 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61  ( p->pTos==&p->a
4f70: 53 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20  Stack[4] ){.    
4f80: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4f90: 70 2d 3e 61 53 74 61 63 6b 2c 20 35 29 3b 0a 20  p->aStack, 5);. 
4fa0: 20 7d 0a 20 20 70 2d 3e 72 65 73 4f 6e 53 74 61   }.  p->resOnSta
4fb0: 63 6b 20 3d 20 30 3b 0a 0a 20 20 64 6f 7b 0a 20  ck = 0;..  do{. 
4fc0: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
4fd0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e    }while( i<p->n
4fe0: 4f 70 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  Op && p->explain
4ff0: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
5000: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
5010: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
5020: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->nOp ){.    p-
5030: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
5040: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5050: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
5060: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
5070: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
5080: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
5090: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
50a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
50b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
50c0: 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
50d0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
50e0: 70 2d 3e 72 63 29 2c 20 28 63 68 61 72 2a 29 30  p->rc), (char*)0
50f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5100: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
5110: 70 5b 69 5d 3b 0a 20 20 20 20 4d 65 6d 20 2a 70  p[i];.    Mem *p
5120: 4d 65 6d 20 3d 20 70 2d 3e 61 53 74 61 63 6b 3b  Mem = p->aStack;
5130: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
5140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
5150: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
5160: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
5170: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
51a0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
51b0: 72 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  r */.    pMem++;
51c0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
51d0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
51e0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
51f0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28  .    pMem->z = (
5200: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
5210: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
5220: 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64 65  ode);  /* Opcode
5230: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
5240: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
5250: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
5260: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
5270: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5280: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
5290: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
52a0: 45 5f 55 54 46 38 3b 0a 20 20 20 20 70 4d 65 6d  E_UTF8;.    pMem
52b0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
52c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
52d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
52e0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
5310: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
5320: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
5330: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
5340: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5350: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
5360: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
5390: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
53a0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
53b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
53c0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
53d0: 45 4d 5f 45 70 68 65 6d 7c 4d 45 4d 5f 53 74 72  EM_Ephem|MEM_Str
53e0: 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 2f 2a 20  |MEM_Term;   /* 
53f0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P3 */.    pMem->
5400: 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 28 70 4f  z = displayP3(pO
5410: 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f 72 74 2c  p, pMem->zShort,
5420: 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 7a 53   sizeof(pMem->zS
5430: 68 6f 72 74 29 29 3b 0a 20 20 20 20 61 73 73 65  hort));.    asse
5440: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5450: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20  ;.    pMem->n = 
5460: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
5470: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5480: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5490: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
54a0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 0a 20 20 20  QLITE_UTF8;..   
54b0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
54c0: 20 35 20 2d 20 32 2a 28 70 2d 3e 65 78 70 6c 61   5 - 2*(p->expla
54d0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 54  in-1);.    p->pT
54e0: 6f 73 20 3d 20 70 4d 65 6d 3b 0a 20 20 20 20 70  os = pMem;.    p
54f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
5500: 3b 0a 20 20 20 20 70 2d 3e 72 65 73 4f 6e 53 74  ;.    p->resOnSt
5510: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  ack = 1;.    rc 
5520: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20  = SQLITE_ROW;.  
5530: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5540: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
5550: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
5560: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
5570: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69  _DEBUG./*.** Pri
5580: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20  nt the SQL that 
5590: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65  was used to gene
55a0: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67  rate a VDBE prog
55b0: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
55c0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c  ite3VdbePrintSql
55d0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
55e0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
55f0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
5600: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
5610: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
5620: 61 4f 70 5b 6e 4f 70 2d 31 5d 3b 0a 20 20 69 66  aOp[nOp-1];.  if
5630: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
5640: 50 5f 4e 6f 6f 70 20 26 26 20 70 4f 70 2d 3e 70  P_Noop && pOp->p
5650: 33 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  3!=0 ){.    cons
5660: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d  t char *z = pOp-
5670: 3e 70 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  >p3;.    while( 
5680: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29  isspace(*(u8*)z)
5690: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
56a0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
56b0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
56c0: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
56d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
56e0: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
56f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
5700: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
5710: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
5720: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
5730: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
5740: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
5750: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
5760: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
5770: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
5780: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
5790: 65 33 5f 69 6f 5f 74 72 61 63 65 3d 3d 30 20 29  e3_io_trace==0 )
57a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
57b0: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
57c0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 6e   pOp = &p->aOp[n
57d0: 4f 70 2d 31 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op-1];.  if( pOp
57e0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 6f 6f  ->opcode==OP_Noo
57f0: 70 20 26 26 20 70 4f 70 2d 3e 70 33 21 3d 30 20  p && pOp->p3!=0 
5800: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
5810: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
5820: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
5830: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
5840: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
5850: 3e 70 33 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  >p3);.    for(i=
5860: 30 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  0; isspace((unsi
5870: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b  gned char)z[i]);
5880: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28   i++){}.    for(
5890: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  j=0; z[i]; i++){
58a0: 0a 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61  .      if( isspa
58b0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
58c0: 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  r)z[i]) ){.     
58d0: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
58e0: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
58f0: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
5900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5910: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
5920: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
5930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
5940: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
5950: 74 65 33 5f 69 6f 5f 74 72 61 63 65 28 22 53 51  te3_io_trace("SQ
5960: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
5970: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
5980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
5990: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
59a0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a  _IOTRACE */.../*
59b0: 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69  .** Prepare a vi
59c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f  rtual machine fo
59d0: 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54 68  r execution.  Th
59e0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
59f0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
5a00: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
5a10: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
5a20: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
5a30: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
5a40: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
5a50: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
5a60: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
5a70: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
5a80: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
5a90: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
5aa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  **.** This is th
5ab0: 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
5ac0: 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20 56  ve a VDBE from V
5ad0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74  DBE_MAGIC_INIT t
5ae0: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
5af0: 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RUN..*/.void sql
5b00: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
5b10: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b30: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
5b40: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20  */.  int nVar,  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b70: 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20   '?' see in the 
5b80: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
5b90: 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20  .  int nMem,    
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
5bc0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61  emory cells to a
5bd0: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llocate */.  int
5be0: 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20   nCursor,       
5bf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5c00: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
5c10: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
5c20: 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20    int isExplain 
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c40: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5c50: 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73  EXPLAIN keywords
5c60: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29   is present */.)
5c70: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
5c80: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5c90: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
5ca0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5cb0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
5cc0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
5cd0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
5ce0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
5cf0: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
5d00: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
5d10: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
5d20: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
5d30: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
5d40: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
5d50: 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20 62  . This.   * is b
5d60: 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
5d70: 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79  to resizeOpArray
5d80: 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68 72  () below may shr
5d90: 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d 3e  ink the.   * p->
5da0: 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20 73  aOp[] array to s
5db0: 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63 61  ave memory if ca
5dc0: 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44 42  lled when in VDB
5dd0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20 20  E_MAGIC_RUN .   
5de0: 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a 20  * state..   */. 
5df0: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
5e00: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20 2f  _MAGIC_RUN;..  /
5e10: 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e  * No instruction
5e20: 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f 72   ever pushes mor
5e30: 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20  e than a single 
5e40: 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 65  element onto the
5e50: 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 6e  .  ** stack.  An
5e60: 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 65  d the stack neve
5e70: 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 65  r grows on succe
5e80: 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e 73  ssive executions
5e90: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d   of the.  ** sam
5ea0: 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 20  e loop.  So the 
5eb0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
5ec0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 20  instructions is 
5ed0: 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a 20  an upper bound. 
5ee0: 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 6d   ** on the maxim
5ef0: 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 72  um stack depth r
5f00: 65 71 75 69 72 65 64 2e 20 20 28 41 64 64 65 64  equired.  (Added
5f10: 20 6c 61 74 65 72 3a 29 20 20 54 68 65 0a 20 20   later:)  The.  
5f20: 2a 2a 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  ** resolveP2Valu
5f30: 65 73 28 29 20 63 61 6c 6c 20 63 6f 6d 70 75 74  es() call comput
5f40: 65 73 20 61 20 74 69 67 68 74 65 72 20 75 70 70  es a tighter upp
5f50: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 0a  er bound on the.
5f60: 20 20 2a 2a 20 73 74 61 63 6b 20 73 69 7a 65 2e    ** stack size.
5f70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  **.  ** Alloc
5f80: 61 74 69 6f 6e 20 61 6c 6c 20 74 68 65 20 73 74  ation all the st
5f90: 61 63 6b 20 73 70 61 63 65 20 77 65 20 77 69 6c  ack space we wil
5fa0: 6c 20 65 76 65 72 20 6e 65 65 64 2e 0a 20 20 2a  l ever need..  *
5fb0: 2f 0a 20 20 69 66 28 20 70 2d 3e 61 53 74 61 63  /.  if( p->aStac
5fc0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  k==0 ){.    int 
5fd0: 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  nArg;       /* M
5fe0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
5ff0: 20 61 72 67 73 20 70 61 73 73 65 64 20 74 6f 20   args passed to 
6000: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e  a user function.
6010: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 74 61   */.    int nSta
6020: 63 6b 3b 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ck;     /* Maxim
6030: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 74 61  um number of sta
6040: 63 6b 20 65 6e 74 72 69 65 73 20 72 65 71 75 69  ck entries requi
6050: 72 65 64 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c  red */.    resol
6060: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e  veP2Values(p, &n
6070: 41 72 67 2c 20 26 6e 53 74 61 63 6b 29 3b 0a 20  Arg, &nStack);. 
6080: 20 20 20 72 65 73 69 7a 65 4f 70 41 72 72 61 79     resizeOpArray
6090: 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 20  (p, p->nOp);.   
60a0: 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30   assert( nVar>=0
60b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
60c0: 6e 53 74 61 63 6b 3c 70 2d 3e 6e 4f 70 20 29 3b  nStack<p->nOp );
60d0: 0a 20 20 20 20 69 66 28 20 69 73 45 78 70 6c 61  .    if( isExpla
60e0: 69 6e 20 29 7b 0a 20 20 20 20 20 20 6e 53 74 61  in ){.      nSta
60f0: 63 6b 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  ck = 10;.    }. 
6100: 20 20 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73     p->aStack = s
6110: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6120: 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20 6e  ro(db,.        n
6130: 53 74 61 63 6b 2a 73 69 7a 65 6f 66 28 70 2d 3e  Stack*sizeof(p->
6140: 61 53 74 61 63 6b 5b 30 5d 29 20 20 20 20 2f 2a  aStack[0])    /*
6150: 20 61 53 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20   aStack */.     
6160: 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d   + nArg*sizeof(M
6170: 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  em*)            
6180: 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20    /* apArg */.  
6190: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
61a0: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
61b0: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
61c0: 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a        + nVar*siz
61d0: 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20  eof(char*)      
61e0: 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20         /* azVar 
61f0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 4d 65 6d 2a  */.      + nMem*
6200: 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20  sizeof(Mem)     
6210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
6220: 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75  m */.      + nCu
6230: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73  rsor*sizeof(Curs
6240: 6f 72 2a 29 20 20 20 20 20 20 20 20 2f 2a 20 61  or*)        /* a
6250: 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20  pCsr */.    );. 
6260: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
6270: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
6280: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 26 70 2d 3e    p->aMem = &p->
6290: 61 53 74 61 63 6b 5b 6e 53 74 61 63 6b 5d 3b 0a  aStack[nStack];.
62a0: 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20        p->nMem = 
62b0: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nMem;.      p->a
62c0: 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e  Var = &p->aMem[n
62d0: 4d 65 6d 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  Mem];.      p->n
62e0: 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20  Var = nVar;.    
62f0: 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a    p->okVar = 0;.
6300: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d        p->apArg =
6310: 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72   (Mem**)&p->aVar
6320: 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d  [nVar];.      p-
6330: 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a  >azVar = (char**
6340: 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d  )&p->apArg[nArg]
6350: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72  ;.      p->apCsr
6360: 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d   = (Cursor**)&p-
6370: 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20  >azVar[nVar];.  
6380: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
6390: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20   nCursor;.      
63a0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
63b0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   n++){.        p
63c0: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
63d0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
63e0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
63f0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a  b = db;.      }.
6400: 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e        for(n=0; n
6410: 3c 6e 53 74 61 63 6b 3b 20 6e 2b 2b 29 7b 0a 20  <nStack; n++){. 
6420: 20 20 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b         p->aStack
6430: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20  [n].db = db;.   
6440: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6450: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 70 2d 3e 6e   for(n=0; n<p->n
6460: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 70  Mem; n++){.    p
6470: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20  ->aMem[n].flags 
6480: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
6490: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
64a0: 64 62 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 70 54  db;.  }..  p->pT
64b0: 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61 63 6b 5b  os = &p->aStack[
64c0: 2d 31 5d 3b 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  -1];.  p->pc = -
64d0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
64e0: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69  ITE_OK;.  p->uni
64f0: 71 75 65 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  queCnt = 0;.  p-
6500: 3e 72 65 74 75 72 6e 44 65 70 74 68 20 3d 20 30  >returnDepth = 0
6510: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
6520: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
6530: 20 70 2d 3e 70 6f 70 53 74 61 63 6b 20 3d 20 20   p->popStack =  
6540: 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  0;.  p->explain 
6550: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
6560: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
6570: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
6580: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
6590: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
65a0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
65b0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
65c0: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
65d0: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
65e0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
65f0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6600: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
6610: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
6620: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
6630: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
6640: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
6650: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
6660: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
6670: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
6680: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
6690: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
66a0: 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a 2a  ursor happens.**
66b0: 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69   to hold..*/.voi
66c0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65  d sqlite3VdbeFre
66d0: 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c  eCursor(Vdbe *p,
66e0: 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20   Cursor *pCx){. 
66f0: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
6700: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6710: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
6720: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
6730: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
6740: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
6750: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
6760: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
6770: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
6780: 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  >pBt);.  }.#ifnd
6790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
67a0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
67b0: 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  ( pCx->pVtabCurs
67c0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
67d0: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
67e0: 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78  VtabCursor = pCx
67f0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20  ->pVtabCursor;. 
6800: 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
6810: 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65  _module *pModule
6820: 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b   = pCx->pModule;
6830: 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65  .    p->inVtabMe
6840: 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  thod = 1;.    sq
6850: 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70  lite3SafetyOff(p
6860: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75  ->db);.    pModu
6870: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
6880: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
6890: 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e  ite3SafetyOn(p->
68a0: 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  db);.    p->inVt
68b0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20  abMethod = 0;.  
68c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
68d0: 65 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61  e3_free(pCx->pDa
68e0: 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ta);.  sqlite3_f
68f0: 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b  ree(pCx->aType);
6900: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6910: 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  pCx);.}../*.** C
6920: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
6930: 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62   except for VTab
6940: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
6950: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69  e currently.** i
6960: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
6970: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
6980: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
6990: 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b  eVtabs(Vdbe *p){
69a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
69b0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65  p->apCsr==0 ) re
69c0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
69d0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
69e0: 2b 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20  ++){.    Cursor 
69f0: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
6a00: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26  ];.    if( pC &&
6a10: 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68   (!p->inVtabMeth
6a20: 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62  od || !pC->pVtab
6a30: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
6a40: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
6a50: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
6a60: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
6a70: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
6a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
6a90: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
6aa0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
6ab0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
6ac0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
6ad0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
6ae0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
6af0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
6b00: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
6b10: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
6b20: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
6b30: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
6b40: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
6b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b60: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
6b70: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
6b80: 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20  ( p->aStack ){. 
6b90: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72     releaseMemArr
6ba0: 61 79 28 70 2d 3e 61 53 74 61 63 6b 2c 20 31 20  ay(p->aStack, 1 
6bb0: 2b 20 28 70 2d 3e 70 54 6f 73 20 2d 20 70 2d 3e  + (p->pTos - p->
6bc0: 61 53 74 61 63 6b 29 29 3b 0a 20 20 20 20 70 2d  aStack));.    p-
6bd0: 3e 70 54 6f 73 20 3d 20 26 70 2d 3e 61 53 74 61  >pTos = &p->aSta
6be0: 63 6b 5b 2d 31 5d 3b 0a 20 20 7d 0a 20 20 63 6c  ck[-1];.  }.  cl
6bf0: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63  oseAllCursorsExc
6c00: 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28 70  eptActiveVtabs(p
6c10: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
6c20: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
6c30: 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  >nMem);.  sqlite
6c40: 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26  3VdbeFifoClear(&
6c50: 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66 28  p->sFifo);.  if(
6c60: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
6c70: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
6c80: 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61   i<p->contextSta
6c90: 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ckTop; i++){.   
6ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
6cb0: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e 74  foClear(&p->cont
6cc0: 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69 66  extStack[i].sFif
6cd0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  o);.    }.    sq
6ce0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 63 6f  lite3_free(p->co
6cf0: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d  ntextStack);.  }
6d00: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
6d10: 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  ck = 0;.  p->con
6d20: 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d  textStackDepth =
6d30: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
6d40: 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20  StackTop = 0;.  
6d50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
6d60: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
6d70: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
6d80: 3e 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 30 3b  >resOnStack = 0;
6d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
6da0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
6db0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
6dc0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
6dd0: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
6de0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
6df0: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
6e00: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
6e10: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
6e20: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
6e30: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
6e40: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
6e50: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
6e60: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
6e70: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
6e80: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
6e90: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
6ea0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6eb0: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
6ec0: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
6ed0: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
6ee0: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  me;.  int n;..  
6ef0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
6f00: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
6f10: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
6f20: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
6f30: 5f 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d  _free(p->aColNam
6f40: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
6f50: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
6f60: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
6f70: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  = nResColumn;.  
6f80: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
6f90: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
6fa0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
6fb0: 72 6f 28 70 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  ro(p->db, sizeof
6fc0: 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28  (Mem)*n );.  if(
6fd0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20   p->aColName==0 
6fe0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c  ) return;.  whil
6ff0: 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20  e( n-- > 0 ){.  
7000: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67    pColName->flag
7010: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
7020: 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d    pColName->db =
7030: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c   p->db;.    pCol
7040: 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Name++;.  }.}../
7050: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d  *.** Set the nam
7060: 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20  e of the idx'th 
7070: 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74  column to be ret
7080: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  urned by the SQL
7090: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a   statement..** z
70a0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70  Name must be a p
70b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20  ointer to a nul 
70c0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
70d0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  g..**.** This ca
70e0: 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20  ll must be made 
70f0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
7100: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
7110: 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  mCols()..**.** I
7120: 66 20 4e 3d 3d 50 33 5f 53 54 41 54 49 43 20 20  f N==P3_STATIC  
7130: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 4e  it means that zN
7140: 61 6d 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ame is a pointer
7150: 20 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73   to a constant s
7160: 74 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20  tatic.** string 
7170: 61 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20  and we can just 
7180: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
7190: 2e 20 49 66 20 69 74 20 69 73 20 50 33 5f 44 59  . If it is P3_DY
71a0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 0a 2a 2a 20  NAMIC, then .** 
71b0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 66 72  the string is fr
71c0: 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  eed using sqlite
71d0: 33 5f 66 72 65 65 28 29 20 77 68 65 6e 20 74 68  3_free() when th
71e0: 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 73 68  e vdbe is finish
71f0: 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e 20 4f  ed with.** it. O
7200: 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 74 65  therwise, N byte
7210: 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 20 63  s of zName are c
7220: 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  opied..*/.int sq
7230: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
7240: 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ame(Vdbe *p, int
7250: 20 69 64 78 2c 20 69 6e 74 20 76 61 72 2c 20 63   idx, int var, c
7260: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7270: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20  , int N){.  int 
7280: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
7290: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
72a0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
72b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
72c0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
72d0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
72e0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
72f0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
7300: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
7310: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
7320: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
7330: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
7340: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
7350: 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 59 4e 41    if( N==P3_DYNA
7360: 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f 53 54 41  MIC || N==P3_STA
7370: 54 49 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  TIC ){.    rc = 
7380: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
7390: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
73a0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
73b0: 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
73c0: 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
73d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
73e0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
73f0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e  olName, zName, N
7400: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  , SQLITE_UTF8,SQ
7410: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
7420: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7430: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50  QLITE_OK && N==P
7440: 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20 20  3_DYNAMIC ){.   
7450: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
7460: 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c   = (pColName->fl
7470: 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 74 69 63  ags&(~MEM_Static
7480: 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 20 20 20  ))|MEM_Dyn;.    
7490: 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 6c 20 3d  pColName->xDel =
74a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
74b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
74c0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
74d0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
74e0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
74f0: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
7500: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
7510: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
7520: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
7530: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
7540: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
7550: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
7560: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
7570: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
7580: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
7590: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
75a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
75b0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
75c0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
75d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
75e0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
75f0: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
7600: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
7610: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
7620: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
7630: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
7640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
7650: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
7660: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
7670: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
7680: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
7690: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
76a0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
76b0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
76c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
76d0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
76e0: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
76f0: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
7700: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
7710: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
7720: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
7730: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
7740: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
7750: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
7760: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
7770: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
7780: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
7790: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
77a0: 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20  Sync(db, rc);.  
77b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
77c0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
77d0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
77e0: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
77f0: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
7800: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
7810: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
7820: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
7830: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
7840: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
7850: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
7860: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
7870: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
7880: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
7890: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
78a0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
78b0: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
78c0: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
78d0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
78e0: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
78f0: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
7900: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
7910: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
7920: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
7930: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7940: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
7950: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
7960: 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
7970: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7980: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
7990: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
79a0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
79b0: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
79c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
79d0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
79e0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
79f0: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
7a00: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
7a10: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
7a20: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
7a30: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
7a40: 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f    sqlite3SafetyO
7a50: 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ff(db);.    rc =
7a60: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
7a70: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74  back(db->pCommit
7a80: 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Arg);.    sqlite
7a90: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
7aa0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
7ab0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7ac0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20  _CONSTRAINT;.   
7ad0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
7ae0: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
7af0: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
7b00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
7b10: 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
7b20: 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
7b30: 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
7b40: 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
7b50: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
7b60: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
7b70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
7b80: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
7b90: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
7ba0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
7bb0: 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
7bc0: 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
7bd0: 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
7be0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
7bf0: 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20  e is :memory:.  
7c00: 49 6e 20 74 68 61 74 20 63 61 73 65 20 77 65 20  In that case we 
7c10: 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 73 75 70 70  do.  ** not supp
7c20: 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
7c30: 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
7c40: 6f 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65  o use the simple
7c50: 20 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20   case then.  ** 
7c60: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
7c70: 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65  0==strlen(sqlite
7c80: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
7c90: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
7ca0: 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20  )) || nTrans<=1 
7cb0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
7cc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
7cd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7ce0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
7cf0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
7d00: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
7d10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
7d20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
7d30: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
7d40: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
7d50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
7d60: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
7d70: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
7d80: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
7d90: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
7da0: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
7db0: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
7dc0: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
7dd0: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
7de0: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
7df0: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
7e00: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
7e10: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
7e20: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
7e30: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
7e40: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
7e50: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
7e60: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
7e70: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
7e80: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
7e90: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
7ea0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
7eb0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7ec0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7ed0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7ee0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
7ef0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
7f00: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
7f10: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
7f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7f30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7f40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
7f50: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
7f60: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
7f70: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
7f80: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
7f90: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
7fa0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
7fb0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
7fc0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
7fd0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
7fe0: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
7ff0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
8000: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
8010: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
8020: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8030: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
8040: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
8050: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
8060: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
8070: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
8080: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
8090: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
80a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
80b0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
80c0: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
80d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
80e0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
80f0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
8100: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
8110: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
8120: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20  4 offset = 0;.. 
8130: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d     /* Select a m
8140: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8150: 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64  le name */.    d
8160: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 72 61  o {.      u32 ra
8170: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
8180: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
81a0: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
81b0: 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64  f(random), &rand
81c0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74  om);.      zMast
81d0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  er = sqlite3MPri
81e0: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30  ntf(db, "%s-mj%0
81f0: 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20  8X", zMainFile, 
8200: 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66  random&0x7ffffff
8210: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  f);.      if( !z
8220: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
8230: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8240: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
8250: 20 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74     }while( sqlit
8260: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
8270: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
8280: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 20  _ACCESS_EXISTS) 
8290: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
82a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
82b0: 61 6c 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  al. */.    rc = 
82c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
82d0: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
82e0: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
82f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
8300: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
8310: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
8320: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
8330: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
8340: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
8350: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
8360: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8380: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8390: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
83a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
83b0: 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74   .    /* Write t
83c0: 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20  he name of each 
83d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
83e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
83f0: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20   into the new.  
8400: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
8410: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20  nal file. If an 
8420: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20  error occurs at 
8430: 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65  this point close
8440: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65  .    ** and dele
8450: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8460: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20  urnal file. All 
8470: 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  the individual j
8480: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20  ournal files.   
8490: 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27   ** still have '
84a0: 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73  null' as the mas
84b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
84c0: 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c  ter, so they wil
84d0: 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61  l roll.    ** ba
84e0: 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
84f0: 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63   if a failure oc
8500: 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  curs..    */.   
8510: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8520: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
8530: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8540: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8550: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63      if( i==1 ) c
8560: 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67  ontinue;   /* Ig
8570: 6e 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  nore the TEMP da
8580: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
8590: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
85a0: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
85b0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63  {.        char c
85c0: 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71  onst *zFile = sq
85d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
85e0: 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20  rnalname(pBt);. 
85f0: 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
8600: 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [0]==0 ) continu
8610: 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d  e;  /* Ignore :m
8620: 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
8630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
8640: 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
8650: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
8660: 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
8670: 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
8680: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
8690: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
86a0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
86b0: 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 74 72  ster, zFile, str
86c0: 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  len(zFile)+1, of
86d0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
86e0: 66 66 73 65 74 20 2b 3d 20 73 74 72 6c 65 6e 28  ffset += strlen(
86f0: 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20  zFile)+1;.      
8700: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8710: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
8720: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
8730: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
8740: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
8750: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8760: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8780: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8790: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
87a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
87b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
87c0: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72   Sync the master
87d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
87e0: 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55  f the IOCAP_SEQU
87f0: 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20  ENTIAL device.  
8800: 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
8810: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   this is not req
8820: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
8830: 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    zMainFile = sq
8840: 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 72  lite3BtreeGetDir
8850: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
8860: 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 28 6e  pBt);.    if( (n
8870: 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26  eedSync .     &&
8880: 20 28 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44   (0==(sqlite3OsD
8890: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
88a0: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
88b0: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
88c0: 4e 54 49 41 4c 29 29 0a 20 20 20 20 20 26 26 20  NTIAL)).     && 
88d0: 28 72 63 3d 73 71 6c 69 74 65 33 4f 73 53 79 6e  (rc=sqlite3OsSyn
88e0: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
88f0: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21  E_SYNC_NORMAL))!
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 7b 0a 20  =SQLITE_OK) ){. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8920: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
8930: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8940: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
8950: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
8960: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
8970: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
8980: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
8990: 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
89a0: 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
89b0: 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
89c0: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
89d0: 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
89e0: 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
89f0: 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
8a00: 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
8a10: 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
8a20: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
8a30: 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
8a40: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
8a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8a60: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
8a70: 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
8a80: 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
8a90: 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
8aa0: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
8ab0: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
8ac0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
8ad0: 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
8ae0: 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
8af0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
8b00: 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
8b10: 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
8b20: 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
8b30: 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
8b40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
8b50: 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
8b60: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
8b70: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
8b80: 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
8b90: 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  occured..    */.
8ba0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
8bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
8bc0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
8bd0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8be0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8bf0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8c10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8c20: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
8c30: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
8c40: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8c50: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
8c60: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  pMaster);.    if
8c70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8c80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8c90: 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  _free(zMaster);.
8ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
8cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
8cc0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
8cd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
8ce0: 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
8cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
8d00: 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
8d10: 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
8d20: 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
8d30: 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
8d40: 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
8d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
8d60: 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
8d70: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
8d80: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8d90: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
8da0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8db0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8dc0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
8dd0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8df0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
8e00: 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
8e10: 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
8e20: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
8e30: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
8e40: 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
8e50: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8e60: 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
8e70: 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
8e80: 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
8e90: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
8ea0: 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
8eb0: 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
8ec0: 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
8ed0: 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
8ee0: 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
8ef0: 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
8f00: 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
8f10: 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
8f20: 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
8f30: 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
8f40: 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
8f50: 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
8f60: 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
8f70: 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
8f80: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
8f90: 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
8fa0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
8fb0: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
8fc0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
8fd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
8fe0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
8ff0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
9000: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9010: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
9020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
9030: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
9040: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
9050: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 61 62 6c  .    }.    enabl
9060: 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
9070: 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71  rrors();..    sq
9080: 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
9090: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
90a0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
90b0: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
90c0: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74  tine checks that
90d0: 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 63 74   the sqlite3.act
90e0: 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 6e 74  iveVdbeCnt count
90f0: 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
9100: 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
9110: 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
9120: 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
9130: 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
9140: 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
9150: 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
9160: 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
9170: 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
9180: 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
9190: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
91a0: 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
91b0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
91c0: 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
91d0: 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
91e0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
91f0: 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
9200: 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
9210: 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
9220: 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
9230: 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
9240: 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
9250: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
9260: 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20  p = db->pVdbe;. 
9270: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
9280: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56   if( p->magic==V
9290: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26  DBE_MAGIC_RUN &&
92a0: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
92b0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a     cnt++;.    }.
92c0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
92d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
92e0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56  cnt==db->activeV
92f0: 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73  dbeCnt );.}.#els
9300: 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
9310: 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
9320: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f  #endif../*.** Fo
9330: 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68  r every Btree th
9340: 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  at in database c
9350: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69  onnection db whi
9360: 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ch .** has been 
9370: 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22  modified, "trip"
9380: 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65   or invalidate e
9390: 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a  ach cursor in.**
93a0: 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68   that Btree migh
93b0: 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  t have been modi
93c0: 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  fied so that the
93d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e   cursor.** can n
93e0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61  ever be used aga
93f0: 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  in.  This happen
9400: 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  s when a rollbac
9410: 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57  k.*** occurs.  W
9420: 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61  e have to trip a
9430: 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72  ll the other cur
9440: 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75  sors, even.** cu
9450: 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20  rsor from other 
9460: 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74  VMs in different
9470: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9480: 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61  tions,.** so tha
9490: 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74  t none of them t
94a0: 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61  ry to use the da
94b0: 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79  ta at which they
94c0: 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e  .** were pointin
94d0: 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20  g and which now 
94e0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68  may have been ch
94f0: 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20  anged due.** to 
9500: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
9510: 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61  .** Remember tha
9520: 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e  t a rollback can
9530: 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63   delete tables c
9540: 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72  omplete and.** r
9550: 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73  eorder rootpages
9560: 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20  .  So it is not 
9570: 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20  sufficient just 
9580: 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73  to save.** the s
9590: 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
95a0: 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  or.  We have to 
95b0: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
95c0: 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74  ursor.** so that
95d0: 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65   it is never use
95e0: 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 76 6f 69 64  d again..*/.void
95f0: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
9600: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
9610: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
9620: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
9630: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
9640: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
9650: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
9660: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
9670: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
9680: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
9690: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
96a0: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
96b0: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
96c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
96d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
96e0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
96f0: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
9700: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
9710: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
9720: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
9730: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
9740: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
9750: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
9760: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
9770: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
9780: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
9790: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
97a0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
97b0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
97c0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
97d0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
97e0: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
97f0: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
9800: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
9810: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
9820: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
9830: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
9840: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
9850: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
9860: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
9870: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
9880: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
9890: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
98a0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
98b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
98c0: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
98d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
98e0: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
98f0: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
9900: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
9910: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
9920: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
9930: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
9940: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
9950: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
9960: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72  int (*xFunc)(Btr
9970: 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f  ee *pBt) = 0;  /
9980: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
9990: 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65  ll on each btree
99a0: 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e   backend */.  in
99b0: 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
99c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
99d0: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53  Set to true if S
99e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49  QLITE_NOMEM or I
99f0: 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  OERR */..  /* Th
9a00: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
9a10: 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
9a20: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
9a30: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
9a40: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
9a50: 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
9a60: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
9a70: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
9a80: 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
9a90: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
9aa0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
9ab0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
9ac0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9ad0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
9ae0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
9af0: 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
9b00: 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
9b10: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
9b20: 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
9b30: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
9b40: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
9b50: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
9b60: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
9b70: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
9b80: 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
9b90: 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
9ba0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
9bb0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
9bc0: 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
9bd0: 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
9be0: 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
9bf0: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
9c00: 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
9c10: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9c20: 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
9c30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9c40: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
9c50: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
9c60: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
9c70: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
9c80: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
9c90: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
9ca0: 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
9cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9cc0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
9cd0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
9ce0: 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
9cf0: 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
9d00: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
9d10: 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  er started */.  
9d20: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
9d30: 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
9d40: 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
9d50: 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
9d60: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
9d70: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
9d80: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
9d90: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
9da0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e  treeMutexArrayEn
9db0: 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ter(&p->aMutex);
9dc0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
9dd0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
9de0: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
9df0: 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
9e00: 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70  & 0xff;.    isSp
9e10: 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
9e20: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
9e30: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
9e40: 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
9e50: 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
9e60: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
9e70: 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
9e80: 5f 46 55 4c 4c 20 3b 0a 20 20 20 20 69 66 28 20  _FULL ;.    if( 
9e90: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
9ea0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
9eb0: 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63  loop does static
9ec0: 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65   analysis of the
9ed0: 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68   query to see wh
9ee0: 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ich of the.     
9ef0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
9f00: 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69  ree categories i
9f10: 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20  t falls into:.  
9f20: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9f30: 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20      Read-only.  
9f40: 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79      **     Query
9f50: 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20   with statement 
9f60: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
9f70: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f       Query witho
9f80: 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ut statement jou
9f90: 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20  rnal.      **.  
9fa0: 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20      ** We could 
9fb0: 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72  do something mor
9fc0: 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74  e elegant than t
9fd0: 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  his static analy
9fe0: 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20  sis (i.e..      
9ff0: 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70  ** store the typ
a000: 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61  e of query as pa
a010: 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69  rt of the compli
a020: 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75  ation phase), bu
a030: 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  t .      ** hand
a040: 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72  ling malloc() or
a050: 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61   IO failure is a
a060: 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20   fairly obscure 
a070: 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20  edge case so .  
a080: 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70      ** this is p
a090: 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20  robably easier. 
a0a0: 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61  Todo: Might be a
a0b0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
a0c0: 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a   reduce .      *
a0d0: 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65  * code size a ve
a0e0: 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20  ry small amount 
a0f0: 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20  though....      
a100: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74  */.      int not
a110: 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  ReadOnly = 0;.  
a120: 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d      int isStatem
a130: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  ent = 0;.      a
a140: 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20  ssert(p->aOp || 
a150: 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20  p->nOp==0);.    
a160: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a170: 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nOp; i++){ .    
a180: 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61      switch( p->a
a190: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a  Op[i].opcode ){.
a1a0: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f            case O
a1b0: 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20  P_Transaction:. 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65             notRe
a1d0: 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70  adOnly |= p->aOp
a1e0: 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20  [i].p2;.        
a1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a200: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61       case OP_Sta
a210: 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20  tement:.        
a220: 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20      isStatement 
a230: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
a240: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a250: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20  }.      }..   . 
a260: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
a270: 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
a280: 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e  ly, we need do n
a290: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c  o rollback at al
a2a0: 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  l. Otherwise,.  
a2b0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77      ** proceed w
a2c0: 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
a2d0: 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20  handling..      
a2e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74  */.      if( not
a2f0: 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  ReadOnly || mrc!
a300: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
a310: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
a320: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49   p->rc==SQLITE_I
a330: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20  OERR_BLOCKED && 
a340: 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  isStatement ){. 
a350: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
a360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a370: 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20  lbackStmt;.     
a380: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
a390: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
a3a0: 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72    } else if( (mr
a3b0: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
a3c0: 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
a3d0: 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d  ULL) && isStatem
a3e0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a3f0: 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33   xFunc = sqlite3
a400: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
a410: 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  t;.        }else
a420: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
a430: 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
a440: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
a450: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
a460: 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
a470: 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
a480: 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
a490: 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
a4a0: 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
a4b0: 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
a4c0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
a4d0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
a4e0: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
a4f0: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
a500: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
a510: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
a520: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
a530: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
a540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a550: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
a560: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
a570: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
a580: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
a590: 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68   active vdbe, th
a5a0: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20  en.    ** we do 
a5b0: 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
a5c0: 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
a5d0: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
a5e0: 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
a5f0: 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
a600: 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
a610: 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
a620: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
a630: 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
a640: 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64  bove has occured
a650: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
a660: 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
a670: 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64   && db->activeVd
a680: 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  beCnt==1 ){.    
a690: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
a6a0: 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
a6b0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
a6c0: 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
a6d0: 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
a6e0: 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
a6f0: 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
a700: 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20  e, and the vdbe 
a710: 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20  program was .   
a720: 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66       ** successf
a730: 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ul or hit an 'OR
a740: 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
a750: 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  t. This means a 
a760: 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
a770: 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ** is required..
a780: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a790: 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65     int rc = vdbe
a7a0: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
a7b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a7c0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
a7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
a7e0: 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65  eMutexArrayLeave
a7f0: 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20  (&p->aMutex);.  
a800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a810: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
a820: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
a830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a840: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
a850: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
a860: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
a870: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d  l(db);.        }
a880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a890: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
a8a0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
a8b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a8d0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
a8e0: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  All(db);.      }
a8f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a900: 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69  xFunc ){.      i
a910: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
a920: 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
a930: 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
a940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
a950: 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74  >openedStatement
a960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
a970: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
a980: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20  eeCommitStmt;.  
a990: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
a9a0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
a9b0: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
a9c0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75  t ){.        xFu
a9d0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
a9e0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
a9f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aa00: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75      invalidateCu
aa10: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
aa20: 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20  trees(db);.     
aa30: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
aa40: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
aa50: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
aa60: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
aa70: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
aa80: 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e  f xFunc is not N
aa90: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
aaa0: 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  one of sqlite3Bt
aab0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20  reeRollbackStmt 
aac0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
aad0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
aae0: 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f  . Call it once o
aaf0: 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20  n each backend. 
ab00: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
ab10: 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  rs.    ** and th
ab20: 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  e return code is
ab30: 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b   still SQLITE_OK
ab40: 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e  , set the return
ab50: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77   code to the new
ab60: 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61  .    ** error va
ab70: 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lue..    */.    
ab80: 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c  assert(!xFunc ||
ab90: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
aba0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
abb0: 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46  Stmt ||.      xF
abc0: 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  unc==sqlite3Btre
abd0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20  eRollbackStmt.  
abe0: 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30    );.    for(i=0
abf0: 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d  ; xFunc && i<db-
ac00: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
ac10: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
ac20: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ac30: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ac40: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ac50: 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e         rc = xFun
ac60: 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  c(pBt);.        
ac70: 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63  if( rc && (p->rc
ac80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
ac90: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->rc==SQLITE_CON
aca0: 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20  STRAINT) ){.    
acb0: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
acc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
acd0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
ace0: 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  >zErrMsg, 0);.  
acf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ad00: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
ad10: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
ad20: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
ad30: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
ad40: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
ad50: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
ad60: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
ad70: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
ad80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
ad90: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
ada0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
adb0: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
adc0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
add0: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
ade0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
adf0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
ae00: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
ae10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ae20: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
ae30: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
ae40: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
ae50: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
ae60: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
ae70: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
ae80: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
ae90: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
aea0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
aeb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
aec0: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
aed0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
aee0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
aef0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
af00: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
af10: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
af20: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
af30: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
af40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
af50: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
af60: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
af70: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
af80: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
af90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
afa0: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
afb0: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
afc0: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
afd0: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
afe0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
aff0: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
b000: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20  VdbeCnt--;.  }. 
b010: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b020: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
b030: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b040: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
b050: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b060: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b070: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b080: 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  }.  checkActiveV
b090: 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 72  dbeCnt(db);..  r
b0a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b0b0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
b0c0: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
b0d0: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
b0e0: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
b0f0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
b100: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
b110: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
b120: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
b130: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
b140: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
b150: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
b160: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
b170: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
b180: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
b190: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
b1a0: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
b1b0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
b1c0: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
b1d0: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
b1e0: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
b1f0: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
b200: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
b210: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
b220: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
b230: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
b240: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
b250: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
b260: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
b270: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
b280: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
b290: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
b2a0: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
b2b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
b2c0: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
b2d0: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
b2e0: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
b2f0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
b300: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
b310: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
b320: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
b330: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
b340: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
b350: 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
b360: 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
b370: 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
b380: 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
b390: 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
b3a0: 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
b3b0: 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
b3c0: 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
b3d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 61    */.  sqlite3Sa
b3e0: 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71  fetyOn(db);.  sq
b3f0: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29  lite3VdbeHalt(p)
b400: 3b 0a 20 20 73 71 6c 69 74 65 33 53 61 66 65 74  ;.  sqlite3Safet
b410: 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  yOff(db);..  /* 
b420: 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
b430: 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
b440: 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
b450: 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
b460: 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
b470: 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
b480: 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
b490: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
b4a0: 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
b4b0: 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
b4c0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
b4d0: 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
b4e0: 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
b4f0: 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
b500: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
b510: 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
b520: 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
b530: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
b540: 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
b550: 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
b560: 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73     if( p->zErrMs
b570: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
b580: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
b590: 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72  ->pErr,-1,p->zEr
b5a0: 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38  rMsg,SQLITE_UTF8
b5b0: 2c 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a  ,sqlite3_free);.
b5c0: 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64        db->errCod
b5d0: 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20  e = p->rc;.     
b5e0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
b5f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
b600: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
b610: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
b620: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
b630: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
b640: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
b650: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
b660: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
b670: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
b680: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
b690: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
b6a0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
b6b0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
b6c0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
b6d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
b6e0: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
b6f0: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
b700: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
b710: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
b720: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
b730: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
b740: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
b750: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
b760: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
b770: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
b780: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
b790: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
b7a0: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
b7b0: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
b7c0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
b7d0: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
b7e0: 75 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  un..  */.  asser
b7f0: 74 28 20 70 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61  t( p->pTos<&p->a
b800: 53 74 61 63 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a  Stack[p->pc<0?0:
b810: 70 2d 3e 70 63 5d 20 7c 7c 20 21 70 2d 3e 61 53  p->pc] || !p->aS
b820: 74 61 63 6b 20 29 3b 0a 23 69 66 64 65 66 20 56  tack );.#ifdef V
b830: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
b840: 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
b850: 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
b860: 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
b870: 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
b880: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
b890: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
b8a0: 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
b8b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b8c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
b8d0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
b8e0: 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
b8f0: 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
b900: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
b910: 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
b920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
b930: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
b940: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
b950: 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20  6d %10lld %8lld 
b960: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
b970: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
b980: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
b990: 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
b9a0: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
b9b0: 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
b9c0: 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
b9d0: 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
b9e0: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c    );.        sql
b9f0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
ba00: 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  out, i, &p->aOp[
ba10: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
ba20: 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
ba30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ba40: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
ba50: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
ba60: 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b   p->aborted = 0;
ba70: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
ba80: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
ba90: 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
baa0: 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
bab0: 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
bac0: 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
bad0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
bae0: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
baf0: 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
bb00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
bb10: 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
bb20: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
bb30: 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
bb40: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
bb50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bb60: 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
bb70: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
bb80: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bb90: 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
bba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
bbb0: 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
bbc0: 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
bbd0: 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
bbe0: 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
bbf0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
bc00: 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20  AGIC_INIT ){.   
bc10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
bc20: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c  ISUSE;.  }.  sql
bc30: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70  ite3VdbeDelete(p
bc40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
bc50: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  }../*.** Call th
bc60: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
bc70: 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e   each auxdata en
bc80: 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63  try in pVdbeFunc
bc90: 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68   for which.** th
bca0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
bcb0: 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63  bit in mask is c
bcc0: 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65  lear.  Auxdata e
bcd0: 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31  ntries beyond 31
bce0: 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64  .** are always d
bcf0: 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65  estroyed.  To de
bd00: 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74  stroy all auxdat
bd10: 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20  a entries, call 
bd20: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
bd30: 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f  with mask==0..*/
bd40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bd50: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56  eDeleteAuxData(V
bd60: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75  dbeFunc *pVdbeFu
bd70: 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  nc, int mask){. 
bd80: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
bd90: 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e  0; i<pVdbeFunc->
bda0: 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAux; i++){.    
bdb0: 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a  struct AuxData *
bdc0: 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e  pAux = &pVdbeFun
bdd0: 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20  c->apAux[i];.   
bde0: 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28   if( (i>31 || !(
bdf0: 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26  mask&(1<<i))) &&
be00: 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20   pAux->pAux ){. 
be10: 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
be20: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
be30: 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
be40: 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
be50: 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d     }.      pAux-
be60: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
be70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
be80: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
be90: 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
bea0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
beb0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
bec0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
bed0: 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70  eturn;.  Cleanup
bee0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  (p);.  if( p->pP
bef0: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
bf00: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
bf10: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
bf20: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
bf30: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
bf40: 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20     p->db->pVdbe 
bf50: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
bf60: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
bf70: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
bf80: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
bf90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
bfa0: 4f 70 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  Op ){.    for(i=
bfb0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
bfc0: 29 7b 0a 20 20 20 20 20 20 4f 70 20 2a 70 4f 70  ){.      Op *pOp
bfd0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
bfe0: 20 20 20 20 20 66 72 65 65 50 33 28 70 4f 70 2d       freeP3(pOp-
bff0: 3e 70 33 74 79 70 65 2c 20 70 4f 70 2d 3e 70 33  >p3type, pOp->p3
c000: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
c010: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4f 70  ite3_free(p->aOp
c020: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
c030: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
c040: 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71  , p->nVar);.  sq
c050: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c  lite3_free(p->aL
c060: 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  abel);.  sqlite3
c070: 5f 66 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29  _free(p->aStack)
c080: 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
c090: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
c0a0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
c0b0: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
c0c0: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6f  ite3_free(p->aCo
c0d0: 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
c0e0: 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71 6c 29 3b  3_free(p->zSql);
c0f0: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
c100: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
c110: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
c120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
c130: 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
c140: 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
c150: 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
c160: 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
c170: 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65   MoveTo now.  Re
c180: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
c190: 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54  de.  If no MoveT
c1a0: 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68  o is pending, th
c1b0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f  is.** routine do
c1c0: 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72  es nothing and r
c1d0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
c1e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c1f0: 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
c200: 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  (Cursor *p){.  i
c210: 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  f( p->deferredMo
c220: 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20  veto ){.    int 
c230: 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
c240: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
c250: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
c260: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
c270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
c280: 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
c290: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
c2a0: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d  e3BtreeMoveto(p-
c2b0: 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  >pCursor, 0, p->
c2c0: 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
c2d0: 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20   &res);.    if( 
c2e0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c2f0: 20 20 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79      *p->pIncrKey
c300: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73   = 0;.    p->las
c310: 74 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e  tRowid = keyToIn
c320: 74 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  t(p->movetoTarge
c330: 74 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64  t);.    p->rowid
c340: 49 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30  IsValid = res==0
c350: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
c360: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
c370: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
c380: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
c390: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
c3a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
c3b0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
c3c0: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
c3d0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
c3e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
c3f0: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
c400: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
c410: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
c420: 41 4c 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ALE;.  }.  retur
c430: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
c440: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
c450: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a  ing functions:.*
c460: 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  *.** sqlite3Vdbe
c470: 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20  SerialType().** 
c480: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
c490: 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71  lTypeLen().** sq
c4a0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 52  lite3VdbeSerialR
c4b0: 65 61 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ead().** sqlite3
c4c0: 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
c4d0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
c4e0: 72 69 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a  rialWrite().**.*
c4f0: 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
c500: 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
c510: 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
c520: 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
c530: 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
c540: 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
c550: 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
c560: 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
c570: 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
c580: 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
c590: 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
c5a0: 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
c5b0: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
c5c0: 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
c5d0: 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
c5e0: 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
c5f0: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
c600: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
c610: 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
c620: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
c630: 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
c640: 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
c650: 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
c660: 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
c670: 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
c680: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
c690: 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
c6a0: 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
c6b0: 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
c6c0: 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
c6d0: 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
c6e0: 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
c6f0: 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
c700: 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
c710: 64 61 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61  data blob sepera
c720: 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
c730: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
c740: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
c750: 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
c760: 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
c770: 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
c780: 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
c790: 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
c7a0: 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
c7b0: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
c7c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
c7d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
c7e0: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
c800: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
c810: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
c820: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
c830: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
c840: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
c850: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
c860: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
c870: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
c880: 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8a0: 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
c8b0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
c8c0: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
c8d0: 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
c8e0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
c8f0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
c900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c910: 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
c920: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
c930: 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
c940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
c950: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
c960: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
c970: 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
c980: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
c990: 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
c9a0: 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
c9c0: 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
c9d0: 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
c9e0: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
ca00: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
ca10: 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
ca20: 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
ca50: 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
ca60: 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
ca70: 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
ca80: 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
ca90: 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
caa0: 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
cab0: 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
cac0: 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
cad0: 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
cae0: 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
caf0: 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
cb00: 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
cb10: 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
cb20: 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
cb30: 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
cb40: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
cb50: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
cb60: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
cb70: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
cb80: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
cb90: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
cba0: 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
cbb0: 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
cbc0: 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
cbd0: 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69  s;.  int n;..  i
cbe0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
cbf0: 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
cc00: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
cc10: 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
cc20: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
cc30: 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
cc40: 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
cc50: 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
cc60: 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
cc70: 28 28 69 36 34 29 30 78 30 30 30 30 31 30 30 30  ((i64)0x00001000
cc80: 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
cc90: 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
cca0: 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
ccb0: 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  if( file_format>
ccc0: 3d 34 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29  =4 && (i&1)==i )
ccd0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38  {.      return 8
cce0: 2b 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20  +i;.    }.    u 
ccf0: 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a  = i<0 ? -i : i;.
cd00: 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
cd10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
cd20: 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65  f( u<=32767 ) re
cd30: 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20  turn 2;.    if( 
cd40: 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 74  u<=8388607 ) ret
cd50: 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75  urn 3;.    if( u
cd60: 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 72  <=2147483647 ) r
cd70: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28  eturn 4;.    if(
cd80: 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20   u<=MAX_6BYTE ) 
cd90: 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65  return 5;.    re
cda0: 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66  turn 6;.  }.  if
cdb0: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c  ( flags&MEM_Real
cdc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   ){.    return 7
cdd0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
cde0: 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d  flags&(MEM_Str|M
cdf0: 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20  EM_Blob) );.  n 
ce00: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28  = pMem->n;.  if(
ce10: 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72   flags & MEM_Zer
ce20: 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d  o ){.    n += pM
ce30: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61  em->u.i;.  }.  a
ce40: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20  ssert( n>=0 );. 
ce50: 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
ce60: 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
ce70: 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
ce80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ce90: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
cea0: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
ceb0: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
cec0: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
ced0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
cee0: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
cef0: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
cf00: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
cf10: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65  pe>=12 ){.    re
cf20: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
cf30: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
cf40: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
cf50: 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20  st u8 aSize[] = 
cf60: 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c  { 0, 1, 2, 3, 4,
cf70: 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20   6, 8, 8, 0, 0, 
cf80: 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75  0, 0 };.    retu
cf90: 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f  rn aSize[serial_
cfa0: 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  type];.  }.}../*
cfb0: 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e  .** If we are on
cfc0: 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65   an architecture
cfd0: 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69   with mixed-endi
cfe0: 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20  an floating .** 
cff0: 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37  points (ex: ARM7
d000: 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20  ) then swap the 
d010: 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69  lower 4 bytes wi
d020: 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72  th the .** upper
d030: 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72   4 bytes.  Retur
d040: 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a  n the result..**
d050: 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63  .** For most arc
d060: 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73  hitectures, this
d070: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
d080: 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20  ** (later):  It 
d090: 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d  is reported to m
d0a0: 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64  e that the mixed
d0b0: 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a  -endian problem.
d0c0: 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e  ** on ARM7 is an
d0d0: 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c   issue with GCC,
d0e0: 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52   not with the AR
d0f0: 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65  M7 chip.  It see
d100: 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79  ms.** that early
d110: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d120: 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20   stored the two 
d130: 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69  words of a 64-bi
d140: 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68  t.** float in th
d150: 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20  e wrong order.  
d160: 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68  And that error h
d170: 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74  as been propagat
d180: 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65  ed.** ever since
d190: 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20  .  The blame is 
d1a0: 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
d1b0: 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68  with GCC, though
d1c0: 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68  ..** GCC might h
d1d0: 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67  ave just copying
d1e0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f   the problem fro
d1f0: 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c  m a prior compil
d200: 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f  er..** I am also
d210: 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72   told that newer
d220: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43   versions of GCC
d230: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64   that follow a d
d240: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20  ifferent.** ABI 
d250: 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  get the byte ord
d260: 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  er right..**.** 
d270: 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67  Developers using
d280: 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52   SQLite on an AR
d290: 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c  M7 should compil
d2a0: 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a  e and run their.
d2b0: 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75  ** application u
d2c0: 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45  sing -DSQLITE_DE
d2d0: 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f  BUG=1 at least o
d2e0: 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47  nce.  With DEBUG
d2f0: 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d  .** enabled, som
d300: 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20  e asserts below 
d310: 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74  will ensure that
d320: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
d330: 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70  of.** floating p
d340: 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63  oint values is c
d350: 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32  orrect..**.** (2
d360: 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e  007-08-30)  Fran
d370: 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73  k van Vugt has s
d380: 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62  tudied this prob
d390: 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61  lem closely.** a
d3a0: 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20  nd has send his 
d3b0: 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20  findings to the 
d3c0: 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72  SQLite developer
d3d0: 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69  s.  Frank.** wri
d3e0: 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69  tes that some Li
d3f0: 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65  nux kernels offe
d400: 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  r floating point
d410: 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75   hardware.** emu
d420: 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  lation that uses
d430: 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e   only 32-bit man
d440: 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f  tissas instead o
d450: 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d  f a full .** 48-
d460: 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64  bits as required
d470: 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61   by the IEEE sta
d480: 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73  ndard.  (This is
d490: 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46   the.** CONFIG_F
d4a0: 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f  PE_FASTFPE optio
d4b0: 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73  n.)  On such sys
d4c0: 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70  tems, floating p
d4d0: 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61  oint.** byte swa
d4e0: 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65  pping becomes ve
d4f0: 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20  ry complicated. 
d500: 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   To avoid proble
d510: 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73  ms,.** the neces
d520: 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69  sary byte swappi
d530: 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75  ng is carried ou
d540: 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74  t using a 64-bit
d550: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68   integer.** rath
d560: 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74  er than a 64-bit
d570: 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61   float.  Frank a
d580: 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74  ssures us that t
d590: 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20  he code here.** 
d5a0: 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20  works for him.  
d5b0: 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65  We, the develope
d5c0: 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20  rs, have no way 
d5d0: 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  to independently
d5e0: 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c  .** verify this,
d5f0: 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73   but Frank seems
d600: 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65   to know what he
d610: 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75   is talking abou
d620: 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74  t.** so we trust
d630: 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   him..*/.#ifdef 
d640: 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
d650: 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a  IAN_64BIT_FLOAT.
d660: 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74  static u64 float
d670: 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20  Swap(u64 in){.  
d680: 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20  union {.    u64 
d690: 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b  r;.    u32 i[2];
d6a0: 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b  .  } u;.  u32 t;
d6b0: 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20  ..  u.r = in;.  
d6c0: 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e  t = u.i[0];.  u.
d6d0: 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20  i[0] = u.i[1];. 
d6e0: 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72   u.i[1] = t;.  r
d6f0: 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64  eturn u.r;.}.# d
d700: 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
d710: 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58  ndianFloat(X)  X
d720: 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a   = floatSwap(X).
d730: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
d740: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
d750: 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  oat(X).#endif../
d760: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
d770: 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62  erialized data b
d780: 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75  lob for the valu
d790: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
d7a0: 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49   into .** buf. I
d7b0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
d7c0: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
d7d0: 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69   allocated suffi
d7e0: 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20  cient space..** 
d7f0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
d800: 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
d810: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69  en..**.** nBuf i
d820: 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
d830: 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75  space left in bu
d840: 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20  f[].  nBuf must 
d850: 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72  always be.** lar
d860: 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ge enough to hol
d870: 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
d880: 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ld.  Except, if 
d890: 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20  the field is.** 
d8a0: 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65  a blob with a ze
d8b0: 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20  ro-filled tail, 
d8c0: 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74  then buf[] might
d8d0: 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 67   be just the rig
d8e0: 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f  ht.** size to ho
d8f0: 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 78  ld everything ex
d900: 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72  cept for the zer
d910: 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20  o-filled tail.  
d920: 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f  If buf[].** is o
d930: 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74  nly big enough t
d940: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a  o hold the non-z
d950: 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e  ero prefix, then
d960: 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74   only write that
d970: 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20  .** prefix into 
d980: 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62  buf[].  But if b
d990: 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e  uf[] is large en
d9a0: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74  ough to hold bot
d9b0: 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20  h the.** prefix 
d9c0: 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 65  and the tail the
d9d0: 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 66  n write the pref
d9e0: 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 74  ix and set the t
d9f0: 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65  ail to all.** ze
da00: 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ros..**.** Retur
da10: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
da20: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
da30: 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
da40: 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
da50: 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
da60: 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
da70: 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
da80: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
da90: 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
daa0: 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
dab0: 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
dac0: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  */ .int sqlite3V
dad0: 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
dae0: 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20  *buf, int nBuf, 
daf0: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
db00: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75  ile_format){.  u
db10: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  32 serial_type =
db20: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
db30: 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c  alType(pMem, fil
db40: 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74  e_format);.  int
db50: 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
db60: 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
db70: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
db80: 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
db90: 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
dba0: 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   v;.    int i;. 
dbb0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
dbc0: 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
dbd0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
dbe0: 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
dbf0: 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
dc00: 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
dc10: 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
dc20: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
dc30: 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
dc40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
dc50: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
dc60: 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
dc70: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
dc80: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
dc90: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
dca0: 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  ( len<=nBuf );. 
dcb0: 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b     while( i-- ){
dcc0: 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  .      buf[i] = 
dcd0: 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
dce0: 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20  v >>= 8;.    }. 
dcf0: 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
dd00: 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20   }..  /* String 
dd10: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28  or blob */.  if(
dd20: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
dd30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dd40: 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d  pMem->n + ((pMem
dd50: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ->flags & MEM_Ze
dd60: 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29  ro)?pMem->u.i:0)
dd70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
dd80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
dd90: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
dda0: 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
ddb0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
ddc0: 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
ddd0: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
dde0: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
ddf0: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
de00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
de10: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
de20: 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
de30: 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e  i;.      if( len
de40: 3e 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20  >nBuf ){.       
de50: 20 6c 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20   len = nBuf;.   
de60: 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
de70: 74 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c  t(&buf[pMem->n],
de80: 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29   0, len-pMem->n)
de90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
dea0: 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
deb0: 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
dec0: 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
ded0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
dee0: 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74  ** Deserialize t
def0: 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69  he data blob poi
df00: 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61  nted to by buf a
df10: 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65  s serial type se
df20: 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64  rial_type.** and
df30: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
df40: 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75  t in pMem.  Retu
df50: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
df60: 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20   bytes read..*/ 
df70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
df80: 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  SerialGet(.  con
df90: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
dfa0: 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
dfb0: 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
dfc0: 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
dfd0: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dff0: 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
e000: 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
e010: 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e030: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
e040: 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
e050: 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20  */.){.  switch( 
e060: 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
e070: 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a     case 10:   /*
e080: 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
e090: 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
e0a0: 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65  case 11:   /* Re
e0b0: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
e0c0: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
e0d0: 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20  e 0: {  /* NULL 
e0e0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
e0f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
e100: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e110: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
e120: 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
e130: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
e140: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
e150: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
e160: 5b 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [0];.      pMem-
e170: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e180: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
e190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e1a0: 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
e1b0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e1c0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
e1d0: 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68  i = (((signed ch
e1e0: 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c  ar)buf[0])<<8) |
e1f0: 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70   buf[1];.      p
e200: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
e210: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
e220: 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
e230: 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
e240: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
e250: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
e260: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
e270: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
e280: 31 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38  16) | (buf[1]<<8
e290: 29 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20  ) | buf[2];.    
e2a0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
e2b0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
e2c0: 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20  eturn 3;.    }. 
e2d0: 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
e2e0: 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
e2f0: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
e300: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b  Mem->u.i = (buf[
e310: 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31  0]<<24) | (buf[1
e320: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d  ]<<16) | (buf[2]
e330: 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20  <<8) | buf[3];. 
e340: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
e350: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
e360: 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
e370: 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
e380: 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
e390: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
e3a0: 20 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67    u64 x = (((sig
e3b0: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
e3c0: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
e3d0: 20 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75       u32 y = (bu
e3e0: 66 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[2]<<24) | (buf
e3f0: 5b 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [3]<<16) | (buf[
e400: 34 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b  4]<<8) | buf[5];
e410: 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
e420: 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d  2) | y;.      pM
e430: 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
e440: 29 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&x;.      pMem-
e450: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
e460: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
e470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e480: 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
e490: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
e4a0: 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
e4b0: 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
e4c0: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
e4d0: 75 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32  u64 x;.      u32
e4e0: 20 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   y;.#if !defined
e4f0: 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66  (NDEBUG) && !def
e500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e510: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29  _FLOATING_POINT)
e520: 0a 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79  .      /* Verify
e530: 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
e540: 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
e550: 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
e560: 20 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62   same.      ** b
e570: 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
e580: 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
e590: 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
e5a0: 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20  T_FLOAT is.     
e5b0: 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
e5c0: 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
e5d0: 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
e5e0: 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
e5f0: 20 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a       ** endian..
e600: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
e610: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
e620: 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
e630: 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
e640: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
e650: 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
e660: 20 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74        u64 t2 = t
e670: 31 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78  1;.      swapMix
e680: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
e690: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
e6a0: 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
e6b0: 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
e6c0: 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
e6d0: 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
e6e0: 6e 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20  ndif..      x = 
e6f0: 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28  (buf[0]<<24) | (
e700: 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62  buf[1]<<16) | (b
e710: 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[2]<<8) | buf[
e720: 33 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62  3];.      y = (b
e730: 75 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[4]<<24) | (bu
e740: 66 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[5]<<16) | (buf
e750: 5b 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d  [6]<<8) | buf[7]
e760: 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
e770: 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
e780: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
e790: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
e7a0: 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
e7b0: 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
e7c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
e7d0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
e7e0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e7f0: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
e800: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d  sizeof(pMem->r)=
e810: 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77  =8 );.        sw
e820: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
e830: 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d  at(x);.        m
e840: 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20  emcpy(&pMem->r, 
e850: 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
e860: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
e870: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ags = MEM_Real;.
e880: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
e890: 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
e8a0: 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
e8b0: 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
e8c0: 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
e8d0: 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
e8e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
e8f0: 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
e900: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
e910: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
e920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
e930: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
e940: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
e950: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
e960: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
e970: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
e980: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
e990: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
e9a0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
e9b0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e9c0: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
e9d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
e9e0: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
e9f0: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
ea00: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
ea10: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
ea20: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
ea30: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
ea40: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
ea50: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
ea60: 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65 72  /*.** The header
ea70: 20 6f 66 20 61 20 72 65 63 6f 72 64 20 63 6f 6e   of a record con
ea80: 73 69 73 74 73 20 6f 66 20 61 20 73 65 71 75 65  sists of a seque
ea90: 6e 63 65 20 76 61 72 69 61 62 6c 65 2d 6c 65 6e  nce variable-len
eaa0: 67 74 68 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  gth integers..**
eab0: 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20   These integers 
eac0: 61 72 65 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  are almost alway
ead0: 73 20 73 6d 61 6c 6c 20 61 6e 64 20 61 72 65 20  s small and are 
eae0: 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73 69 6e  encoded as a sin
eaf0: 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 54 68 65  gle byte..** The
eb00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
eb10: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
eb20: 20 74 68 69 73 20 66 61 63 74 20 74 6f 20 70 72   this fact to pr
eb30: 6f 76 69 64 65 20 61 20 66 61 73 74 20 64 65 63  ovide a fast dec
eb40: 6f 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  ode.** of the in
eb50: 74 65 67 65 72 73 20 69 6e 20 61 20 72 65 63 6f  tegers in a reco
eb60: 72 64 20 68 65 61 64 65 72 2e 20 20 49 74 20 69  rd header.  It i
eb70: 73 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65  s faster for the
eb80: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 0a 2a 2a 20   common case.** 
eb90: 77 68 65 72 65 20 74 68 65 20 69 6e 74 65 67 65  where the intege
eba0: 72 20 69 73 20 61 20 73 69 6e 67 6c 65 20 62 79  r is a single by
ebb0: 74 65 2e 20 20 49 74 20 69 73 20 61 20 6c 69 74  te.  It is a lit
ebc0: 74 6c 65 20 73 6c 6f 77 65 72 20 77 68 65 6e 20  tle slower when 
ebd0: 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 69  the.** integer i
ebe0: 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 62 79  s two or more by
ebf0: 74 65 73 2e 20 20 42 75 74 20 6f 76 65 72 61 6c  tes.  But overal
ec00: 6c 20 69 74 20 69 73 20 66 61 73 74 65 72 2e 0a  l it is faster..
ec10: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
ec20: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ing expressions 
ec30: 61 72 65 20 65 71 75 69 76 61 6c 65 6e 74 3a 0a  are equivalent:.
ec40: 2a 2a 0a 2a 2a 20 20 20 20 20 78 20 3d 20 73 71  **.**     x = sq
ec50: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
ec60: 28 20 41 2c 20 26 42 20 29 3b 0a 2a 2a 0a 2a 2a  ( A, &B );.**.**
ec70: 20 20 20 20 20 78 20 3d 20 47 65 74 56 61 72 69       x = GetVari
ec80: 6e 74 28 20 41 2c 20 42 20 29 3b 0a 2a 2a 0a 2a  nt( A, B );.**.*
ec90: 2f 0a 23 64 65 66 69 6e 65 20 47 65 74 56 61 72  /.#define GetVar
eca0: 69 6e 74 28 41 2c 42 29 20 20 28 28 42 20 3d 20  int(A,B)  ((B = 
ecb0: 2a 28 41 29 29 3c 3d 30 78 37 66 20 3f 20 31 20  *(A))<=0x7f ? 1 
ecc0: 3a 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  : sqlite3GetVari
ecd0: 6e 74 33 32 28 41 2c 20 26 42 29 29 0a 0a 2f 2a  nt32(A, &B))../*
ece0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ecf0: 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74  n compares the t
ed00: 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72  wo table rows or
ed10: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 20 73   index records s
ed20: 70 65 63 69 66 69 65 64 20 62 79 20 0a 2a 2a 20  pecified by .** 
ed30: 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
ed40: 6e 64 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32  nd {nKey2, pKey2
ed50: 7d 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20 6e  }, returning a n
ed60: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
ed70: 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
ed80: 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20  eger if {nKey1, 
ed90: 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74  pKey1} is less t
eda0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
edb0: 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
edc0: 6e 20 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d  n {nKey2, pKey2}
edd0: 2e 20 20 42 6f 74 68 20 4b 65 79 31 20 61 6e 64  .  Both Key1 and
ede0: 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 62 79   Key2 must be by
edf0: 74 65 20 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f  te strings.** co
ee00: 6d 70 6f 73 65 64 20 62 79 20 74 68 65 20 4f 50  mposed by the OP
ee10: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
ee20: 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 0a  de of the VDBE..
ee30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ee40: 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
ee50: 0a 20 20 76 6f 69 64 20 2a 75 73 65 72 44 61 74  .  void *userDat
ee60: 61 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  a,.  int nKey1, 
ee70: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
ee80: 31 2c 20 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  1, .  int nKey2,
ee90: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
eea0: 79 32 0a 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  y2.){.  KeyInfo 
eeb0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79  *pKeyInfo = (Key
eec0: 49 6e 66 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a  Info*)userData;.
eed0: 20 20 75 33 32 20 64 31 2c 20 64 32 3b 20 20 20    u32 d1, d2;   
eee0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
eef0: 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
ef00: 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
ef10: 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 2c  t */.  u32 idx1,
ef20: 20 69 64 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f   idx2;      /* O
ef30: 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
ef40: 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
ef50: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
ef60: 32 20 73 7a 48 64 72 31 2c 20 73 7a 48 64 72 32  2 szHdr1, szHdr2
ef70: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
ef80: 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
ef90: 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
efa0: 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
efb0: 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
efc0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
efd0: 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
efe0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
eff0: 2a 29 70 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74  *)pKey1;.  const
f000: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f010: 61 4b 65 79 32 20 3d 20 28 63 6f 6e 73 74 20 75  aKey2 = (const u
f020: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
f030: 4b 65 79 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d  Key2;..  Mem mem
f040: 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20  1;.  Mem mem2;. 
f050: 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
f060: 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
f070: 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
f080: 3e 64 62 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20  >db;.  mem2.enc 
f090: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
f0a0: 0a 20 20 6d 65 6d 32 2e 64 62 20 3d 20 70 4b 65  .  mem2.db = pKe
f0b0: 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 0a 20 20  yInfo->db;.  .  
f0c0: 69 64 78 31 20 3d 20 47 65 74 56 61 72 69 6e 74  idx1 = GetVarint
f0d0: 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
f0e0: 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
f0f0: 20 20 69 64 78 32 20 3d 20 47 65 74 56 61 72 69    idx2 = GetVari
f100: 6e 74 28 61 4b 65 79 32 2c 20 73 7a 48 64 72 32  nt(aKey2, szHdr2
f110: 29 3b 0a 20 20 64 32 20 3d 20 73 7a 48 64 72 32  );.  d2 = szHdr2
f120: 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  ;.  nField = pKe
f130: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
f140: 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
f150: 64 72 31 20 26 26 20 69 64 78 32 3c 73 7a 48 64  dr1 && idx2<szHd
f160: 72 32 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  r2 ){.    u32 se
f170: 72 69 61 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20  rial_type1;.    
f180: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 32  u32 serial_type2
f190: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
f1a0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
f1b0: 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
f1c0: 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
f1d0: 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
f1e0: 20 47 65 74 56 61 72 69 6e 74 28 20 61 4b 65 79   GetVarint( aKey
f1f0: 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
f200: 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20  ype1 );.    if( 
f210: 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c  d1>=nKey1 && sql
f220: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f230: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
f240: 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  e1)>0 ) break;. 
f250: 20 20 20 69 64 78 32 20 2b 3d 20 47 65 74 56 61     idx2 += GetVa
f260: 72 69 6e 74 28 20 61 4b 65 79 32 2b 69 64 78 32  rint( aKey2+idx2
f270: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 32 20 29  , serial_type2 )
f280: 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b  ;.    if( d2>=nK
f290: 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey2 && sqlite3Vd
f2a0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f2b0: 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 20  serial_type2)>0 
f2c0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
f2d0: 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
f2e0: 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
f2f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
f300: 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
f310: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
f320: 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
f330: 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  e1, &mem1);.    
f340: 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d2 += sqlite3Vdb
f350: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
f360: 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79  2[d2], serial_ty
f370: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20  pe2, &mem2);..  
f380: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
f390: 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
f3a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
f3b0: 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
f3c0: 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20  &mem2, i<nField 
f3d0: 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
f3e0: 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
f3f0: 66 28 20 6d 65 6d 31 2e 66 6c 61 67 73 20 26 20  f( mem1.flags & 
f400: 4d 45 4d 5f 44 79 6e 20 29 20 73 71 6c 69 74 65  MEM_Dyn ) sqlite
f410: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
f420: 26 6d 65 6d 31 29 3b 0a 20 20 20 20 69 66 28 20  &mem1);.    if( 
f430: 6d 65 6d 32 2e 66 6c 61 67 73 20 26 20 4d 45 4d  mem2.flags & MEM
f440: 5f 44 79 6e 20 29 20 73 71 6c 69 74 65 33 56 64  _Dyn ) sqlite3Vd
f450: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
f460: 6d 32 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  m2);.    if( rc!
f470: 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
f480: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
f490: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20  ;.  }..  /* One 
f4a0: 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
f4b0: 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62  out of fields, b
f4c0: 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  ut all the field
f4d0: 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69  s up to that poi
f4e0: 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75  nt.  ** were equ
f4f0: 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b  al. If the incrK
f500: 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ey flag is true,
f510: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
f520: 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65   key is.  ** tre
f530: 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a  ated as larger..
f540: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30    */.  if( rc==0
f550: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   ){.    if( pKey
f560: 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b  Info->incrKey ){
f570: 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
f580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31      }else if( d1
f590: 3c 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  <nKey1 ){.      
f5a0: 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
f5b0: 65 20 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29  e if( d2<nKey2 )
f5c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
f5d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f5e0: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
f5f0: 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
f600: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20  yInfo->nField.  
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
f620: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
f630: 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
f640: 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
f650: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f660: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
f670: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   is an index ent
f680: 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e  ry composed usin
f690: 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
f6a0: 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54  ord opcode..** T
f6b0: 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
f6c0: 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f   this record sho
f6d0: 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
f6e0: 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a  r (specifically.
f6f0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f  ** an integer ro
f700: 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74  wid).  This rout
f710: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
f720: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
f730: 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67  in.** that integ
f740: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
f750: 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
f760: 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  n(const u8 *aKey
f770: 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  ){.  u32 szHdr; 
f780: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
f790: 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
f7a0: 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
f7b0: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
f7c0: 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
f7d0: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 74  */..  sqlite3Get
f7e0: 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 26  Varint32(aKey, &
f7f0: 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74 65  szHdr);.  sqlite
f800: 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b  3GetVarint32(&aK
f810: 65 79 5b 73 7a 48 64 72 2d 31 5d 2c 20 26 74 79  ey[szHdr-1], &ty
f820: 70 65 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75  peRowid);.  retu
f830: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  rn sqlite3VdbeSe
f840: 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65  rialTypeLen(type
f850: 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a  Rowid);.}.  ../*
f860: 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
f870: 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
f880: 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
f890: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
f8a0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
f8b0: 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
f8c0: 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
f8d0: 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
f8e0: 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
f8f0: 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
f900: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
f910: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
f920: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
f930: 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erwise..*/.int s
f940: 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77  qlite3VdbeIdxRow
f950: 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
f960: 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
f970: 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
f980: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
f990: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
f9a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
f9b0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
f9c0: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
f9d0: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
f9e0: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
f9f0: 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
fa00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
fa10: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
fa20: 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33  m, v;..  sqlite3
fa30: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
fa40: 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
fa50: 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
fa60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fa70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fa80: 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  PT;.  }.  rc = s
fa90: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
faa0: 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
fab0: 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
fac0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
fad0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fae0: 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  .  sqlite3GetVar
faf0: 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
fb00: 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 6c 69 74  &szHdr);.  sqlit
fb10: 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 28 75  e3GetVarint32((u
fb20: 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
fb30: 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  , &typeRowid);. 
fb40: 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
fb50: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
fb60: 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
fb70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
fb80: 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e  rialGet((u8*)&m.
fb90: 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c  z[m.n-lenRowid],
fba0: 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b   typeRowid, &v);
fbb0: 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e  .  *rowid = v.u.
fbc0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  i;.  sqlite3Vdbe
fbd0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
fbe0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbf0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  OK;.}../*.** Com
fc00: 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
fc10: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
fc20: 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
fc30: 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e  s point to again
fc40: 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
fc50: 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66  ring in pKey (of
fc60: 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20   length nKey).  
fc70: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
fc80: 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
fc90: 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
fca0: 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
fcb0: 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
fcc0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
fcd0: 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
fce0: 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20  n pKey.  Return 
fcf0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
fd00: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79  cess..**.** pKey
fd10: 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
fd20: 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
fd30: 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
fd40: 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
fd50: 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
fd60: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
fd70: 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
fd80: 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
fd90: 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
fda0: 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  red as well..*/.
fdb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
fdc0: 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
fdd0: 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fdf0: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
fe00: 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
fe10: 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
fe20: 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  t u8 *pKey,   /*
fe30: 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70   The key to comp
fe40: 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  are */.  int *re
fe50: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
fe60: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
fe70: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
fe80: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
fe90: 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
fea0: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
feb0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
fec0: 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
fed0: 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d  nt lenRowid;.  M
fee0: 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  em m;..  sqlite3
fef0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
ff00: 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
ff10: 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
ff20: 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
ff30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
ff40: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
ff50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
ff60: 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70  mFromBtree(pC->p
ff70: 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c  Cursor, 0, nCell
ff80: 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
ff90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
ffa0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c 65  urn rc;.  }.  le
ffb0: 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
ffc0: 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28  VdbeIdxRowidLen(
ffd0: 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 2a 72 65  (u8*)m.z);.  *re
ffe0: 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
fff0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 70 43 2d  ecordCompare(pC-
10000 3e 70 4b 65 79 49 6e 66 6f 2c 20 6d 2e 6e 2d 6c  >pKeyInfo, m.n-l
10010 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 6e 4b  enRowid, m.z, nK
10020 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 73 71 6c  ey, pKey);.  sql
10030 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
10040 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
10050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10060 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10070 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
10080 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
10090 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
100a0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
100b0 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
100c0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
100d0 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
100e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
100f0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
10100 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
10110 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
10120 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10130 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
10140 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
10150 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
10160 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
10170 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
10180 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
10190 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
101a0 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
101b0 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
101c0 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
101d0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
101e0 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
101f0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
10200 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
10210 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
10220 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
10230 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
10240 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
10250 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10260 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
10270 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
10280 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
10290 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
102a0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
102b0 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
102c0 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
102d0 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
102e0 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
102f0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
10300 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
10310 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
10320 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
10330 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
10340 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
10350 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
10360 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
10370 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
10380 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
10390 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
103a0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
103b0 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
103c0 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
103d0 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
103e0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
103f0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
10400 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
10410 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
10420 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
10430 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
10440 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
10450 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
10460 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
10470 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
10480 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
10490 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
104a0 0a 7d 0a                                         .}.