/ Hex Artifact Content
Login

Artifact eb95136983edf82148cbfaa4cd7e61f2cc9e08e0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 31 34 20 32  eaux.c,v 1.414 2
02c0: 30 30 38 2f 31 31 2f 30 33 20 30 39 3a 33 39 3a  008/11/03 09:39:
02d0: 34 35 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  45 danielk1977 E
02e0: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0310: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65  >.#include "vdbe
0320: 49 6e 74 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  Int.h"..../*.** 
0330: 57 68 65 6e 20 64 65 62 75 67 67 69 6e 67 20 74  When debugging t
0340: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
0350: 72 20 69 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20  r in a symbolic 
0360: 64 65 62 75 67 67 65 72 2c 20 6f 6e 65 20 63 61  debugger, one ca
0370: 6e 0a 2a 2a 20 73 65 74 20 74 68 65 20 73 71 6c  n.** set the sql
0380: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0390: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
03a0: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
03b0: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
03c0: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
03d0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03e0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
0400: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0410: 64 6f 70 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  dopTrace = 0;.#e
0420: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ndif.../*.** Cre
0430: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
0440: 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
0450: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
0460: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 73 71  te3VdbeCreate(sq
0470: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
0480: 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  be *p;.  p = sql
0490: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
04a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65  (db, sizeof(Vdbe
04b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
04c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
04d0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20  >db = db;.  if( 
04e0: 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  db->pVdbe ){.   
04f0: 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65   db->pVdbe->pPre
0500: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  v = p;.  }.  p->
0510: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62  pNext = db->pVdb
0520: 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20  e;.  p->pPrev = 
0530: 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  0;.  db->pVdbe =
0540: 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   p;.  p->magic =
0550: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
0560: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0570: 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
0580: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66  the SQL string f
0590: 6f 72 20 61 20 70 72 65 70 61 72 65 64 20 73 74  or a prepared st
05a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
05b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 53   sqlite3VdbeSetS
05c0: 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  ql(Vdbe *p, cons
05d0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
05e0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
0600: 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a  ( p->zSql==0 );.
0610: 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69    p->zSql = sqli
0620: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
0630: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  db, z, n);.}../*
0640: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
0650: 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  QL associated wi
0660: 74 68 20 61 20 70 72 65 70 61 72 65 64 20 73 74  th a prepared st
0670: 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74  atement.*/.const
0680: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73   char *sqlite3_s
0690: 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ql(sqlite3_stmt 
06a0: 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65 74 75 72  *pStmt){.  retur
06b0: 6e 20 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74  n ((Vdbe *)pStmt
06c0: 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  )->zSql;.}../*.*
06d0: 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65  * Swap all conte
06e0: 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56  nt between two V
06f0: 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a  DBE structures..
0700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0710: 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41  dbeSwap(Vdbe *pA
0720: 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56  , Vdbe *pB){.  V
0730: 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a  dbe tmp, *pTmp;.
0740: 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20    char *zTmp;.  
0750: 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20  int nTmp;.  tmp 
0760: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0770: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0780: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
0790: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
07a0: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
07b0: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
07c0: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
07d0: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
07e0: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
07f0: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0800: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
0810: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
0820: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
0830: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
0840: 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71    nTmp = pA->nSq
0850: 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20  l;.  pA->nSql = 
0860: 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->nSql;.  pB->
0870: 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a  nSql = nTmp;.}..
0880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0890: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  BUG./*.** Turn t
08a0: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
08b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
08c0: 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a  VdbeTrace(Vdbe *
08d0: 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b  p, FILE *trace){
08e0: 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72  .  p->trace = tr
08f0: 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ace;.}.#endif../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
0930: 6e 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a  ns at least N.**
0940: 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   elements..**.**
0950: 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   If an out-of-me
0960: 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72  mory error occur
0970: 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67  s while resizing
0980: 20 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56   the array,.** V
0990: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
09a0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09b0: 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73   unchanged (this
09c0: 20 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61   is so that.** a
09d0: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
09e0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
09f0: 20 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65   be correctly de
0a00: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
0a10: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
0a20: 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a   of the Vdbe)..*
0a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
0a40: 73 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65  sizeOpArray(Vdbe
0a50: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56   *p, int N){.  V
0a60: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 70  dbeOp *pNew;.  p
0a70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a80: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a90: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ab0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ac0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ad0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  Op = pNew;.  }.}
0ae0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0af0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0b00: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0b10: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0b20: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0b30: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0b40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0b60: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0b70: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0b80: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0b90: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0ba0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0bb0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0bc0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0bd0: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0be0: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
0bf0: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
0c00: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0c20: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0c30: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0c40: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0c50: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
0c60: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
0c70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0c80: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
0c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0ca0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
0cb0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0cc0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
0cd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0ce0: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0cf0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0d00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0d10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0d30: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0d40: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
0d50: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
0d60: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
0d70: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
0d80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0d90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0db0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0dc0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0dd0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0de0: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0df0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
0e00: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
0e10: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
0e20: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
0e30: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
0e40: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
0e50: 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72  USED;.  p->expir
0e60: 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
0e70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f  QLITE_DEBUG.  pO
0e80: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
0e90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
0ea0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 73  beAddopTrace ) s
0eb0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
0ec0: 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  p(0, i, &p->aOp[
0ed0: 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i]);.#endif.#ifd
0ee0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
0ef0: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
0f00: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
0f10: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
0f20: 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn i;.}.int sqli
0f30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64  te3VdbeAddOp0(Vd
0f40: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a  be *p, int op){.
0f50: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0f60: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
0f70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e  , 0, 0, 0);.}.in
0f80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0f90: 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op1(Vdbe *p, int
0fa0: 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20   op, int p1){.  
0fb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
0fc0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
0fd0: 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74  p1, 0, 0);.}.int
0fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0ff0: 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p2(Vdbe *p, int 
1000: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1010: 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p2){.  return sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1030: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30  p, op, p1, p2, 0
1040: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1050: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1060: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1070: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1080: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1090: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
10a0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
10b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
10c0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
10e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1100: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1110: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1120: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1130: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1140: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1150: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1170: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
1180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1190: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
11a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
11b0: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
11c0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
11d0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
11e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
11f0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1200: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
1210: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1220: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
1230: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
1240: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1250: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
1260: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f  ymbolic label fo
1270: 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  r an instruction
1280: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1290: 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54   be.** coded.  T
12a0: 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  he symbolic labe
12b0: 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  l is really just
12c0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12d0: 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65  er.  The.** labe
12e0: 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  l can be used as
12f0: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66   the P2 value of
1300: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20   an operation.  
1310: 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74  Later, when.** t
1320: 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f  he label is reso
1330: 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66  lved to a specif
1340: 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20  ic address, the 
1350: 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a  VDBE will scan.*
1360: 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70  * through its op
1370: 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  eration list and
1380: 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75   change all valu
1390: 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d  es of P2 which m
13a0: 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65  atch.** the labe
13b0: 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c  l into the resol
13c0: 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ved address..**.
13d0: 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77  ** The VDBE know
13e0: 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75  s that a P2 valu
13f0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63  e is a label bec
1400: 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a  ause labels are.
1410: 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69  ** always negati
1420: 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73  ve and P2 values
1430: 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20   are suppose to 
1440: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  be non-negative.
1450: 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67  .** Hence, a neg
1460: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69  ative P2 value i
1470: 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68  s a label that h
1480: 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73  as yet to be res
1490: 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  olved..**.** Zer
14a0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
14b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14c0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
14d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56  3VdbeMakeLabel(V
14e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
14f0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  ;.  i = p->nLabe
1500: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l++;.  assert( p
1510: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1520: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1530: 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c  ( i>=p->nLabelAl
1540: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  loc ){.    p->nL
1550: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  abelAlloc = p->n
1560: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31  LabelAlloc*2 + 1
1570: 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  0;.    p->aLabel
1580: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1590: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
15a0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
15e0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
15f0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1600: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1610: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1620: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1630: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1640: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1650: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1660: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1670: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1680: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1690: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
16a0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
16b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16c0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
16d0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
16e0: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
16f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1700: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1710: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1720: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1730: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1740: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
1760: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
1770: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
1780: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1790: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
17a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
17b0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
17c0: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
17d0: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
17e0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a  t are negative.*
17f0: 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75  * on jump instru
1800: 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75  ctions.  Each su
1810: 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  ch value is a la
1820: 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68  bel.  Resolve th
1830: 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65  e.** label by se
1840: 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c  tting the P2 val
1850: 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  ue to its correc
1860: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  t non-zero value
1870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1880: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
1890: 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  nce after all op
18a0: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
18b0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  inserted..**.** 
18c0: 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75  Variable *pMaxFu
18d0: 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f  ncArgs is set to
18e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
18f0: 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67  ue of any P2 arg
1900: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20  ument .** to an 
1910: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f  OP_Function, OP_
1920: 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46  AggStep or OP_VF
1930: 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68  ilter opcode. Th
1940: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a  is is used by .*
1950: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  * sqlite3VdbeMak
1960: 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65  eReady() to size
1970: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
1980: 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  ] array..**.** T
1990: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
19a0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
19b0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
19c0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
19d0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
19e0: 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65  that might cause
19f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
1a00: 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73  lback.  Such ins
1a10: 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  tructions.** are
1a20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
1a30: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
1a40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
1a50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
1a60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
1a70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
1a80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
1a90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49  _VRename.**.** I
1aa0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1ab0: 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ction is found, 
1ac0: 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65  then every State
1ad0: 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ment instruction
1ae0: 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20   .** is changed 
1af0: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74  to a Noop.  In t
1b00: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b10: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b20: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75  tatement .** jou
1b30: 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65  rnal file unnece
1b40: 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ssarily..*/.stat
1b50: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
1b60: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
1b70: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
1b80: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
1b90: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30  int nMaxArgs = 0
1ba0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1bb0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1bc0: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1bd0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1be0: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1bf0: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c00: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c10: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c20: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1c30: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1c40: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1c50: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1c60: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1c70: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1c80: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1c90: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
1ca0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1cb0: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64  = pOp->p5;.#ifnd
1cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1cd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1ce0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1cf0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
1d00: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1d10: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
1d20: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
1d30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1d40: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
1d50: 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69  _Halt ){.      i
1d60: 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  f( pOp->p1==SQLI
1d70: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
1d80: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
1d90: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  rt ){.        do
1da0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1db0: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
1dc0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1dd0: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
1de0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ent ){.      has
1df0: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1e00: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1e10: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
1e20: 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 64 6f  troy ){.      do
1e30: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1e40: 61 63 6b 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ack = 1;.#ifndef
1e50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1e70: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e80: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
1e90: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
1ea0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1eb0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1ec0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1ed0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
1ee0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
1ef0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
1f00: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
1f10: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
1f20: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
1f30: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
1f40: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
1f50: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
1f60: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
1f70: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
1f80: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
1f90: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4f  if( sqlite3VdbeO
1fa0: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
1fb0: 28 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a  (opcode, OPFLG_J
1fc0: 55 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c  UMP) && pOp->p2<
1fd0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1fe0: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
1ff0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
2000: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
2010: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
2020: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2030: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
2040: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
2050: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20  >aLabel = 0;..  
2060: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
2070: 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20  nMaxArgs;..  /* 
2080: 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c  If we never roll
2090: 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
20a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
20b0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  en statement.  *
20c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  * transactions a
20d0: 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  re not needed.  
20e0: 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20  So change every 
20f0: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a  OP_Statement.  *
2100: 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e  * opcode into an
2110: 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20   OP_Noop.  This 
2120: 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
2130: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2140: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
2150: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
2160: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2170: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2180: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2190: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
21a0: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
21b0: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
21c0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
21d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
21e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21f0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2200: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2210: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2220: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2230: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2240: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2250: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2260: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2270: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2280: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2290: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
22a0: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
22b0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
22c0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
22d0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
22e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
22f0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
2300: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2310: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2320: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2330: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2340: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
2350: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
2360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2370: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2380: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2390: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
23a0: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
23b0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
23c0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
23d0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
23e0: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
23f0: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41  ){.    resizeOpA
2400: 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c  rray(p, p->nOpAl
2410: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
2420: 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f  c*2 : 1024/sizeo
2430: 66 28 4f 70 29 29 3b 0a 20 20 20 20 61 73 73 65  f(Op));.    asse
2440: 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d  rt( p->nOp+nOp<=
2450: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70  p->nOpAlloc || p
2460: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2470: 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ed );.  }.  if( 
2480: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
2490: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
24a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
24b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
24c0: 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  nOp>0 ){.    int
24d0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
24e0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
24f0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
2500: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
2510: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
2520: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
2530: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
2540: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
2550: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
2560: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
2570: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
2580: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
2590: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26        if( p2<0 &
25a0: 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63  & sqlite3VdbeOpc
25b0: 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 70  odeHasProperty(p
25c0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46  Out->opcode, OPF
25d0: 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20  LG_JUMP) ){.    
25e0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
25f0: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
2600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2610: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2620: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
2630: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2640: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2650: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
2660: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
2670: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
2680: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
2690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26a0: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d  EBUG.      pOut-
26b0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  >zComment = 0;. 
26c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26d0: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
26e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26f0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
2700: 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b  i+addr, &p->aOp[
2710: 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20  i+addr]);.      
2720: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2730: 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70     p->nOp += nOp
2740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2750: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ddr;.}../*.** Ch
2760: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
2770: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
2780: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
2790: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
27a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27b0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
27c0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
27d0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
27e0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
27f0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
2800: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
2810: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
2820: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
2830: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
2840: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
2850: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
2860: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2870: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
2880: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2890: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
28a0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28b0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
28c0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
28d0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
28e0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
28f0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2900: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2910: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
2920: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2930: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2940: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2950: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
2960: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
2970: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
2980: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2990: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
29a0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
29b0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
29c0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
29d0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
29e0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
29f0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
2a00: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2a10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2a20: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
2a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2a40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2a50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
2a60: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2a70: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
2a80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a90: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP3(Vdbe *p, in
2aa0: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2ab0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2ac0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2ad0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2ae0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2af0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2b00: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2b10: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2b20: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
2b30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2b40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b50: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
2b60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2b70: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
2b80: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2b90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2ba0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
2bb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2bc0: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2bd0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2be0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
2bf0: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
2c00: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
2c10: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
2c20: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
2c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2c40: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
2c50: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
2c60: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
2c70: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
2c80: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2c90: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2ca0: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
2cb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2cc0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
2cd0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2ce0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cf0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
2d00: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
2d10: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
2d20: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
2d30: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
2d40: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
2d50: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
2d60: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
2d70: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
2d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2d90: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2da0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
2db0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
2dc0: 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20  {.  if( pDef && 
2dd0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
2de0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
2df0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
2e00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
2e10: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
2e20: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
2e30: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
2e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e50: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
2e60: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
2e70: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
2e80: 28 20 70 34 20 29 7b 0a 20 20 20 20 73 77 69 74  ( p4 ){.    swit
2e90: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
2ea0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
2eb0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2ec0: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
2ed0: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20  e P4_MPRINTF:.  
2ee0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
2ef0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
2f00: 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20  P4_KEYINFO:.    
2f10: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
2f20: 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AY:.      case P
2f30: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
2f40: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
2f50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2f60: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
2f70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2f80: 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e   case P4_VDBEFUN
2f90: 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  C: {.        Vdb
2fa0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
2fb0: 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70   = (VdbeFunc *)p
2fc0: 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45  4;.        freeE
2fd0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
2fe0: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e  (db, pVdbeFunc->
2ff0: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
3000: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
3010: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
3020: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
3030: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3040: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
3050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3060: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3070: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
3080: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3090: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
30a0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
30b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
30d0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
30e0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
30f0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
3100: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
3110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3120: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
3130: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
3140: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
3150: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
3160: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3170: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
3180: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3190: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  dr, int N){.  if
31a0: 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ( p && p->aOp ){
31b0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
31c0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
31d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
31e0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77  b = p->db;.    w
31f0: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3200: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
3210: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
3220: 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p4.p);.      mem
3230: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
3240: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
3250: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
3260: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
3270: 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pOp++;.    }.  }
3280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
32a0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
32b0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
32c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
32d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
32e0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
32f0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
3300: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
3310: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
3320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3330: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
3340: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
3350: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
3360: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
3370: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
3380: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
3390: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
33a0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
33b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
33c0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
33d0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
33e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
33f0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
3400: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
3410: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
3420: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
3430: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
3440: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
3450: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
3460: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
3470: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f  .**.** If n==P4_
3480: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
3490: 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70   that zP4 is a p
34a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
34b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
34c0: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
34d0: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
34e0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
34f0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3500: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
3510: 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65  alloc, to be fre
3520: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
3530: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   is finalized..*
3540: 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  * n==P4_KEYINFO_
3550: 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65  HANDOFF indicate
3560: 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  s that zP4 point
3570: 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
3580: 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72  tructure.** stor
3590: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61  ed in memory tha
35a0: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
35b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
35c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54  qlite3_malloc. T
35d0: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
35e0: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
35f0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
3600: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
3610: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
3620: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
3630: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
3640: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
3650: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
3660: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
3670: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
3680: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
3690: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
36a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
36b0: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
36c0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
36d0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
36e0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
36f0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
3700: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
3710: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
3720: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
3730: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
3740: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3750: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3760: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
3770: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
3780: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
3790: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
37a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
37b0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
37c0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
37d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
37e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
37f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
3800: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
3810: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
3820: 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59   if (n != P4_KEY
3830: 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72  INFO) {.      fr
3840: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
3850: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
3860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
3870: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3880: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
3890: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
38a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
38b0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  nOp - 1;.    if(
38c0: 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e   addr<0 ) return
38d0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
38e0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
38f0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
3900: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
3910: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  );.  pOp->p4.p =
3920: 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f   0;.  if( n==P4_
3930: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
3940: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
3950: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
3960: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
3970: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
3980: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
3990: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
39a0: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
39b0: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53     pOp->p4.i = S
39c0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
39d0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
39e0: 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65  p4type = n;.  }e
39f0: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
3a00: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3a10: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
3a20: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3a30: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
3a40: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
3a50: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
3a60: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e  yInfo;.    int n
3a70: 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20  Field, nByte;.. 
3a80: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
3a90: 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69  yInfo*)zP4)->nFi
3aa0: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
3ab0: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
3ac0: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
3ad0: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
3ae0: 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69  >aColl[0]) + nFi
3af0: 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  eld;.    pKeyInf
3b00: 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o = sqlite3Mallo
3b10: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
3b20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
3b30: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
3b40: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3b50: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
3b60: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
3b70: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3b80: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3b90: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3ba0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3bb0: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3bc0: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3bd0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3be0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
3bf0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3c00: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3c10: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
3c20: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
3c30: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
3c40: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
3c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
3c60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3c70: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3c80: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3c90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3ca0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3cb0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3cc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3cd0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3ce0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3cf0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3d00: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3d10: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3d20: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3d30: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3d40: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3d50: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3d60: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3d70: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3d80: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34  ) n = strlen(zP4
3d90: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3da0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3db0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3dc0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3dd0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3de0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3df0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3e00: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3e10: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3e20: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3e30: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
3e40: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
3e50: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
3e60: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
3e70: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
3e80: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
3e90: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
3ea0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
3eb0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
3ec0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
3ed0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
3ee0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
3ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3f00: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
3f10: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3f20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3f30: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
3f40: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
3f50: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
3f60: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
3f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3f80: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
3f90: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3fa0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
3fb0: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
3fc0: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
3fd0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3fe0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
3ff0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4000: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4010: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
4020: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
4030: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
4040: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
4050: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
4060: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
4070: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
4080: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
4090: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
40a0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
40b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
40c0: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
40d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
40e0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
40f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4100: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
4110: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4120: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
4130: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4140: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
4150: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
4160: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
4170: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
4180: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4190: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
41a0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
41b0: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
41c0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
41d0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
41e0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
41f0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
4200: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
4210: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
4220: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
4230: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
4240: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
4250: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
4260: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
4280: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
4290: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
42a0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
42b0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
42c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
42d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
42e0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
42f0: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
4300: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
4310: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4320: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
4330: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
4340: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
4350: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4360: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4370: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4380: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
4390: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
43a0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
43b0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
43c0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
43d0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
43e0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
43f0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
4400: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
4410: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
4420: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
4430: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
4440: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
4450: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
4460: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
4470: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
4480: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
4490: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
44a0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
44b0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
44c0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
44d0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
44e0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
44f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4500: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
4510: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
4520: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4530: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4540: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4550: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4560: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4570: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4580: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4590: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
45a0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
45b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
45c0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
45d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
45e0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
45f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4600: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4610: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4630: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4640: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4650: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4660: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4670: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4680: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4690: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
46a0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
46b0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
46c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
46d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
46e0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
46f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4700: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4710: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4720: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4730: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4740: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4750: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4770: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4780: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4790: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
47a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
47b0: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
47c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
47d0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
47e0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
47f0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4800: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4820: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
4830: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
4840: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4860: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
4870: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4880: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4890: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
48a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
48b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
48c0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
48d0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
48e0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
48f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4900: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4910: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4920: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4930: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
4940: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
4950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4960: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
4970: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4980: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4990: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
49a0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
49b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
49c0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
49d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
49e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
49f0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
4a00: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
4a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a20: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
4a30: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
4a40: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
4a50: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
4a60: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4a70: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
4a80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
4a90: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
4aa0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
4ab0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
4ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4ad0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
4ae0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4af0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4b00: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4b10: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
4b20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4b40: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
4b50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4b60: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4b70: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
4b80: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4ba0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4bb0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4bc0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4bd0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4be0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
4bf0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
4c00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4c10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4c20: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
4c30: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
4c40: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
4c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4c60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
4c70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
4c80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4c90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4ca0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
4cb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4cc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4cd0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
4ce0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
4cf0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
4d00: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
4d10: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
4d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4d30: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
4d40: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
4d50: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
4d60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
4d70: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
4d80: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
4d90: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
4da0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f  ] is used..**.*/
4db0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4dc0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
4dd0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
4de0: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
4df0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
4e00: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4e10: 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e  rt( i<sizeof(p->
4e20: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
4e30: 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20    mask = 1<<i;. 
4e40: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
4e50: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
4e60: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
4e70: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
4e80: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
4e90: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
4ea0: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
4eb0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
4ec0: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
4ed0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4ee0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4ef0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
4f00: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
4f10: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
4f20: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
4f30: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
4f40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4f50: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
4f60: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
4f70: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
4f80: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
4f90: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
4fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4fb0: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
4fc0: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
4fd0: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
4fe0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
4ff0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
5000: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
5010: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
5020: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
5030: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
5040: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
5050: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
5060: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
5070: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
5080: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
5090: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
50a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
50b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
50c0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
50d0: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
50e0: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
50f0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
5100: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
5110: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
5120: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
5130: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5140: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5150: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
5160: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
5170: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
5180: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
5190: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 6e 74 20   p->db;.    int 
51a0: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20  malloc_failed = 
51b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
51c0: 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  ;.    for(pEnd=&
51d0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
51e0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
51f0: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
5200: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
5210: 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  .db );..      /*
5220: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
5230: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
5240: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
5250: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
5260: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
5270: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
5280: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
5290: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
52a0: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
52b0: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
52c0: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
52d0: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
52e0: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
52f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
5300: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
5310: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
5320: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
5330: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
5340: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
5350: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
5360: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
5370: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
5380: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
5390: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
53a0: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
53b0: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
53c0: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
53d0: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
53e0: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
53f0: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
5400: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
5410: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
5420: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
5430: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
5440: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
5450: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
5460: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
5470: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
5480: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
5490: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
54a0: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
54b0: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
54c0: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
54d0: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
54e0: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
54f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
5500: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
5510: 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dyn) ){.        
5520: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
5530: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
5540: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
5550: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
5560: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5570: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
5580: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
5590: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
55a0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
55b0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d   MEM_Null;.    }
55c0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
55d0: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
55e0: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  ailed;.  }.}..#i
55f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5600: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
5610: 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  MENT.int sqlite3
5620: 56 64 62 65 52 65 6c 65 61 73 65 42 75 66 66 65  VdbeReleaseBuffe
5630: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  rs(Vdbe *p){.  i
5640: 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e 46 72  nt ii;.  int nFr
5650: 65 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ee = 0;.  assert
5660: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5670: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
5680: 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 69 3d 31  x) );.  for(ii=1
5690: 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  ; ii<=p->nMem; i
56a0: 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70  i++){.    Mem *p
56b0: 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69  Mem = &p->aMem[i
56c0: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  i];.    if( pMem
56d0: 2d 3e 7a 20 26 26 20 70 4d 65 6d 2d 3e 66 6c 61  ->z && pMem->fla
56e0: 67 73 26 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20  gs&MEM_Dyn ){.  
56f0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 4d 65      assert( !pMe
5700: 6d 2d 3e 78 44 65 6c 20 29 3b 0a 20 20 20 20 20  m->xDel );.     
5710: 20 6e 46 72 65 65 20 2b 3d 20 73 71 6c 69 74 65   nFree += sqlite
5720: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d  3DbMallocSize(pM
5730: 65 6d 2d 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 29  em->db, pMem->z)
5740: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5750: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
5760: 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
5770: 20 72 65 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d   return nFree;.}
5780: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
5790: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
57a0: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
57b0: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
57c0: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
57d0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
57e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
57f0: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
5800: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
5810: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
5820: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
5830: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
5840: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
5850: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
5860: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
5870: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
5880: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
5890: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
58a0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
58b0: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
58c0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
58d0: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
58e0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
58f0: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
5900: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
5910: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
5920: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
5930: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
5940: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
5950: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
5960: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
5970: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f  N QUERY PLAN..*/
5980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
5990: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
59c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
59d0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
59e0: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
59f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20  QLITE_OK;.  Mem 
5a00: 2a 70 4d 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75  *pMem = p->pResu
5a10: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
5a20: 5b 31 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [1];..  assert( 
5a30: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
5a40: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
5a50: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 20 72  BE_MAGIC_RUN ) r
5a60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
5a70: 55 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 64  USE;.  assert( d
5a80: 62 2d 3e 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45  b->magic==SQLITE
5a90: 5f 4d 41 47 49 43 5f 42 55 53 59 20 29 3b 0a 20  _MAGIC_BUSY );. 
5aa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
5ab0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
5ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
5ad0: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5ae0: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
5af0: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
5b00: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
5b10: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
5b20: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
5b30: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
5b40: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
5b50: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
5b60: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
5b70: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
5b80: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
5b90: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
5ba0: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
5bb0: 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e  Array(pMem, p->n
5bc0: 4d 65 6d 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20  Mem);..  do{.   
5bd0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
5be0: 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70  }while( i<p->nOp
5bf0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
5c00: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
5c10: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
5c20: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  n );.  if( i>=p-
5c30: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72  >nOp ){.    p->r
5c40: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5c50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
5c60: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
5c70: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
5c80: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
5c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
5ca0: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
5cb0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5cc0: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
5cd0: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
5ce0: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
5cf0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
5d00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
5d10: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
5d20: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
5d30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5d40: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5d50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5d60: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
5d70: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5d80: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
5d90: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5dc0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
5dd0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
5de0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
5df0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
5e00: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
5e10: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
5e20: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
5e30: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
5e40: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
5e50: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
5e60: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
5e70: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
5e80: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
5e90: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
5ea0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5eb0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d  E_TEXT;.      pM
5ec0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
5ed0: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
5ee0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5ef0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5f00: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
5f10: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20  >u.i = pOp->p1; 
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a           /* P1 *
5f40: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65  /.    pMem->type
5f50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
5f60: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  R;.    pMem++;..
5f70: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5f80: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
5f90: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5fa0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5fc0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  P2 */.    pMem->
5fd0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5fe0: 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b  TEGER;.    pMem+
5ff0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
6000: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
6010: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
6020: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
6030: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
6040: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6060: 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   P3 */.      pMe
6070: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6080: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
6090: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
60a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
60b0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
60c0: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20  32, 0) ){       
60d0: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20       /* P4 */.  
60e0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
60f0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
6100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6110: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6120: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6130: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
6140: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20  MEM_Term;.    z 
6150: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
6160: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
6170: 20 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e     if( z!=pMem->
6180: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
6190: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
61a0: 70 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pMem, z, -1, SQL
61b0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
61c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
61d0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
61e0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
61f0: 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d  >n = strlen(pMem
6200: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
6210: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
6220: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
6230: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6240: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65  TE_TEXT;.    pMe
6250: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  m++;..    if( p-
6260: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
6270: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6280: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d  VdbeMemGrow(pMem
6290: 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 4, 0) ){.     
62a0: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
62b0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
62c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
62d0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
62e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
62f0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
6300: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6310: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
6320: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
6330: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
6340: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
6350: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
6360: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
6370: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54  pe = SQLITE_TEXT
6380: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
6390: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
63a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
63b0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
63c0: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
63d0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b  pOp->zComment ){
63e0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
63f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
6400: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  EM_Term;.       
6410: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e   pMem->z = pOp->
6420: 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20  zComment;.      
6430: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c    pMem->n = strl
6440: 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  en(pMem->z);.   
6450: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
6460: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
6470: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
6480: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
6490: 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
64a0: 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
64b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
64c0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20   /* Comment */. 
64f0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
6500: 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b  e = SQLITE_NULL;
6510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
6520: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
6530: 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78  n = 8 - 5*(p->ex
6540: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
6550: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
6560: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
6570: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
6580: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
6590: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
65a0: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
65b0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
65c0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
65d0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
65e0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
65f0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
6600: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6610: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
6620: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
6630: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
6640: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c  *pOp;.  if( nOp<
6650: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f  1 ) return;.  pO
6660: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
6670: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
6680: 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70  e==OP_Trace && p
6690: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
66a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
66b0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
66c0: 20 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65    while( isspace
66d0: 28 2a 28 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b  (*(u8*)z) ) z++;
66e0: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c  .    printf("SQL
66f0: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20  : [%s]\n", z);. 
6700: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
6710: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6720: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
6730: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6740: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
6750: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
6760: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
6770: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
6780: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
6790: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
67a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
67b0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
67c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
67d0: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
67e0: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
67f0: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
6800: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
6810: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
6820: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
6830: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34  Trace && pOp->p4
6840: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  .z!=0 ){.    int
6850: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20   i, j;.    char 
6860: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c  z[1000];.    sql
6870: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
6880: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22  zeof(z), z, "%s"
6890: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20  , pOp->p4.z);.  
68a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 73 73 70 61    for(i=0; isspa
68b0: 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ce((unsigned cha
68c0: 72 29 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  r)z[i]); i++){}.
68d0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
68e0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
68f0: 66 28 20 69 73 73 70 61 63 65 28 28 75 6e 73 69  f( isspace((unsi
6900: 67 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 20  gned char)z[i]) 
6910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
6920: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20  [i-1]!=' ' ){.  
6930: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
6940: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
6950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6960: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b       z[j++] = z[
6970: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
6980: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a  }.    z[j] = 0;.
6990: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
69a0: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a  ce("SQL %s\n", z
69b0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
69c0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
69d0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f  TRACE && SQLITE_
69e0: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a  ENABLE_IOTRACE *
69f0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  /.../*.** Prepar
6a00: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
6a10: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f  ine for executio
6a20: 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  n.  This involve
6a30: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
6a40: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
6a50: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
6a60: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
6a70: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
6a80: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
6a90: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
6aa0: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
6ab0: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
6ac0: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
6ad0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
6ae0: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
6af0: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
6b00: 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 42 45 20   to move a VDBE 
6b10: 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
6b20: 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  INIT to.** VDBE_
6b30: 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f  MAGIC_RUN..*/.vo
6b40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  id sqlite3VdbeMa
6b50: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20  keReady(.  Vdbe 
6b60: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
6b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6b80: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
6b90: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Var,            
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6bb0: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69  ber of '?' see i
6bc0: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
6bd0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65  ent */.  int nMe
6be0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
6bf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6c00: 72 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  r of memory cell
6c10: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
6c20: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20  .  int nCursor, 
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
6c50: 75 72 73 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61  ursors to alloca
6c60: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78  te */.  int isEx
6c70: 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 20  plain           
6c80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
6c90: 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b 65  f the EXPLAIN ke
6ca0: 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 6e  ywords is presen
6cb0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  t */.){.  int n;
6cc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6cd0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72   p->db;..  asser
6ce0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
6cf0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6d00: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6d10: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
6d20: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
6d30: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
6d40: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
6d50: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
6d60: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
6d70: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
6d80: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
6d90: 20 6c 61 74 65 72 2e 20 54 68 69 73 0a 20 20 20   later. This.   
6da0: 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  * is because the
6db0: 20 63 61 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f   call to resizeO
6dc0: 70 41 72 72 61 79 28 29 20 62 65 6c 6f 77 20 6d  pArray() below m
6dd0: 61 79 20 73 68 72 69 6e 6b 20 74 68 65 0a 20 20  ay shrink the.  
6de0: 20 2a 20 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61   * p->aOp[] arra
6df0: 79 20 74 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79  y to save memory
6e00: 20 69 66 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   if called when 
6e10: 69 6e 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  in VDBE_MAGIC_RU
6e20: 4e 20 0a 20 20 20 2a 20 73 74 61 74 65 2e 0a 20  N .   * state.. 
6e30: 20 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20    */.  p->magic 
6e40: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
6e50: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68  ;..  /* For each
6e60: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64   cursor required
6e70: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20  , also allocate 
6e80: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d  a memory cell. M
6e90: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73  emory.  ** cells
6ea0: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72   (nMem+1-nCursor
6eb0: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69  )..nMem, inclusi
6ec0: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ve, will never b
6ed0: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74  e used by.  ** t
6ee0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e  he vdbe program.
6ef0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72   Instead they ar
6f00: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  e used to alloca
6f10: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a  te space for.  *
6f20: 2a 20 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  * Cursor/BtCurso
6f30: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
6f40: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
6f50: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6f60: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
6f70: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
6f80: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
6f90: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
6fa0: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
6fb0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
6fc0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
6fd0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
6fe0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
6ff0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
7000: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
7010: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
7020: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
7030: 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72 20  ation space for 
7040: 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a  registers..  */.
7050: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30    if( p->aMem==0
7060: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67   ){.    int nArg
7070: 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d  ;       /* Maxim
7080: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  um number of arg
7090: 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75 73  s passed to a us
70a0: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a  er function. */.
70b0: 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c      resolveP2Val
70c0: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
70d0: 20 20 20 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72     /*resizeOpArr
70e0: 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f  ay(p, p->nOp);*/
70f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61  .    assert( nVa
7100: 72 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r>=0 );.    if( 
7110: 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  isExplain && nMe
7120: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m<10 ){.      p-
7130: 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31  >nMem = nMem = 1
7140: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
7150: 61 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 44 62  aMem = sqlite3Db
7160: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
7170: 20 20 20 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65         nMem*size
7180: 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20  of(Mem)         
7190: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f        /* aMem */
71a0: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
71b0: 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20 20 20 20  zeof(Mem)       
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 61 56 61 72 20          /* aVar 
71d0: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 41 72 67 2a  */.      + nArg*
71e0: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20  sizeof(Mem*)    
71f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 41            /* apA
7200: 72 67 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  rg */.      + nV
7210: 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  ar*sizeof(char*)
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7230: 61 7a 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b  azVar */.      +
7240: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28   nCursor*sizeof(
7250: 43 75 72 73 6f 72 2a 29 20 2b 20 31 20 20 20 20  Cursor*) + 1    
7260: 2f 2a 20 61 70 43 73 72 20 2a 2f 0a 20 20 20 20  /* apCsr */.    
7270: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  );.    if( !db->
7280: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7290: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b        p->aMem--;
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
72b0: 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d  aMem[] goes from
72c0: 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20   1..nMem */.    
72d0: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d    p->nMem = nMem
72e0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20  ;        /*     
72f0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
7300: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d  em-1 */.      p-
7310: 3e 61 56 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d  >aVar = &p->aMem
7320: 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20  [nMem+1];.      
7330: 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a  p->nVar = nVar;.
7340: 20 20 20 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d        p->okVar =
7350: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 41   0;.      p->apA
7360: 72 67 20 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e  rg = (Mem**)&p->
7370: 61 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20  aVar[nVar];.    
7380: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68    p->azVar = (ch
7390: 61 72 2a 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e  ar**)&p->apArg[n
73a0: 41 72 67 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Arg];.      p->a
73b0: 70 43 73 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a  pCsr = (Cursor**
73c0: 29 26 70 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d  )&p->azVar[nVar]
73d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 75 72 73  ;.      p->nCurs
73e0: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
73f0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
7400: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
7410: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
7420: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
7430: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
7440: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
7450: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d    }.      for(n=
7460: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
7470: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  {.        p->aMe
7480: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
7490: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
74a0: 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64  ->aMem[n].db = d
74b0: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
74c0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
74d0: 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 6e  TE_DEBUG.  for(n
74e0: 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e  =1; n<p->nMem; n
74f0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
7500: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d   p->aMem[n].db==
7510: 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  db );.  }.#endif
7520: 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  ..  p->pc = -1;.
7530: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
7540: 5f 4f 4b 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65  _OK;.  p->unique
7550: 43 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72  Cnt = 0;.  p->er
7560: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
7570: 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61  bort;.  p->expla
7580: 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b  in |= isExplain;
7590: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
75a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20  BE_MAGIC_RUN;.  
75b0: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
75c0: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
75d0: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
75e0: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
75f0: 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61  ;.  p->openedSta
7600: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64  tement = 0;.#ifd
7610: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
7620: 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20    {.    int i;. 
7630: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7640: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
7650: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
7660: 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  = 0;.      p->aO
7670: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
7680: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
7690: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  f.}../*.** Close
76a0: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
76b0: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
76c0: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
76d0: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
76e0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
76f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
7700: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
7710: 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43 78   *p, Cursor *pCx
7720: 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20  ){.  if( pCx==0 
7730: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
7740: 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42   }.  if( pCx->pB
7750: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
7760: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
7770: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
7780: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
7790: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
77a0: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
77b0: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
77c0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
77d0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
77e0: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
77f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
7800: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
7810: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
7820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7830: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
7840: 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74  E.  if( pCx->pVt
7850: 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  abCursor ){.    
7860: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
7870: 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72  sor *pVtabCursor
7880: 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72   = pCx->pVtabCur
7890: 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73  sor;.    const s
78a0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
78b0: 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d  Module = pCx->pM
78c0: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e  odule;.    p->in
78d0: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a  VtabMethod = 1;.
78e0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
78f0: 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62  3SafetyOff(p->db
7900: 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e  );.    pModule->
7910: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73  xClose(pVtabCurs
7920: 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73  or);.    (void)s
7930: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
7940: 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ->db);.    p->in
7950: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a  VtabMethod = 0;.
7960: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
7970: 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75   !pCx->ephemPseu
7980: 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73  doTable ){.    s
7990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
79a0: 64 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29 3b  db, pCx->pData);
79b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
79c0: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
79d0: 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62 20  except for VTab 
79e0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
79f0: 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e   currently.** in
7a00: 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
7a10: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
7a20: 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65  sorsExceptActive
7a30: 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b 0a  Vtabs(Vdbe *p){.
7a40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
7a50: 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65 74  ->apCsr==0 ) ret
7a60: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
7a70: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
7a80: 2b 29 7b 0a 20 20 20 20 43 75 72 73 6f 72 20 2a  +){.    Cursor *
7a90: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
7aa0: 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26 20  ;.    if( pC && 
7ab0: 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f  (!p->inVtabMetho
7ac0: 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62 43  d || !pC->pVtabC
7ad0: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
7ae0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
7af0: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
7b00: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
7b10: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
7b20: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
7b30: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
7b40: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
7b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
7b60: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
7b70: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
7b80: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
7b90: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
7ba0: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
7bb0: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
7bc0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
7bd0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
7be0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
7bf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7c00: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
7c10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
7c20: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
7c30: 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
7c40: 6f 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56  orsExceptActiveV
7c50: 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 69  tabs(p);.  for(i
7c60: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
7c70: 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53 65 74  i++){.    MemSet
7c80: 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61 4d 65  TypeFlag(&p->aMe
7c90: 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b  m[i], MEM_Null);
7ca0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65  .  }.  releaseMe
7cb0: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
7cc0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
7cd0: 73 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43  sqlite3VdbeFifoC
7ce0: 6c 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b  lear(&p->sFifo);
7cf0: 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78  .  if( p->contex
7d00: 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  tStack ){.    fo
7d10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74  r(i=0; i<p->cont
7d20: 65 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b  extStackTop; i++
7d30: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7d40: 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70  VdbeFifoClear(&p
7d50: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69  ->contextStack[i
7d60: 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a  ].sFifo);.    }.
7d70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7d80: 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74  e(db, p->context
7d90: 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d  Stack);.  }.  p-
7da0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20  >contextStack = 
7db0: 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53  0;.  p->contextS
7dc0: 74 61 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20  tackDepth = 0;. 
7dd0: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
7de0: 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Top = 0;.  sqlit
7df0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7e00: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
7e10: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
7e20: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
7e30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
7e40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
7e50: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
7e60: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
7e70: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
7e80: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
7e90: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
7ea0: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
7eb0: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
7ec0: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
7ed0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
7ee0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
7ef0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
7f00: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
7f10: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
7f20: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
7f30: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
7f40: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
7f50: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
7f60: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
7f70: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
7f80: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
7f90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
7fa0: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
7fb0: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
7fc0: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
7fd0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
7fe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7ff0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
8000: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
8010: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
8020: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
8030: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
8040: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
8050: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
8060: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8070: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
8080: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
8090: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
80a0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
80b0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
80c0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
80d0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
80e0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
80f0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
8100: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
8110: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
8120: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
8130: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
8140: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
8150: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
8160: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
8170: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
8180: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
8190: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
81a0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
81b0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
81c0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
81d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
81e0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
81f0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
8200: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
8210: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
8220: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
8230: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
8240: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
8250: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
8260: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
8270: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
8280: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
8290: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
82a0: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
82b0: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
82c0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
82d0: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
82e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82f0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
8300: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
8310: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8330: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
8340: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
8350: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
8360: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8380: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
8390: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
83a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
83b0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
83c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
83d0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
83e0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
83f0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
8400: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
8410: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
8420: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
8430: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
8440: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
8450: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
8460: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
8470: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
8480: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
8490: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
84a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
84b0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
84c0: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
84d0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
84e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
84f0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
8500: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
8510: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
8520: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
8530: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
8540: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
8550: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
8560: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
8570: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
8580: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
8590: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
85a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
85b0: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 70 43 6f  || !zName || pCo
85c0: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
85d0: 5f 54 65 72 6d 20 29 3b 0a 20 20 72 65 74 75 72  _Term );.  retur
85e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
85f0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
8600: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
8610: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
8620: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
8630: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
8640: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
8650: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
8660: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
8670: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
8680: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
8690: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
86a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
86b0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
86c0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
86d0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
86e0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
86f0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
8700: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
8710: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
8720: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
8730: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
8740: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
8750: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
8760: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  -transaction */.
8770: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8780: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64  E_OK;.  int need
8790: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  Xcommit = 0;..  
87a0: 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
87b0: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
87c0: 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
87d0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
87e0: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
87f0: 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
8800: 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
8810: 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
8820: 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
8830: 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
8840: 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
8850: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8860: 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
8870: 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
8880: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
8890: 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
88a0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
88b0: 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
88c0: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
88d0: 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
88e0: 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  b, &p->zErrMsg);
88f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
8910: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
8920: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72   This loop deter
8930: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65  mines (a) if the
8940: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f   commit hook sho
8950: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61  uld be invoked a
8960: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20  nd.  ** (b) how 
8970: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69  many database fi
8980: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72  les have open wr
8990: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
89a0: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c  , not .  ** incl
89b0: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64  uding the temp d
89c0: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20  atabase. (b) is 
89d0: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73  important becaus
89e0: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a  e if more than .
89f0: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73    ** one databas
8a00: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70  e file has an op
8a10: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
8a20: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a  tion, a master j
8a30: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
8a40: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
8a50: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69   an atomic commi
8a60: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69  t..  */ .  for(i
8a70: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8a80: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
8a90: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
8aa0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
8ab0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
8ac0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
8ad0: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
8ae0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
8af0: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
8b00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
8b10: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
8b20: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
8b30: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
8b40: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
8b50: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
8b60: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
8b70: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
8b80: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
8b90: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
8ba0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
8bb0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
8bc0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
8bd0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
8be0: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
8bf0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
8c00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c10: 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20  CONSTRAINT;.    
8c20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
8c30: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
8c40: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
8c50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
8c60: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
8c70: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
8c80: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
8c90: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
8ca0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
8cb0: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
8cc0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
8cd0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
8ce0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
8cf0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
8d00: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
8d10: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
8d20: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
8d30: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
8d40: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
8d50: 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
8d60: 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
8d70: 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
8d80: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
8d90: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
8da0: 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
8db0: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
8dc0: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
8dd0: 30 3d 3d 73 74 72 6c 65 6e 28 73 71 6c 69 74 65  0==strlen(sqlite
8de0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8df0: 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
8e00: 29 29 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20  )) || nTrans<=1 
8e10: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
8e20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8e30: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8e40: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
8e50: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
8e60: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
8e70: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
8e80: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
8e90: 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
8ea0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
8eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f      }..    /* Do
8ec0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79   the commit only
8ed0: 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65   if all database
8ee0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63  s successfully c
8ef0: 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e  omplete phase 1.
8f00: 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20   .    ** If one 
8f10: 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d  of the BtreeComm
8f20: 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
8f30: 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69  ls fails, this i
8f40: 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20  ndicates an.    
8f50: 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c  ** IO error whil
8f60: 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  e deleting or tr
8f70: 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e  uncating a journ
8f80: 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75  al file. It is u
8f90: 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20  nlikely,.    ** 
8fa0: 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  but could happen
8fb0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
8fc0: 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e  bandon processin
8fd0: 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  g and return the
8fe0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20   error..    */. 
8ff0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
9000: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
9010: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9020: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9030: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9040: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
9050: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
9060: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9070: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
9080: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9090: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
90a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
90b0: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
90c0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
90d0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
90e0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
90f0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
9100: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
9110: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
9120: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
9130: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9140: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
9150: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
9160: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
9170: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
9180: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
9190: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
91a0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
91b0: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
91c0: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
91d0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
91e0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
91f0: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
9200: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9210: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
9220: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
9230: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
9240: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
9250: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
9260: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
9270: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
9280: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
9290: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20    int res;..    
92a0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74  /* Select a mast
92b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
92c0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  name */.    do {
92d0: 0a 20 20 20 20 20 20 75 33 32 20 72 61 6e 64 6f  .      u32 rando
92e0: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
92f0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
9300: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
9310: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
9320: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72  zeof(random), &r
9330: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
9340: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
9350: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
9360: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
9370: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66  e, random&0x7fff
9380: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  ffff);.      if(
9390: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !zMaster ){.   
93a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
93b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
93c0: 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
93d0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
93e0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
93f0: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
9400: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68  , &res);.    }wh
9410: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
9420: 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20  OK && res );.   
9430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9440: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  OK ){.      /* O
9450: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
9460: 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20  ournal. */.     
9470: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9480: 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20  penMalloc(pVfs, 
9490: 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65  zMaster, &pMaste
94a0: 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51  r, .          SQ
94b0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
94c0: 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
94d0: 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20  CREATE|.        
94e0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
94f0: 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f  CLUSIVE|SQLITE_O
9500: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
9510: 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  AL, 0.      );. 
9520: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
9530: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9540: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9550: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
9560: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
9570: 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20  .    }. .    /* 
9580: 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f  Write the name o
9590: 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  f each database 
95a0: 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e  file in the tran
95b0: 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  saction into the
95c0: 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74   new.    ** mast
95d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
95e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
95f0: 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
9600: 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61  t close.    ** a
9610: 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  nd delete the ma
9620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9630: 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76  e. All the indiv
9640: 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
9650: 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c  les.    ** still
9660: 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20   have 'null' as 
9670: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9680: 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74  al pointer, so t
9690: 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20  hey will roll.  
96a0: 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65    ** back indepe
96b0: 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69  ndently if a fai
96c0: 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20  lure occurs..   
96d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
96e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
96f0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
9700: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9710: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69  pBt;.      if( i
9720: 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==1 ) continue; 
9730: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
9740: 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
9750: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9760: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
9770: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
9780: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
9790: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
97a0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
97b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
97c0: 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20  ( zFile[0]==0 ) 
97d0: 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
97e0: 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61  nore :memory: da
97f0: 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
9800: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
9810: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
9820: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
9830: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
9840: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
9850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9860: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9870: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
9880: 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65  le, strlen(zFile
9890: 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  )+1, offset);.  
98a0: 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
98b0: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b  strlen(zFile)+1;
98c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
98d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
98e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
98f0: 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
9900: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
9910: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
9920: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
9930: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
9940: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9950: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
9960: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9980: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
9990: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  c the master jou
99a0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
99b0: 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  e IOCAP_SEQUENTI
99c0: 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a  AL device.    **
99d0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 69   flag is set thi
99e0: 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  s is not require
99f0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  d..    */.    zM
9a00: 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  ainFile = sqlite
9a10: 33 42 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65  3BtreeGetDirname
9a20: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
9a30: 3b 0a 20 20 20 20 69 66 28 20 28 6e 65 65 64 53  ;.    if( (needS
9a40: 79 6e 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d  ync .     && (0=
9a50: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
9a60: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
9a70: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
9a80: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
9a90: 4c 29 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d  L)).     && (rc=
9aa0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
9ab0: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
9ac0: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c  NC_NORMAL))!=SQL
9ad0: 49 54 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20  ITE_OK) ){.     
9ae0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
9af0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
9b00: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
9b10: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
9b20: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r, 0);.      sql
9b30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
9b40: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
9b50: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9b60: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c  .    /* Sync all
9b70: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e   the db files in
9b80: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72  volved in the tr
9b90: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
9ba0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  ame call.    ** 
9bb0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20  sets the master 
9bc0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
9bd0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  in each individu
9be0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  al journal. If. 
9bf0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f     ** an error o
9c00: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e  ccurs here, do n
9c10: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9c20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9c30: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
9c40: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63   If the error oc
9c50: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
9c60: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20  first call to.  
9c70: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65    ** sqlite3Btre
9c80: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
9c90: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ), then there is
9ca0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74   a chance that t
9cb0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  he.    ** master
9cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
9cd0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20  ll be orphaned. 
9ce0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65  But we cannot de
9cf0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20  lete it,.    ** 
9d00: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74  in case the mast
9d10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9d20: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e  name was written
9d30: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
9d40: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65  l.    ** file be
9d50: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65  fore the failure
9d60: 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f   occured..    */
9d70: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
9d80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9d90: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
9da0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9db0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9dc0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
9dd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
9de0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
9df0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
9e00: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
9e10: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9e20: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
9e30: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  (pMaster);.    i
9e40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9e50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9e60: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
9e70: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
9e80: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9e90: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
9ea0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9eb0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
9ec0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
9ed0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
9ee0: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
9ef0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
9f00: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
9f10: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
9f20: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
9f30: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
9f40: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
9f50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
9f60: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
9f70: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
9f80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9f90: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73  aster);.    zMas
9fa0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ter = 0;.    if(
9fb0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
9fc0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
9fd0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20     /* All files 
9fe0: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20  and directories 
9ff0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
a000: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65  n synced, so the
a010: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a   following.    *
a020: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
a030: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
a040: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79  seTwo() are only
a050: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61   closing files a
a060: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69  nd.    ** deleti
a070: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67  ng or truncating
a080: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f   journals. If so
a090: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
a0a0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  ng while.    ** 
a0b0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
a0c0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c  g we don't reall
a0d0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65  y care. The inte
a0e0: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20  grity of the.   
a0f0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
a100: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61  is already guara
a110: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20  nteed, but some 
a120: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75  stray 'cold' jou
a130: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79  rnals.    ** may
a140: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64   be lying around
a150: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
a160: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20  rror code won't 
a170: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20  help matters..  
a180: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65    */.    disable
a190: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
a1a0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69  rors();.    sqli
a1b0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a1c0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28  lloc();.    for(
a1d0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a1e0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
a1f0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
a200: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
a210: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
a220: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
a230: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
a240: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
a250: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
a260: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
a270: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
a280: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
a290: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
a2a0: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
a2b0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
a2c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
a2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
a2e0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
a2f0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65  lite3.activeVdbe
a300: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62  Cnt count variab
a310: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
a320: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
a330: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
a340: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
a350: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
a360: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
a370: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
a380: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
a390: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
a3a0: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
a3b0: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
a3c0: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
a3d0: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
a3e0: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
a3f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
a400: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
a410: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
a420: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
a430: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
a440: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
a450: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
a460: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
a470: 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  t = 0;.  p = db-
a480: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
a490: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   p ){.    if( p-
a4a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
a4b0: 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e  IC_RUN && p->pc>
a4c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  =0 ){.      cnt+
a4d0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
a4e0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
a4f0: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
a500: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
a510: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
a520: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
a530: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
a540: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ./*.** For every
a550: 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64   Btree that in d
a560: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a570: 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20  on db which .** 
a580: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
a590: 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76  d, "trip" or inv
a5a0: 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72  alidate each cur
a5b0: 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42  sor in.** that B
a5c0: 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20  tree might have 
a5d0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
a5e0: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
a5f0: 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65  .** can never be
a600: 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68   used again.  Th
a610: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
a620: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f  a rollback.*** o
a630: 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20  ccurs.  We have 
a640: 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20  to trip all the 
a650: 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65  other cursors, e
a660: 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72  ven.** cursor fr
a670: 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20  om other VMs in 
a680: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
a690: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a  se connections,.
a6a0: 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20  ** so that none 
a6b0: 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75  of them try to u
a6c0: 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77  se the data at w
a6d0: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72  hich they.** wer
a6e0: 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77  e pointing and w
a6f0: 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76  hich now may hav
a700: 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64  e been changed d
a710: 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c  ue.** to the rol
a720: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  lback..**.** Rem
a730: 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c  ember that a rol
a740: 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65  lback can delete
a750: 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65   tables complete
a760: 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20   and.** reorder 
a770: 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69  rootpages.  So i
a780: 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
a790: 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65  ent just to save
a7a0: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66  .** the state of
a7b0: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65   the cursor.  We
a7c0: 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64   have to invalid
a7d0: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ate the cursor.*
a7e0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  * so that it is 
a7f0: 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e  never used again
a800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a810: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
a820: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
a830: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
a840: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a850: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
a860: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
a870: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
a880: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
a890: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
a8a0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
a8b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a8c0: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
a8d0: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
a8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
a8f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a900: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77   is called the w
a910: 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73  hen a VDBE tries
a920: 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68   to halt.  If th
a930: 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61  e VDBE.** has ma
a940: 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69  de changes and i
a950: 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20  s in autocommit 
a960: 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69  mode, then commi
a970: 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67  t those.** chang
a980: 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61  es.  If a rollba
a990: 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68  ck is needed, th
a9a0: 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en do the rollba
a9b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ck..**.** This r
a9c0: 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e  outine is the on
a9d0: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74  ly way to move t
a9e0: 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d  he state of a VM
a9f0: 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f   from.** SQLITE_
aa00: 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c  MAGIC_RUN to SQL
aa10: 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20  ITE_MAGIC_HALT. 
aa20: 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20   It is harmless 
aa30: 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20  to.** call this 
aa40: 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20  on a VM that is 
aa50: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
aa60: 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a  GIC_HALT state..
aa70: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
aa80: 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20  error code.  If 
aa90: 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64  the commit could
aaa0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65   not complete be
aab0: 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b  cause of.** lock
aac0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74   contention, ret
aad0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
aae0: 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59    If SQLITE_BUSY
aaf0: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74   is returned, it
ab00: 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c  .** means the cl
ab10: 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70  ose did not happ
ab20: 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20  en and needs to 
ab30: 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a  be repeated..*/.
ab40: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48  int sqlite3VdbeH
ab50: 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  alt(Vdbe *p){.  
ab60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
ab70: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
ab80: 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42 74 72  int (*xFunc)(Btr
ab90: 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20 20 2f  ee *pBt) = 0;  /
aba0: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61  * Function to ca
abb0: 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72 65 65  ll on each btree
abc0: 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e   backend */.  in
abd0: 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  t isSpecialError
abe0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
abf0: 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 53  Set to true if S
ac00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49  QLITE_NOMEM or I
ac10: 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  OERR */..  /* Th
ac20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74  is function cont
ac30: 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74  ains the logic t
ac40: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69  hat determines i
ac50: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  f a statement or
ac60: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
ac70: 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74  n will be commit
ac80: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
ac90: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ck as a result o
aca0: 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75  f the.  ** execu
acb0: 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72  tion of this vir
acc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20  tual machine. . 
acd0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20   **.  ** If any 
ace0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
acf0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20   errors occur:. 
ad00: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c   **.  **     SQL
ad10: 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20  ITE_NOMEM.  **  
ad20: 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a     SQLITE_IOERR.
ad30: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
ad40: 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51  FULL.  **     SQ
ad50: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20  LITE_INTERRUPT. 
ad60: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68   **.  ** Then th
ad70: 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65  e internal cache
ad80: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
ad90: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
ada0: 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74  nsistent.  ** st
adb0: 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  ate.  We need to
adc0: 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74   rollback the st
add0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
ade0: 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73  ion, if there is
adf0: 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68  .  ** one, or th
ae00: 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73  e complete trans
ae10: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
ae20: 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  is no statement 
ae30: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
ae40: 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  /..  if( p->db->
ae50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
ae60: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ae70: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
ae80: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
ae90: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
aea0: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
aeb0: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
aec0: 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
aed0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
aee0: 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
aef0: 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
af00: 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
af10: 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
af20: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
af30: 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  er started */.  
af40: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
af50: 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
af60: 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
af70: 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
af80: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20  */..    /* Lock 
af90: 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20  all btrees used 
afa0: 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  by the statement
afb0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
afc0: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 45 6e  treeMutexArrayEn
afd0: 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ter(&p->aMutex);
afe0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
aff0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
b000: 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
b010: 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
b020: 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70  & 0xff;.    isSp
b030: 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
b040: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
b050: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
b060: 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
b070: 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
b080: 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
b090: 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
b0a0: 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69  _FULL;.    if( i
b0b0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b  sSpecialError ){
b0c0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 6c  .      /* This l
b0d0: 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69 63 20  oop does static 
b0e0: 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68 65 20  analysis of the 
b0f0: 71 75 65 72 79 20 74 6f 20 73 65 65 20 77 68 69  query to see whi
b100: 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ch of the.      
b110: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72  ** following thr
b120: 65 65 20 63 61 74 65 67 6f 72 69 65 73 20 69 74  ee categories it
b130: 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20 20 20   falls into:.   
b140: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
b150: 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20 20 20     Read-only.   
b160: 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72 79 20     **     Query 
b170: 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74 20 6a  with statement j
b180: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  ournal.      ** 
b190: 20 20 20 20 51 75 65 72 79 20 77 69 74 68 6f 75      Query withou
b1a0: 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  t statement jour
b1b0: 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  nal.      **.   
b1c0: 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 64     ** We could d
b1d0: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f 72 65  o something more
b1e0: 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20 74 68   elegant than th
b1f0: 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79 73  is static analys
b200: 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20 20 2a  is (i.e..      *
b210: 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79 70 65  * store the type
b220: 20 6f 66 20 71 75 65 72 79 20 61 73 20 70 61 72   of query as par
b230: 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c 69 61  t of the complia
b240: 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62 75 74  tion phase), but
b250: 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c   .      ** handl
b260: 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  ing malloc() or 
b270: 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20 61 20  IO failure is a 
b280: 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 65  fairly obscure e
b290: 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20 20 20  dge case so .   
b2a0: 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 70 72     ** this is pr
b2b0: 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e 20 54  obably easier. T
b2c0: 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20 61 6e  odo: Might be an
b2d0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
b2e0: 72 65 64 75 63 65 20 0a 20 20 20 20 20 20 2a 2a  reduce .      **
b2f0: 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76 65 72   code size a ver
b300: 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74 20 74  y small amount t
b310: 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20 20 2a  hough....      *
b320: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 74 52  /.      int notR
b330: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
b340: 20 20 20 69 6e 74 20 69 73 53 74 61 74 65 6d 65     int isStateme
b350: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  nt = 0;.      as
b360: 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c 20 70  sert(p->aOp || p
b370: 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20 20 20  ->nOp==0);.     
b380: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
b390: 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Op; i++){ .     
b3a0: 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 61 4f     switch( p->aO
b3b0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b 0a 20  p[i].opcode ){. 
b3c0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50           case OP
b3d0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 20 20  _Transaction:.  
b3e0: 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52 65 61            notRea
b3f0: 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b  dOnly |= p->aOp[
b400: 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20 20 20  i].p2;.         
b410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b420: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74 61 74      case OP_Stat
b430: 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20 20 20  ement:.         
b440: 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d     isStatement =
b450: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
b460: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
b470: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a 20 20  .      }..   .  
b480: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75      /* If the qu
b490: 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c  ery was read-onl
b4a0: 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f  y, we need do no
b4b0: 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c   rollback at all
b4c0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
b4d0: 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20 77 69     ** proceed wi
b4e0: 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 68  th the special h
b4f0: 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a  andling..      *
b500: 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 74 52  /.      if( notR
b510: 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d  eadOnly || mrc!=
b520: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
b530: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b540: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  p->rc==SQLITE_IO
b550: 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 69  ERR_BLOCKED && i
b560: 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  sStatement ){.  
b570: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b580: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b590: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
b5a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
b5b0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
b5c0: 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d 72 63   } else if( (mrc
b5d0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
b5e0: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
b5f0: 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65 6d 65  LL) && isStateme
b600: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
b610: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
b620: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b630: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b640: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
b650: 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
b660: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
b670: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
b680: 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
b690: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
b6a0: 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
b6b0: 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
b6c0: 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
b6d0: 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
b6e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b6f0: 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72     invalidateCur
b700: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
b710: 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  rees(db);.      
b720: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
b730: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
b740: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
b750: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
b760: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
b770: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
b780: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
b790: 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
b7a0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
b7b0: 61 63 74 69 76 65 20 76 64 62 65 2c 20 74 68 65  active vdbe, the
b7c0: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 65  n.    ** we do e
b7d0: 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
b7e0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
b7f0: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
b800: 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
b810: 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
b820: 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
b830: 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
b840: 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
b850: 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
b860: 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65 64 2e  ove has occured.
b870: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
b880: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b890: 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  && db->activeVdb
b8a0: 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20  eCnt==1 ){.     
b8b0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
b8c0: 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
b8d0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
b8e0: 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
b8f0: 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
b900: 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d   /* The auto-com
b910: 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65  mit flag is true
b920: 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65 20 70  , and the vdbe p
b930: 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20 20 20  rogram was .    
b940: 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75      ** successfu
b950: 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  l or hit an 'OR 
b960: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
b970: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
b980: 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ommit .        *
b990: 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  * is required.. 
b9a0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
b9b0: 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62 65 43    int rc = vdbeC
b9c0: 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20  ommit(db, p);.  
b9d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b9e0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
b9f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
ba00: 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61  reeMutexArrayLea
ba10: 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  ve(&p->aMutex);.
ba20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ba30: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ba40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ba50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ba60: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
ba70: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
ba80: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
ba90: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
baa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bab0: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
bac0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
bad0: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
bae0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
baf0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
bb00: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
bb10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
bb20: 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20   !xFunc ){.     
bb30: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
bb40: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
bb50: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
bb60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
bb70: 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65  p->openedStateme
bb80: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
bb90: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
bba0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a  treeCommitStmt;.
bbb0: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
bbc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
bbd0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
bbe0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ort ){.        x
bbf0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
bc00: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
bc10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bc20: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
bc30: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
bc40: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
bc50: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
bc60: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
bc70: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
bc80: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
bc90: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bca0: 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74   If xFunc is not
bcb0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
bcc0: 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33  s one of sqlite3
bcd0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
bce0: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  t or.    ** sqli
bcf0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
bd00: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
bd10: 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64   on each backend
bd20: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
bd30: 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20  curs.    ** and 
bd40: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
bd50: 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f  is still SQLITE_
bd60: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
bd70: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
bd80: 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  ew.    ** error 
bd90: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
bda0: 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20    assert(!xFunc 
bdb0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
bdc0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
bdd0: 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20  itStmt ||.      
bde0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
bdf0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a  reeRollbackStmt.
be00: 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
be10: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
be20: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
be30: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
be40: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
be50: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
be60: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
be70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46  .        rc = xF
be80: 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unc(pBt);.      
be90: 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e    if( rc && (p->
bea0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
beb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
bec0: 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20  ONSTRAINT) ){.  
bed0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
bee0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
bef0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
bf00: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
bf10: 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
bf20: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
bf30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
bf40: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
bf50: 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
bf60: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
bf70: 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d 65   and the stateme
bf80: 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64  nt was committed
bf90: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
bfa0: 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
bfb0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
bfc0: 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
bfd0: 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a   && p->pc>=0 ){.
bfe0: 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e 63        if( !xFunc
bff0: 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74   || xFunc==sqlit
c000: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
c010: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
c020: 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
c030: 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
c040: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
c050: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c060: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
c070: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
c080: 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
c090: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
c0a0: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72    /* Rollback or
c0b0: 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68 65   commit any sche
c0c0: 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ma changes that 
c0d0: 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20  occurred. */.   
c0e0: 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
c0f0: 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61  TE_OK && db->fla
c100: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
c110: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 20  Changes ){.     
c120: 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74   sqlite3ResetInt
c130: 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20  ernalSchema(db, 
c140: 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c  0);.      db->fl
c150: 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ags = (db->flags
c160: 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e   | SQLITE_Intern
c170: 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a  Changes);.    }.
c180: 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
c190: 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
c1a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
c1b0: 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d  exArrayLeave(&p-
c1c0: 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20  >aMutex);.  }.. 
c1d0: 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63   /* We have succ
c1e0: 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20  essfully halted 
c1f0: 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56  and closed the V
c200: 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20  M.  Record this 
c210: 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  fact. */.  if( p
c220: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64  ->pc>=0 ){.    d
c230: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
c240: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  --;.  }.  p->mag
c250: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
c260: 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
c270: 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
c280: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
c290: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c2a0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
c2b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65  NOMEM;.  }..  re
c2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c2d0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56  }.../*.** Each V
c2e0: 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65  DBE holds the re
c2f0: 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  sult of the most
c300: 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
c310: 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69  step() call.** i
c320: 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72  n p->rc.  This r
c330: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74  outine sets that
c340: 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20   result back to 
c350: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f  SQLITE_OK..*/.vo
c360: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
c370: 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64  setStepResult(Vd
c380: 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20  be *p){.  p->rc 
c390: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  = SQLITE_OK;.}..
c3a0: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
c3b0: 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
c3c0: 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
c3d0: 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
c3e0: 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
c3f0: 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
c400: 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
c410: 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
c420: 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
c430: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
c440: 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
c450: 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
c460: 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
c470: 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
c480: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
c490: 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
c4a0: 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
c4b0: 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
c4c0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
c4d0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
c4e0: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
c4f0: 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
c500: 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
c510: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
c520: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c530: 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
c540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c550: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
c560: 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
c570: 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
c580: 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
c590: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
c5a0: 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
c5b0: 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
c5c0: 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
c5d0: 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
c5e0: 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
c5f0: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
c600: 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b  te3SafetyOn(db);
c610: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
c620: 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64 29 73  lt(p);.  (void)s
c630: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66 66 28  qlite3SafetyOff(
c640: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
c650: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75  e VDBE has be ru
c660: 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79  n even partially
c670: 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20  , then transfer 
c680: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20  the error code. 
c690: 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65   ** and error me
c6a0: 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56  ssage from the V
c6b0: 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  DBE into the mai
c6c0: 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63  n database struc
c6d0: 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20  ture.  But.  ** 
c6e0: 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  if the VDBE has 
c6f0: 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f  just been set to
c700: 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74   run but has not
c710: 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74   actually execut
c720: 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74  ed any.  ** inst
c730: 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65  ructions yet, le
c740: 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ave the main dat
c750: 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f  abase error info
c760: 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  rmation unchange
c770: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  d..  */.  if( p-
c780: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66  >pc>=0 ){.    if
c790: 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
c7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
c7b0: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
c7c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7d0: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
c7e0: 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73  Err,-1,p->zErrMs
c7f0: 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51  g,SQLITE_UTF8,SQ
c800: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
c810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
c820: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
c830: 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f  .      db->errCo
c840: 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20  de = p->rc;.    
c850: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
c860: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
c870: 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  .      p->zErrMs
c880: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
c890: 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
c8a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
c8b0: 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a  (db, p->rc, 0);.
c8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c8d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c8e0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
c8f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
c900: 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
c910: 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
c920: 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
c930: 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
c940: 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
c950: 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
c960: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
c970: 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
c980: 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
c990: 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
c9a0: 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
c9b0: 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
c9c0: 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
c9d0: 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
c9e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
c9f0: 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20  rror(db, p->rc, 
ca00: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
ca10: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
ca20: 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
ca30: 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
ca40: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ca50: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
ca60: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
ca70: 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
ca80: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
ca90: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
caa0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
cab0: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
cac0: 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20   Cleanup(p);..  
cad0: 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e  /* Save profilin
cae0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  g information fr
caf0: 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e  om this VDBE run
cb00: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44  ..  */.#ifdef VD
cb10: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
cb20: 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66     FILE *out = f
cb30: 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69  open("vdbe_profi
cb40: 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20  le.out", "a");. 
cb50: 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20     if( out ){.  
cb60: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
cb70: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
cb80: 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f  --- ");.      fo
cb90: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
cba0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
cbb0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32  printf(out, "%02
cbc0: 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70  x", p->aOp[i].op
cbd0: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  code);.      }. 
cbe0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
cbf0: 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  , "\n");.      f
cc00: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
cc10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cc20: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36  fprintf(out, "%6
cc30: 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22  d %10lld %8lld "
cc40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
cc50: 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
cc60: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
cc70: 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
cc80: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
cc90: 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
cca0: 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
ccb0: 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
ccc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
ccd0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f  te3VdbePrintOp(o
cce0: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69  ut, i, &p->aOp[i
ccf0: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
cd00: 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20    fclose(out);. 
cd10: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
cd20: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
cd30: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
cd40: 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
cd50: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
cd60: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
cd70: 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
cd80: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
cd90: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
cda0: 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
cdb0: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
cdc0: 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
cdd0: 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
cde0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
cdf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
ce00: 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
ce10: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
ce20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
ce30: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
ce40: 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
ce50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
ce60: 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
ce70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
ce80: 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
ce90: 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
cea0: 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
ceb0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
cec0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
ced0: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65  C_INIT ){.    re
cee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
cef0: 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  SE;.  }.  sqlite
cf00: 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
cf10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cf20: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
cf30: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
cf40: 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
cf50: 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
cf60: 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
cf70: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
cf80: 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
cf90: 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
cfa0: 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
cfb0: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
cfc0: 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
cfd0: 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
cfe0: 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
cff0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
d000: 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
d010: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
d020: 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
d030: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
d040: 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
d050: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
d060: 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
d070: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
d080: 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
d090: 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
d0a0: 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
d0b0: 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
d0c0: 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41  k&(1<<i))) && pA
d0d0: 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
d0e0: 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
d0f0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
d100: 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
d110: 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
d120: 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
d130: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
d140: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
d150: 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
d160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d170: 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
d180: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
d190: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
d1a0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
d1b0: 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
d1c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
d1d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
d1e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
d1f0: 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
d200: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
d210: 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
d220: 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
d230: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
d240: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
d250: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
d260: 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69  ->pPrev;.  }.  i
d270: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
d280: 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f   Op *pOp = p->aO
d290: 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  p;.    for(i=0; 
d2a0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70  i<p->nOp; i++, p
d2b0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65  Op++){.      fre
d2c0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
d2d0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
d2e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d2f0: 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74  EBUG.      sqlit
d300: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
d310: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
d320: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
d330: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d340: 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a 20 20  (db, p->aOp);.  
d350: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
d360: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
d370: 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  nVar);.  sqlite3
d380: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
d390: 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e  abel);.  if( p->
d3a0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69  aMem ){.    sqli
d3b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 26 70  te3DbFree(db, &p
d3c0: 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20 7d 0a  ->aMem[1]);.  }.
d3d0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d3e0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
d3f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
d400: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
d410: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d420: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
d430: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d440: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61  ->zSql);.  p->ma
d450: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
d460: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33  _DEAD;.  sqlite3
d470: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
d480: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ../*.** If a Mov
d490: 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
d4a0: 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
d4b0: 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
d4c0: 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
d4d0: 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72  veTo now.  Retur
d4e0: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
d4f0: 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69    If no MoveTo i
d500: 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a  s pending, this.
d510: 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  ** routine does 
d520: 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75  nothing and retu
d530: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
d540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
d550: 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75  eCursorMoveto(Cu
d560: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
d570: 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
d580: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
d590: 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
d5a0: 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
d5b0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
d5c0: 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
d5d0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
d5e0: 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
d5f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d600: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
d610: 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
d620: 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
d630: 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
d640: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d650: 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
d660: 52 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74  Rowid = keyToInt
d670: 28 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74  (p->movetoTarget
d680: 29 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49  );.    p->rowidI
d690: 73 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b  sValid = res==0;
d6a0: 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
d6b0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
d6c0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d  ite3BtreeNext(p-
d6d0: 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b  >pCursor, &res);
d6e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
d6f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
d700: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
d710: 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  EST.    sqlite3_
d720: 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
d730: 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65  #endif.    p->de
d740: 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
d750: 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74  ;.    p->cacheSt
d760: 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
d770: 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  LE;.  }else if( 
d780: 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  p->pCursor ){.  
d790: 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a    int hasMoved;.
d7a0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
d7b0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
d7c0: 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73  asMoved(p->pCurs
d7d0: 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a  or, &hasMoved);.
d7e0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d7f0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20  urn rc;.    if( 
d800: 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20  hasMoved ){.    
d810: 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
d820: 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
d830: 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77        p->nullRow
d840: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
d850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d860: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
d870: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
d880: 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
d890: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
d8a0: 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
d8b0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
d8c0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d8d0: 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
d8e0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d8f0: 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
d900: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
d910: 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
d920: 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
d930: 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
d940: 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
d950: 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
d960: 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
d970: 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
d980: 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
d990: 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
d9a0: 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
d9b0: 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
d9c0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
d9d0: 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
d9e0: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
d9f0: 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
da00: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
da10: 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
da20: 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
da30: 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
da40: 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
da50: 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
da60: 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
da70: 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
da80: 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
da90: 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
daa0: 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
dab0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
dac0: 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
dad0: 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
dae0: 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
daf0: 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
db00: 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
db10: 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
db20: 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
db30: 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
db40: 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  perately..**.** 
db50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
db60: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
db70: 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
db80: 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
db90: 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
dba0: 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
dbb0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
dbc0: 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
dbe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
dbf0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
dc00: 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
dc30: 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
dc60: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
dc70: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
dc80: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
dc90: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
dca0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcc0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
dcd0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
dce0: 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
dd00: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
dd10: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
dd20: 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
dd30: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
dd40: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
dd50: 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd70: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
dd80: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
dd90: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
ddb0: 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
ddc0: 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dde0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
ddf0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
de00: 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
de30: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
de40: 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de60: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
de70: 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
de80: 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
de90: 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
dea0: 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
deb0: 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
dec0: 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
ded0: 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
dee0: 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
def0: 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
df00: 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
df10: 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
df20: 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
df30: 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
df40: 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
df50: 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
df60: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
df70: 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
df80: 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
df90: 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
dfa0: 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
dfb0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
dfc0: 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
dfd0: 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
dfe0: 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
dff0: 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  flags;.  int n;.
e000: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
e010: 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
e020: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
e030: 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
e040: 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
e050: 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
e060: 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
e070: 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
e080: 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
e090: 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
e0a0: 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
e0b0: 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
e0c0: 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
e0d0: 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72      if( file_for
e0e0: 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d  mat>=4 && (i&1)=
e0f0: 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =i ){.      retu
e100: 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a 20 20  rn 8+i;.    }.  
e110: 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a    u = i<0 ? -i :
e120: 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31   i;.    if( u<=1
e130: 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  27 ) return 1;. 
e140: 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
e150: 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
e160: 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
e170: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
e180: 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
e190: 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
e1a0: 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
e1b0: 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
e1c0: 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
e1d0: 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
e1e0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
e1f0: 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
e200: 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
e210: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
e220: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
e230: 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
e240: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
e250: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
e260: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
e270: 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73  ->u.i;.  }.  ass
e280: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
e290: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
e2a0: 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
e2b0: 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
e2c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
e2d0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
e2e0: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
e2f0: 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
e300: 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
e310: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
e320: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
e330: 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
e340: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e350: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
e360: 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
e370: 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
e380: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
e390: 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
e3a0: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
e3b0: 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
e3c0: 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
e3d0: 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
e3e0: 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
e3f0: 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
e400: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
e410: 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
e420: 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
e430: 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
e440: 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
e450: 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
e460: 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
e470: 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
e480: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
e490: 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
e4a0: 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
e4b0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
e4c0: 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
e4d0: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
e4e0: 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
e4f0: 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
e500: 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
e510: 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
e520: 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
e530: 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
e540: 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
e550: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
e560: 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
e570: 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
e580: 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
e590: 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
e5a0: 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
e5b0: 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
e5c0: 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
e5d0: 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
e5e0: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
e5f0: 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
e600: 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
e610: 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
e620: 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
e630: 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
e640: 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
e650: 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
e660: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
e670: 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
e680: 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
e690: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
e6a0: 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
e6b0: 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
e6c0: 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
e6d0: 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
e6e0: 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
e6f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
e700: 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
e710: 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
e720: 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
e730: 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
e740: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
e750: 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
e760: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
e770: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
e780: 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
e790: 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
e7a0: 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
e7b0: 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
e7c0: 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
e7d0: 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
e7e0: 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
e7f0: 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
e800: 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
e810: 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
e820: 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
e830: 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
e840: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
e850: 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
e860: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
e870: 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
e880: 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
e890: 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
e8a0: 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
e8b0: 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
e8c0: 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
e8d0: 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
e8e0: 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
e8f0: 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
e900: 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
e910: 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
e920: 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
e930: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
e940: 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
e950: 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
e960: 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
e970: 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
e980: 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
e990: 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
e9a0: 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
e9b0: 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
e9c0: 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
e9d0: 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
e9e0: 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
e9f0: 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
ea00: 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
ea10: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
ea20: 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
ea30: 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
ea40: 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
ea50: 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
ea60: 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
ea70: 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
ea80: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
ea90: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
eaa0: 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
eab0: 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
eac0: 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
ead0: 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
eae0: 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
eaf0: 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
eb00: 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
eb10: 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
eb20: 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
eb30: 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
eb40: 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
eb50: 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
eb60: 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
eb70: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
eb80: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
eb90: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
eba0: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
ebb0: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
ebc0: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
ebd0: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
ebe0: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
ebf0: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
ec00: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
ec10: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
ec20: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
ec30: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
ec40: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
ec50: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
ec60: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
ec70: 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
ec80: 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
ec90: 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
eca0: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
ecb0: 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
ecc0: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
ecd0: 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
ece0: 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
ecf0: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
ed00: 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
ed10: 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
ed20: 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
ed30: 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
ed40: 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
ed50: 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
ed60: 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
ed70: 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
ed80: 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
ed90: 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
eda0: 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
edb0: 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
edc0: 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
edd0: 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
ede0: 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
edf0: 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
ee00: 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
ee10: 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
ee20: 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
ee30: 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
ee40: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
ee50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ee60: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
ee70: 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
ee80: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
ee90: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
eea0: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
eeb0: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
eec0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
eed0: 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
eee0: 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
eef0: 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
ef00: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
ef10: 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
ef20: 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
ef30: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
ef40: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
ef50: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
ef60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ef70: 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
ef80: 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c  format);.  int l
ef90: 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
efa0: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
efb0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
efc0: 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
efd0: 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
efe0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
eff0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
f000: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
f010: 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
f020: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
f030: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
f040: 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
f050: 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
f060: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
f070: 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
f080: 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
f090: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
f0a0: 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
f0b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
f0c0: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
f0d0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
f0e0: 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  len<=nBuf );.   
f0f0: 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
f100: 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76       buf[i] = (v
f110: 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
f120: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
f130: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
f140: 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
f150: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
f160: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
f170: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
f180: 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
f190: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
f1a0: 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20  )?pMem->u.i:0). 
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
f1c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
f1d0: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
f1e0: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
f1f0: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
f200: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
f210: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
f220: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
f230: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
f240: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
f250: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
f260: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  en += pMem->u.i;
f270: 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e  .      if( len>n
f280: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
f290: 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20  en = nBuf;.     
f2a0: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
f2b0: 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
f2c0: 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
f2d0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
f2e0: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
f2f0: 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
f300: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
f310: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f320: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
f330: 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
f340: 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
f350: 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
f360: 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
f370: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
f380: 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
f390: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
f3a0: 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69  ytes read..*/ .i
f3b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
f3c0: 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
f3d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
f3e0: 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
f3f0: 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
f400: 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
f410: 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
f420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
f430: 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
f440: 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
f450: 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
f460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
f470: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
f480: 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
f490: 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
f4a0: 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
f4b0: 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
f4c0: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
f4d0: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
f4e0: 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
f4f0: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
f500: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
f510: 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
f520: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f530: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
f540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f550: 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
f560: 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
f570: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f580: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
f590: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f5a0: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f5b0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f5c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
f5d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
f5e0: 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
f5f0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f600: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f610: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
f620: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
f630: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
f640: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f650: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f660: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
f670: 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
f680: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f690: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f6a0: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
f6b0: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
f6c0: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
f6d0: 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
f6e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f6f0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
f700: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
f710: 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
f720: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
f730: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
f740: 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
f750: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
f760: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
f770: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
f780: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f790: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f7a0: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
f7b0: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
f7c0: 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
f7d0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f7e0: 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
f7f0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f800: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f810: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
f820: 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
f830: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
f840: 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
f850: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
f860: 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
f870: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
f880: 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
f890: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f8a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
f8b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
f8c0: 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
f8d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f8e0: 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
f8f0: 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
f900: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
f910: 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
f920: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
f930: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
f940: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
f950: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
f960: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
f970: 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
f980: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
f990: 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
f9a0: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
f9b0: 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
f9c0: 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
f9d0: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
f9e0: 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
f9f0: 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
fa00: 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
fa10: 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
fa20: 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
fa30: 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
fa40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
fa50: 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
fa60: 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
fa70: 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
fa80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
fa90: 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
faa0: 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
fab0: 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
fac0: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
fad0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
fae0: 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
faf0: 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
fb00: 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
fb10: 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
fb20: 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
fb30: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
fb40: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
fb50: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
fb60: 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
fb70: 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
fb80: 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
fb90: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
fba0: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
fbb0: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
fbc0: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
fbe0: 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
fbf0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
fc00: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
fc10: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fc20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
fc30: 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
fc40: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
fc50: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
fc60: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
fc70: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
fc80: 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
fc90: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
fca0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
fcb0: 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
fcc0: 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
fcd0: 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
fce0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
fcf0: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
fd00: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
fd10: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
fd20: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
fd30: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
fd40: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
fd50: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
fd60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
fd70: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
fd80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
fd90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
fda0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
fdb0: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
fdc0: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
fdd0: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
fde0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
fdf0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
fe00: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
fe10: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
fe20: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
fe30: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
fe40: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
fe50: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
fe60: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
fe70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
fe80: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
fe90: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
fea0: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
feb0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fec0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
fed0: 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
fee0: 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
fef0: 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
ff00: 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
ff10: 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
ff20: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
ff30: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
ff40: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
ff50: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
ff60: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
ff70: 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
ff80: 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
ff90: 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
ffa0: 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
ffb0: 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
ffc0: 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
ffd0: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
ffe0: 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
fff0: 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
10000 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
10010 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
10020 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
10030 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
10040 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
10050 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
10060 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
10070 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
10080 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
10090 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
100a0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
100b0 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
100c0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
100d0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
100e0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
100f0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
10100 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
10110 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
10120 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
10130 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
10140 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
10150 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
10160 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
10170 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
10180 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
10190 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
101a0 64 20 2a 70 53 70 61 63 65 2c 2f 2a 20 53 70 61  d *pSpace,/* Spa
101b0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ce available to 
101c0 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f  hold resulting o
101d0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73  bject */.  int s
101e0 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20  zSpace          
101f0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
10200 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
10210 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
10220 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
10230 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
10240 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
10250 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
10260 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   *p;.  int nByte
10270 3b 0a 20 20 69 6e 74 20 69 64 78 2c 20 64 3b 0a  ;.  int idx, d;.
10280 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
10290 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
102a0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
102b0 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
102c0 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
102d0 20 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65   .  assert( size
102e0 6f 66 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a  of(Mem)>sizeof(*
102f0 70 29 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  p) );.  nByte = 
10300 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
10310 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29  yInfo->nField+2)
10320 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
10330 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d  Space ){.    p =
10340 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
10350 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
10360 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
10370 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
10380 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  0;.    p->flags 
10390 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
103a0 46 52 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f  FREE | UNPACKED_
103b0 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20  NEED_DESTROY;.  
103c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 70  }else{.    p = p
103d0 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  Space;.    p->fl
103e0 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
103f0 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
10400 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
10410 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
10420 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
10430 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
10440 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20   p->aMem = pMem 
10450 3d 20 26 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b  = &((Mem*)p)[1];
10460 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
10470 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
10480 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
10490 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
104a0 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
104b0 3c 70 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  <p->nField ){.  
104c0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
104d0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
104e0 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
104f0 2b 69 64 78 2c 20 73 65 72 69 61 6c 5f 74 79 70  +idx, serial_typ
10500 65 29 3b 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e  e);.    if( d>=n
10510 4b 65 79 20 26 26 20 73 71 6c 69 74 65 33 56 64  Key && sqlite3Vd
10520 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10530 73 65 72 69 61 6c 5f 74 79 70 65 29 3e 30 20 29  serial_type)>0 )
10540 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d   break;.    pMem
10550 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
10560 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
10570 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
10580 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  db;.    pMem->fl
10590 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  ags = 0;.    pMe
105a0 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
105b0 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
105c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
105d0 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
105e0 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
105f0 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
10600 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
10610 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
10620 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
10630 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74  Field = u;.  ret
10640 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a  urn (void*)p;.}.
10650 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10660 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55  ine destroys a U
10670 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62  npackedRecord ob
10680 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
10690 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
106a0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70  packedRecord(Unp
106b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
106c0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
106d0 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55  if( p->flags & U
106e0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
106f0 54 52 4f 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  TROY ){.      in
10700 74 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  t i;.      Mem *
10710 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  pMem;.      for(
10720 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65  i=0, pMem=p->aMe
10730 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20  m; i<p->nField; 
10740 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
10750 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
10760 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
10770 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10780 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
10790 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
107a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
107b0 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
107c0 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
107d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
107e0 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e  DbFree(p->pKeyIn
107f0 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  fo->db, p);.    
10800 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
10810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
10820 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
10830 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
10840 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
10850 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
10860 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
10870 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
10880 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
10890 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
108a0 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
108b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
108c0 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
108d0 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
108e0 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
108f0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
10900 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
10910 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b  ted by th OP_Mak
10920 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
10930 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
10940 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
10950 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
10960 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
10970 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
10980 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
10990 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ord..**.** Key1 
109a0 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
109b0 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
109c0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
109d0 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68  of fields..** Th
109e0 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72  e key with fewer
109f0 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c   fields is usual
10a00 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73  ly compares less
10a10 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f   than the .** lo
10a20 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76  nger key.  Howev
10a30 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  er if the UNPACK
10a40 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73  ED_INCRKEY flags
10a50 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65   in pPKey2 is se
10a60 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d  t.** and the com
10a70 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65  mon prefixes are
10a80 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79   equal, then key
10a90 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b  1 is less than k
10aa0 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68  ey2..** Or if th
10ab0 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48  e UNPACKED_MATCH
10ac0 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20  _PREFIX flag is 
10ad0 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66  set and the pref
10ae0 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  ixes are.** equa
10af0 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73  l, then the keys
10b00 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
10b10 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a  to be equal and.
10b20 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79  ** the parts bey
10b30 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  ond the common p
10b40 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65  refix are ignore
10b50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
10b60 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
10b70 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65  ROWID flag is se
10b80 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10b90 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
10ba0 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20  header of pKey1 
10bb0 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20  is ignored.  It 
10bc0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
10bd0 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69  pKey1 is.** an i
10be0 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68  ndex key, and th
10bf0 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72  us ends with a r
10c00 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65  owid value.  The
10c10 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66   last byte.** of
10c20 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c   the header will
10c30 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68   therefore be th
10c40 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
10c50 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f   the rowid:.** o
10c60 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34  ne of 1, 2, 3, 4
10c70 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20  , 5, 6, 8, or 9 
10c80 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65  - the integer se
10c90 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54  rial types..** T
10ca0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
10cb0 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  f the final rowi
10cc0 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  d will always be
10cd0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
10ce0 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74  ** By ignoring t
10cf0 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66  his last byte of
10d00 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20   the header, we 
10d10 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72  force the compar
10d20 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72  ison.** to ignor
10d30 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  e the rowid at t
10d40 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a  he end of key1..
10d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
10d60 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10d70 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
10d80 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
10d90 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
10da0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
10db0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
10dc0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
10dd0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
10de0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10df0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
10e00 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
10e10 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
10e20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
10e30 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
10e40 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
10e50 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10e60 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
10e70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10e80 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
10e90 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
10ea0 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
10eb0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
10ec0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10ed0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
10ee0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
10ef0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
10f00 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
10f10 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
10f20 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
10f30 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
10f40 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
10f50 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
10f60 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d  KeyInfo->db;.  m
10f70 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em1.flags = 0;. 
10f80 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
10f90 30 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  0;.  .  idx1 = g
10fa0 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
10fb0 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
10fc0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20  = szHdr1;.  if( 
10fd0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
10fe0 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
10ff0 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48  ROWID ){.    szH
11000 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69  dr1--;.  }.  nFi
11010 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
11020 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
11030 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
11040 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
11050 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
11060 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
11070 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
11080 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
11090 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
110a0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
110b0 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
110c0 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
110d0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
110e0 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
110f0 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
11100 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
11110 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
11120 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
11130 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
11140 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
11150 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
11160 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
11170 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
11180 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
11190 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
111a0 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
111b0 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
111c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
111d0 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
111e0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
111f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11200 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46              i<nF
11210 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
11220 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
11230 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
11240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11250 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
11260 0a 20 20 69 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c  .  if( mem1.zMal
11270 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
11280 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
11290 31 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30  1);..  if( rc==0
112a0 20 29 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30   ){.    /* rc==0
112b0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
112c0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
112d0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
112e0 64 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c  ds and.    ** al
112f0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
11300 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
11310 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
11320 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
11330 59 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  Y.    ** flag is
11340 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
11350 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
11360 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
11370 67 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ger..    ** If t
11380 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
11390 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
113a0 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
113b0 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
113c0 78 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63  xes.    ** are c
113d0 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
113e0 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  equal.  Otherwis
113f0 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65  e, the longer ke
11400 79 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  y is the .    **
11410 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20   larger.  As it 
11420 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b  happens, the pPK
11430 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ey2 will always 
11440 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20  be the longer.  
11450 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73    ** if there is
11460 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20   a difference.. 
11470 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
11480 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
11490 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29  PACKED_INCRKEY )
114a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
114b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
114c0 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
114d0 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
114e0 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ATCH ){.      /*
114f0 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
11500 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64      }else if( id
11510 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
11520 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
11530 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
11540 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
11550 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
11560 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
11570 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
11580 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
11590 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
115a0 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
115b0 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
115c0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
115d0 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
115e0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
115f0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
11600 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
11610 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
11620 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
11630 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
11640 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
11650 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
11660 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
11670 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
11680 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
11690 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
116a0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
116b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
116c0 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
116d0 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
116e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
116f0 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
11700 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
11710 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
11720 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
11730 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
11740 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
11750 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
11760 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
11770 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
11780 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11790 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
117a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
117b0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
117c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
117d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
117e0 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20    }.  m.flags = 
117f0 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20  0;.  m.db = 0;. 
11800 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a   m.zMalloc = 0;.
11810 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
11820 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
11830 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
11840 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
11850 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11860 20 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64   rc;.  }.  (void
11870 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
11880 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
11890 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
118a0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
118b0 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
118c0 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
118d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
118e0 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
118f0 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
11900 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
11910 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
11920 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
11930 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
11940 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
11950 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
11960 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
11970 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11980 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
11990 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
119a0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
119b0 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
119c0 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
119d0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
119e0 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
119f0 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
11a00 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
11a10 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
11a20 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
11a30 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
11a40 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
11a50 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
11a60 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
11a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
11a80 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
11a90 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
11aa0 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
11ab0 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
11ac0 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
11ad0 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
11ae0 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
11af0 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
11b00 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
11b10 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
11b20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
11b30 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
11b40 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
11b50 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
11b60 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
11b70 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
11b80 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
11b90 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
11ba0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 6d  *.** pUnpacked m
11bb0 61 79 20 62 65 20 61 6e 20 75 6e 70 61 63 6b 65  ay be an unpacke
11bc0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65  d version of pKe
11bd0 79 2c 6e 4b 65 79 2e 20 20 49 66 20 70 55 6e 70  y,nKey.  If pUnp
11be0 61 63 6b 65 64 20 69 73 0a 2a 2a 20 73 75 70 70  acked is.** supp
11bf0 6c 69 65 64 20 69 74 20 69 73 20 75 73 65 64 20  lied it is used 
11c00 69 6e 20 70 6c 61 63 65 20 6f 66 20 70 4b 65 79  in place of pKey
11c10 2c 6e 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ,nKey..*/.int sq
11c20 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
11c30 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72  ompare(.  Cursor
11c40 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
11c50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
11c60 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
11c70 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
11c80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
11c90 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
11ca0 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ked version of p
11cb0 4b 65 79 20 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a  Key and nKey */.
11cc0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ce0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
11cf0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
11d00 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
11d10 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
11d20 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
11d30 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
11d40 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
11d50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
11d60 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
11d70 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
11d80 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
11d90 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
11da0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11db0 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b  .  }.  m.db = 0;
11dc0 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  .  m.flags = 0;.
11dd0 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b    m.zMalloc = 0;
11de0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
11df0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
11e00 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
11e10 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
11e20 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11e30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11e40 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61  .  assert( pUnpa
11e50 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e  cked->flags & UN
11e60 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
11e70 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20  WID );.  *res = 
11e80 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11e90 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
11ea0 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
11eb0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
11ec0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
11ed0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11ef0 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
11f00 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
11f10 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
11f20 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
11f30 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
11f40 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
11f50 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
11f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11f70 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
11f80 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
11f90 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
11fa0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11fb0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
11fc0 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
11fd0 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
11fe0 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
11ff0 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
12000 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
12010 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
12020 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
12030 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
12040 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
12050 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
12060 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
12070 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
12080 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
12090 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
120a0 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
120b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
120c0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
120d0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
120e0 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
120f0 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
12100 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
12110 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
12120 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
12130 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
12140 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
12150 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
12160 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
12170 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
12180 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
12190 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
121a0 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
121b0 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
121c0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
121d0 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
121e0 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
121f0 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
12200 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
12210 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
12220 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
12230 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
12240 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
12250 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
12260 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
12270 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
12280 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
12290 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
122a0 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
122b0 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
122c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
122d0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
122e0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
122f0 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
12300 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
12310 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
12320 3e 64 62 3b 0a 7d 0a                             >db;.}.