/ Hex Artifact Content
Login

Artifact c61240e6776a4a88d61624734234d103bd7a31fa:


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 33 38 39 20 32  eaux.c,v 1.389 2
02c0: 30 30 38 2f 30 36 2f 32 30 20 31 34 3a 35 39 3a  008/06/20 14:59:
02d0: 35 31 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  51 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 20 20 20 20 7d 0a 23 65 6e 64 69 66 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 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62 65  e3_free(p->aLabe
2040: 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20  l);.  p->aLabel 
2050: 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e  = 0;..  *pMaxFun
2060: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
2070: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65  ;..  /* If we ne
2080: 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73  ver rollback a s
2090: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
20a0: 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65  tion, then state
20b0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
20c0: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e  ctions are not n
20d0: 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67  eeded.  So chang
20e0: 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65  e every OP_State
20f0: 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ment.  ** opcode
2100: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
2110: 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20  .  This avoid a 
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
2130: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
2140: 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20  .  ** which can 
2150: 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20  be expensive on 
2160: 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a  some platforms..
2170: 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74    */.  if( hasSt
2180: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20  atementBegin && 
2190: 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f  !doesStatementRo
21a0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
21b0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
21c0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
21d0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
21e0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
21f0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
2200: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   ){.        pOp-
2210: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
2220: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2230: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
2240: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
2250: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2260: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
2270: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
2280: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2290: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
22a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
22b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
22c0: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
22d0: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
22e0: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
22f0: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
2300: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2310: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
2320: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
2330: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
2340: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
2350: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
2360: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
2370: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
2380: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
2390: 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a  p){.  int addr;.
23a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
23b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
23c0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
23d0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e  nOp + nOp > p->n
23e0: 4f 70 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72  OpAlloc ){.    r
23f0: 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c 20  esizeOpArray(p, 
2400: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d  p->nOpAlloc ? p-
2410: 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30  >nOpAlloc*2 : 10
2420: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a  24/sizeof(Op));.
2430: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
2440: 4f 70 2b 6e 4f 70 3c 3d 70 2d 3e 6e 4f 70 41 6c  Op+nOp<=p->nOpAl
2450: 6c 6f 63 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  loc || p->db->ma
2460: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
2470: 7d 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  }.  if( p->db->m
2480: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2490: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
24a0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
24b0: 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b  ;.  if( nOp>0 ){
24c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
24d0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
24e0: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
24f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
2500: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
2510: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
2520: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
2530: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
2540: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
2550: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
2560: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
2570: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
2580: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
2590: 28 20 70 32 3c 30 20 26 26 20 73 71 6c 69 74 65  ( p2<0 && sqlite
25a0: 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50 72  3VdbeOpcodeHasPr
25b0: 6f 70 65 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63  operty(pOut->opc
25c0: 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  ode, OPFLG_JUMP)
25d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74   ){.        pOut
25e0: 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44  ->p2 = addr + AD
25f0: 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65  DR(p2);.      }e
2600: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75  lse{.        pOu
2610: 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20  t->p2 = p2;.    
2620: 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e    }.      pOut->
2630: 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20  p3 = pIn->p3;.  
2640: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65      pOut->p4type
2650: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
2660: 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20       pOut->p4.p 
2670: 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  = 0;.      pOut-
2680: 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  >p5 = 0;.#ifdef 
2690: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
26a0: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
26b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
26c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
26d0: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20  pTrace ){.      
26e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
26f0: 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20  ntOp(0, i+addr, 
2700: 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29  &p->aOp[i+addr])
2710: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2720: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f  .    }.    p->nO
2730: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20  p += nOp;.  }.  
2740: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
2750: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
2760: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
2770: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
2780: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
2790: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
27a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
27b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
27c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
27d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
27e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
27f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
2800: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
2810: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
2820: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
2830: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
2840: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2850: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
2860: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2870: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2880: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2890: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
28a0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
28b0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
28c0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
28d0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
28e0: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
28f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2900: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2910: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
2920: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2930: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
2940: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
2950: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
2960: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
2970: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
2980: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
2990: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
29a0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
29b0: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
29c0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
29d0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
29e0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
29f0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
2a00: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
2a10: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
2a20: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2a30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2a40: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
2a50: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2a60: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2a70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a80: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
2a90: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
2aa0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
2ab0: 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d  rt( p==0 || p->m
2ac0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2ad0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
2ae0: 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70   && addr>=0 && p
2af0: 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d  ->nOp>addr && p-
2b00: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  >aOp ){.    p->a
2b10: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
2b20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2b30: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2b40: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
2b50: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
2b60: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
2b70: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
2b80: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2b90: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
2ba0: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
2bb0: 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e  ert( p==0 || p->
2bc0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
2bd0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
2be0: 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  p && p->aOp ){. 
2bf0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
2c00: 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  p>0 );.    p->aO
2c10: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
2c20: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
2c30: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32  ** Change the P2
2c40: 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74   operand of inst
2c50: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20  ruction addr so 
2c60: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2c70: 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  o.** the address
2c80: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
2c90: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  truction to be c
2ca0: 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oded..*/.void sq
2cb0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2cc0: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  e(Vdbe *p, int a
2cd0: 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  ddr){.  sqlite3V
2ce0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
2cf0: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
2d00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
2d10: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
2d20: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
2d30: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
2d40: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
2d50: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
2d60: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
2d70: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
2d80: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
2d90: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e  eralFunction(Fun
2da0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
2db0: 66 28 20 70 44 65 66 20 26 26 20 28 70 44 65 66  f( pDef && (pDef
2dc0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
2dd0: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
2de0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2df0: 72 65 65 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  ree(pDef);.  }.}
2e00: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
2e10: 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63   P4 value if nec
2e20: 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  essary..*/.stati
2e30: 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 69 6e  c void freeP4(in
2e40: 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a  t p4type, void *
2e50: 70 33 29 7b 0a 20 20 69 66 28 20 70 33 20 29 7b  p3){.  if( p3 ){
2e60: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74  .    switch( p4t
2e70: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
2e80: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20  e P4_REAL:.     
2e90: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a   case P4_INT64:.
2ea0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50        case P4_MP
2eb0: 52 49 4e 54 46 3a 0a 20 20 20 20 20 20 63 61 73  RINTF:.      cas
2ec0: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20  e P4_DYNAMIC:.  
2ed0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
2ee0: 4e 46 4f 3a 0a 20 20 20 20 20 20 63 61 73 65 20  NFO:.      case 
2ef0: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
2f00: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
2f10: 6c 69 74 65 33 5f 66 72 65 65 28 70 33 29 3b 0a  lite3_free(p3);.
2f20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
2f40: 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b  e P4_VDBEFUNC: {
2f50: 0a 20 20 20 20 20 20 20 20 56 64 62 65 46 75 6e  .        VdbeFun
2f60: 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d 20 28  c *pVdbeFunc = (
2f70: 56 64 62 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20  VdbeFunc *)p3;. 
2f80: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
2f90: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64  eralFunction(pVd
2fa0: 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a  beFunc->pFunc);.
2fb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2fc0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
2fd0: 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a  (pVdbeFunc, 0);.
2fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ff0: 66 72 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b  free(pVdbeFunc);
3000: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3020: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
3030: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3040: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28  emeralFunction((
3050: 46 75 6e 63 44 65 66 2a 29 70 33 29 3b 0a 20 20  FuncDef*)p3);.  
3060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3070: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3080: 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20  P4_MEM: {.      
3090: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
30a0: 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  ee((sqlite3_valu
30b0: 65 2a 29 70 33 29 3b 0a 20 20 20 20 20 20 20 20  e*)p3);.        
30c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
30d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
30e0: 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f  ** Change N opco
30f0: 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  des starting at 
3100: 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a  addr to No-ops..
3110: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
3120: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
3130: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
3140: 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28  r, int N){.  if(
3150: 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a   p && p->aOp ){.
3160: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
3170: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
3180: 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  .    while( N-- 
3190: 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28  ){.      freeP4(
31a0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
31b0: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d  ->p4.p);.      m
31c0: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
31d0: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
31e0: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
31f0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
3200: 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20    pOp++;.    }. 
3210: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
3220: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
3230: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
3240: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
3250: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
3260: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
3270: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
3280: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
3290: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
32a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
32b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
32c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
32d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
32e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
32f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
3300: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
3310: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
3320: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
3330: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
3340: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
3350: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
3360: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3370: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
3380: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
3390: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
33a0: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
33b0: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
33c0: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
33d0: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
33e0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
33f0: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
3400: 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50  4..**.** If n==P
3410: 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61  4_KEYINFO it mea
3420: 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20 61  ns that zP4 is a
3430: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
3440: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  yInfo structure.
3450: 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61  .** A copy is ma
3460: 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66  de of the KeyInf
3470: 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f  o structure into
3480: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
3490: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
34a0: 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66  _malloc, to be f
34b0: 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64  reed when the Vd
34c0: 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e  be is finalized.
34d0: 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  .** n==P4_KEYINF
34e0: 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61  O_HANDOFF indica
34f0: 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69  tes that zP4 poi
3500: 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f  nts to a KeyInfo
3510: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74   structure.** st
3520: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74  ored in memory t
3530: 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
3540: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
3550: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
3560: 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   The .** caller 
3570: 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20  should not free 
3580: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
3590: 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  it will be freed
35a0: 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69   when the Vdbe i
35b0: 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a  s.** finalized..
35c0: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
35d0: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
35e0: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
35f0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
3600: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
3610: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
3620: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
3630: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
3640: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
3650: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
3660: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
3670: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
3680: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
3690: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
36a0: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
36b0: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
36c0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
36d0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
36e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
36f0: 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20  beChangeP4(Vdbe 
3700: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f  *p, int addr, co
3710: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69  nst char *zP4, i
3720: 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70  nt n){.  Op *pOp
3730: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
3740: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3750: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3760: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3770: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
3780: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3790: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e 20 21  d ){.    if (n !
37a0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a  = P4_KEYINFO) {.
37b0: 20 20 20 20 20 20 66 72 65 65 50 34 28 6e 2c 20        freeP4(n, 
37c0: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
37d0: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
37e0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
37f0: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
3800: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
3810: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
3820: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20   p->nOp - 1;.   
3830: 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72 65   if( addr<0 ) re
3840: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20  turn;.  }.  pOp 
3850: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
3860: 0a 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e 70  .  freeP4(pOp->p
3870: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
3880: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  );.  pOp->p4.p =
3890: 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f   0;.  if( n==P4_
38a0: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
38b0: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
38c0: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
38d0: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
38e0: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
38f0: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
3900: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
3910: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
3920: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 28     pOp->p4.i = (
3930: 69 6e 74 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  int)zP4;.    pOp
3940: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
3950: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
3960: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3970: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
3980: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
3990: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
39a0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
39b0: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
39c0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
39d0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
39e0: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
39f0: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
3a00: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
3a10: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
3a20: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3a30: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3a40: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
3a50: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
3a60: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nfo = sqlite3Mal
3a70: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3a80: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
3a90: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
3aa0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3ab0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
3ac0: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e  pKeyInfo, zP4, n
3ad0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Byte);.      /* 
3ae0: 49 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  In the current i
3af0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 50  mplementation, P
3b00: 34 5f 4b 45 59 49 4e 46 4f 20 69 73 20 6f 6e 6c  4_KEYINFO is onl
3b10: 79 20 65 76 65 72 20 75 73 65 64 20 6f 6e 0a 20  y ever used on. 
3b20: 20 20 20 20 20 2a 2a 20 4b 65 79 49 6e 66 6f 20       ** KeyInfo 
3b30: 73 74 72 75 63 74 75 72 65 73 20 74 68 61 74 20  structures that 
3b40: 68 61 76 65 20 6e 6f 20 61 53 6f 72 74 4f 72 64  have no aSortOrd
3b50: 65 72 20 63 6f 6d 70 6f 6e 65 6e 74 2e 20 20 45  er component.  E
3b60: 6c 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a  lements.      **
3b70: 20 77 69 74 68 20 61 6e 20 61 53 6f 72 74 4f 72   with an aSortOr
3b80: 64 65 72 20 61 6c 77 61 79 73 20 75 73 65 20 50  der always use P
3b90: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
3ba0: 46 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  F.  So we do not
3bb0: 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74  .      ** need t
3bc0: 6f 20 62 6f 74 68 65 72 20 77 69 74 68 20 64 75  o bother with du
3bd0: 70 6c 69 63 61 74 69 6e 67 20 74 68 65 20 61 53  plicating the aS
3be0: 6f 72 74 4f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  ortOrder. */.   
3bf0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
3c00: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3d  nfo->aSortOrder=
3c10: 3d 30 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  =0 );.#if 0.    
3c20: 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70    aSortOrder = p
3c30: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
3c40: 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61  der;.      if( a
3c50: 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20  SortOrder ){.   
3c60: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61       pKeyInfo->a
3c70: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73  SortOrder = (uns
3c80: 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65  igned char*)&pKe
3c90: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69  yInfo->aColl[nFi
3ca0: 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65  eld];.        me
3cb0: 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61  mcpy(pKeyInfo->a
3cc0: 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74  SortOrder, aSort
3cd0: 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a  Order, nField);.
3ce0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
3cf0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3d00: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
3d10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3d30: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3d40: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d50: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3d60: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3d70: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3d80: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3d90: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
3da0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3db0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
3dc0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3dd0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3de0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3df0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e   pOp->p4type = n
3e00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
3e10: 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74  f( n==0 ) n = st
3e20: 72 6c 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70  rlen(zP4);.    p
3e30: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
3e40: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
3e50: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
3e60: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3e70: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
3e80: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3e90: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
3ea0: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20   comment on the 
3eb0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
3ec0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
3ed0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3ee0: 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ite3VdbeComment(
3ef0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
3f00: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
3f10: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  ;.  assert( p->n
3f30: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d  Op>0 || p->aOp==
3f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3f50: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61  ->aOp==0 || p->a
3f60: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
3f70: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64  mment==0 || p->d
3f80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3f90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
3fa0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a  ){.    char **pz
3fb0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   = &p->aOp[p->nO
3fc0: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20  p-1].zComment;. 
3fd0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
3fe0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71  zFormat);.    sq
3ff0: 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b  lite3_free(*pz);
4000: 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74  .    *pz = sqlit
4010: 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  e3VMPrintf(p->db
4020: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
4030: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
4040: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
4050: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
4060: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
4070: 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64  n address..*/.Vd
4080: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
4090: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
40a0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73  int addr){.  ass
40b0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
40c0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
40d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  ;.  assert( (add
40e0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
40f0: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
4100: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
4110: 20 72 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d   return ((addr>=
4120: 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  0 && addr<p->nOp
4130: 29 3f 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d  )?(&p->aOp[addr]
4140: 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  ):0);.}..#if !de
4150: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
4160: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
4170: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
4180: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
4190: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
41a0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
41b0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
41c0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
41d0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
41e0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
41f0: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
4200: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
4210: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
4220: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
4230: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
4240: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
4250: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
4260: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
4270: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
4280: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
4290: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
42a0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
42b0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
42c0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
42d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
42e0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
42f0: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
4300: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71  eyInfo;.      sq
4310: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
4320: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65  Temp, zTemp, "ke
4330: 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49  yinfo(%d", pKeyI
4340: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20  nfo->nField);.  
4350: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
4360: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
4370: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
4380: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
4390: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
43a0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
43b0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
43c0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29       if( pColl )
43d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
43e0: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c  n = strlen(pColl
43f0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4400: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
4410: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
4420: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
4430: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
4440: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
4450: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4460: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
4470: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
4480: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
4490: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20  ->aSortOrder && 
44a0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
44b0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
44c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
44d0: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
44e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
44f0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
4500: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b   pColl->zName,n+
4510: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20  1);.          i 
4520: 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  += n;.        }e
4530: 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d  lse if( i+4<nTem
4540: 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-6 ){.         
4550: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
4560: 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20  ],",nil",4);.   
4570: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
4580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4590: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b  .      zTemp[i++
45a0: 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a  ] = ')';.      z
45b0: 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  Temp[i] = 0;.   
45c0: 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65     assert( i<nTe
45d0: 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  mp );.      brea
45e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
45f0: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
4600: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
4610: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
4620: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
4630: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4640: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c  mp, zTemp, "coll
4650: 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  seq(%.20s)", pCo
4660: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
4670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4680: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
4690: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
46a0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
46b0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
46c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
46d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
46e0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
46f0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
4700: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
4710: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4720: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
4730: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4740: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4750: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
4760: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
4770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4780: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
4790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
47a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
47b0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
47c0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
47d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
47e0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
47f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4800: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4810: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
4820: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
4830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4840: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
4850: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
4860: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
4870: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
4880: 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  ( (pMem->flags &
4890: 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b   MEM_Null)==0 );
48a0: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
48b0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
48c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
48d0: 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20  = pMem->z;.     
48e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
48f0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
4900: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4910: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4920: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
4930: 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20  ", pMem->u.i);. 
4940: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
4950: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4960: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Real ){.       
4970: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4980: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4990: 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72  "%.16g", pMem->r
49a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
49b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
49c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
49d0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
49e0: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
49f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4a00: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
4a10: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20  Op->p4.pVtab;.  
4a20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4a30: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4a40: 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c  p, "vtab:%p:%p",
4a50: 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70   pVtab, pVtab->p
4a60: 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62  Module);.      b
4a70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4a80: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  if.    default: 
4a90: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
4aa0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
4ab0: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
4ac0: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
4ad0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
4ae0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
4af0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4b00: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
4b10: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
4b20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
4b30: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
4b40: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
4b50: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
4b60: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
4b70: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4b80: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
4b90: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
4ba0: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
4bb0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
4bc0: 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
4bd0: 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70  sert( i<sizeof(p
4be0: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4bf0: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4c00: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4c10: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4c20: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4c30: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4c40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4c50: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4c60: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
4c70: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4c80: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
4c90: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4ca0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4cb0: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
4cc0: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4cd0: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4ce0: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4cf0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4d00: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4d10: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4d20: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
4d30: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
4d40: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
4d50: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
4d60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4d70: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
4d80: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
4d90: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
4da0: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
4db0: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
4dc0: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
4dd0: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
4de0: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
4df0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
4e00: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
4e10: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
4e20: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
4e30: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
4e40: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
4e50: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
4e60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
4e70: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
4e80: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
4e90: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
4ea0: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
4eb0: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
4ec0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4ed0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
4ee0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
4ef0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
4f00: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
4f10: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c  y(Mem *p, int N,
4f20: 20 69 6e 74 20 66 72 65 65 62 75 66 66 65 72 73   int freebuffers
4f30: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
4f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
4f50: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
4f60: 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  int malloc_faile
4f70: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
4f80: 69 6c 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28  iled;.    while(
4f90: 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20   N-->0 ){.      
4fa0: 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70  assert( N<2 || p
4fb0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
4fc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 72 65  );.      if( fre
4fd0: 65 62 75 66 66 65 72 73 20 29 7b 0a 20 20 20 20  ebuffers ){.    
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
4ff0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
5000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
5020: 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c  mReleaseExternal
5030: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
5040: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
5050: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2b  M_Null;.      p+
5060: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  +;.    }.    db-
5070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5080: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
5090: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
50a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
50b0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74  Y_MANAGEMENT.int
50c0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
50d0: 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65 20  aseBuffers(Vdbe 
50e0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  *p){.  int ii;. 
50f0: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a   int nFree = 0;.
5100: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5110: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
5120: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5130: 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d  for(ii=1; ii<=p-
5140: 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nMem; ii++){.  
5150: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
5160: 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20  ->aMem[ii];.    
5170: 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70  if( pMem->z && p
5180: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
5190: 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  yn ){.      asse
51a0: 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20  rt( !pMem->xDel 
51b0: 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b  );.      nFree +
51c0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
51d0: 69 7a 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  ize(pMem->z);.  
51e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
51f0: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5210: 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e  urn nFree;.}.#en
5220: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
5230: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
5240: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
5250: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
5260: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
5270: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
5280: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
5290: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
52a0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
52b0: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
52c0: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
52d0: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
52e0: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
52f0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
5300: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
5310: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
5320: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
5330: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
5340: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
5350: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
5360: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
5370: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
5380: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
5390: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
53a0: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
53b0: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
53c0: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
53d0: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
53e0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
53f0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
5400: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
5410: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74  ERY PLAN..*/.int
5420: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
5430: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5450: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
5460: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5470: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
5480: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5490: 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  E_OK;.  Mem *pMe
54a0: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
54b0: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
54c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
54d0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
54e0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
54f0: 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72  AGIC_RUN ) retur
5500: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
5510: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
5520: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
5530: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
5540: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
5550: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
5560: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a  SQLITE_BUSY );..
5570: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
5580: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
5590: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
55a0: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
55b0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
55c0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
55d0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
55e0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
55f0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
5600: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
5610: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
5620: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
5630: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
5640: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
5650: 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 2c  y(pMem, p->nMem,
5660: 20 31 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20   1);..  do{.    
5670: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
5680: 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20  while( i<p->nOp 
5690: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
56a0: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
56b0: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
56c0: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
56d0: 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  nOp ){.    p->rc
56e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
56f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
5700: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
5710: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
5720: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
5730: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
5740: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
5750: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5760: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
5770: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73  g(&p->zErrMsg, s
5780: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e  qlite3ErrStr(p->
5790: 72 63 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  rc), (char*)0);.
57a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
57b0: 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  r *z;.    Op *pO
57c0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
57d0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
57e0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
57f0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5800: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
5810: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5820: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5830: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5860: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
5870: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
5880: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
5890: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
58a0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
58b0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
58c0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
58d0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
58e0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
58f0: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
5900: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5910: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
5920: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5930: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
5940: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5950: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
5960: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5970: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
5980: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ++;.    }..    p
5990: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
59a0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
59b0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
59c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
59e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
59f0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5a00: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5a10: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5a20: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5a30: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
5a40: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5a60: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
5a70: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5a80: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
5a90: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5aa0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5ab0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5ac0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
5ad0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5ae0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5b00: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
5b10: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5b20: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5b30: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
5b40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5b50: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
5b60: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
5b70: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
5b80: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5b90: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5ba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5bb0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
5bc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5bd0: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
5be0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
5bf0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
5c00: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
5c10: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
5c20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5c30: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
5c40: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
5c50: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
5c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
5c70: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5c80: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
5c90: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5ca0: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5cb0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5cc0: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  F8;.    }.    pM
5cd0: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5ce0: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
5cf0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
5d00: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5d10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
5d20: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
5d30: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   4, 0) ){.      
5d40: 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46    p->db->mallocF
5d50: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
5d60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5d70: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
5d80: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5d90: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
5da0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
5db0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
5dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
5dd0: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
5de0: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
5df0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
5e00: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
5e10: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
5e20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
5e30: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5e40: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
5e50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5e60: 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70  EBUG.      if( p
5e70: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
5e80: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
5e90: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
5ea0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
5eb0: 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a  pMem->z = pOp->z
5ec0: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
5ed0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
5ee0: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
5ef0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
5f00: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
5f10: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
5f20: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
5f30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5f40: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5f60: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
5f70: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
5f80: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
5f90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5fa0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
5fb0: 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61   8 - 5*(p->expla
5fc0: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63  in-1);.    p->rc
5fd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
5fe0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
5ff0: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
6000: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
6010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6020: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
6030: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
6040: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
6050: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
6060: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
6070: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
6080: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
6090: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
60a0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
60b0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
60c0: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  p;.  if( nOp<1 )
60d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
60e0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
60f0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
6100: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
6110: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
6120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
6130: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
6140: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
6150: 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  u8*)z) ) z++;.  
6160: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
6170: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
6180: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
6190: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
61a0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
61b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
61c0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
61d0: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
61e0: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
61f0: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
6200: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6210: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
6220: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
6230: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
6240: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
6250: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
6260: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6270: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
6280: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
6290: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
62a0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
62b0: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
62c0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
62d0: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
62e0: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
62f0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6300: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
6310: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
6320: 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28  or(i=0; isspace(
6330: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
6340: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
6350: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
6360: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6370: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
6380: 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a  d char)z[i]) ){.
6390: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
63a0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
63b0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
63c0: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
63d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
63e0: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
63f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6400: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
6410: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
6420: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
6430: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
6440: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
6450: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
6460: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
6470: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
6480: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
6490: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
64a0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
64b0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
64c0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
64d0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
64e0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
64f0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
6500: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
6510: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
6520: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
6530: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
6540: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
6550: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
6560: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
6570: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
6580: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
6590: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
65a0: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
65b0: 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20  IC_RUN..*/.void 
65c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
65d0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
6600: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
6610: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6620: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6630: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
6640: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6650: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6680: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
6690: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
66a0: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
66b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
66c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
66d0: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
66e0: 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61  */.  int isExpla
66f0: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
6700: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
6710: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
6720: 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a  rds is present *
6730: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
6740: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6750: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
6760: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
6770: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
6780: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
6790: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
67a0: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
67b0: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
67c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
67d0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
67e0: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
67f0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
6800: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
6810: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
6820: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
6830: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
6840: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
6850: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
6860: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
6870: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
6880: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
6890: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
68a0: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
68b0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
68c0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
68d0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
68e0: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
68f0: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
6900: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
6910: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
6920: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
6930: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
6940: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
6950: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
6960: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
6970: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
6980: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
6990: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43  space for.  ** C
69a0: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
69b0: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
69c0: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
69d0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
69e0: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
69f0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
6a00: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
6a10: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
6a20: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
6a30: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
6a40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6a50: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
6a60: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
6a70: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
6a80: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
6a90: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
6aa0: 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  /*.  ** Allocati
6ab0: 6f 6e 20 73 70 61 63 65 20 66 6f 72 20 72 65 67  on space for reg
6ac0: 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  isters..  */.  i
6ad0: 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b  f( p->aMem==0 ){
6ae0: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  .    int nArg;  
6af0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
6b00: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70  number of args p
6b10: 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20  assed to a user 
6b20: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
6b30: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
6b40: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20  (p, &nArg);.    
6b50: 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28  /*resizeOpArray(
6b60: 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20  p, p->nOp);*/.  
6b70: 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d    assert( nVar>=
6b80: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45  0 );.    if( isE
6b90: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
6ba0: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  0 ){.      p->nM
6bb0: 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  em = nMem = 10;.
6bc0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65      }.    p->aMe
6bd0: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
6be0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
6bf0: 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28      nMem*sizeof(
6c00: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6c10: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
6c20: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
6c30: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
6c40: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
6c50: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
6c60: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
6c70: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
6c80: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6c90: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
6ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6cb0: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  ar */.      + nC
6cc0: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
6cd0: 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20  sor*) + 1    /* 
6ce0: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
6cf0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
6d00: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6d10: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
6d20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
6d30: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
6d40: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70  .nMem */.      p
6d50: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
6d60: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
6d70: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
6d80: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56  1 */.      p->aV
6d90: 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d  ar = &p->aMem[nM
6da0: 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em+1];.      p->
6db0: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
6dc0: 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b     p->okVar = 0;
6dd0: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
6de0: 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61  = (Mem**)&p->aVa
6df0: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6e00: 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a  ->azVar = (char*
6e10: 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67  *)&p->apArg[nArg
6e20: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
6e30: 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70  r = (Cursor**)&p
6e40: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
6e50: 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20       p->nCursor 
6e60: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = nCursor;.     
6e70: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
6e80: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
6e90: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
6ea0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
6eb0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
6ec0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
6ed0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
6ee0: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
6ef0: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
6f00: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
6f10: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
6f20: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
6f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6f40: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
6f50: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
6f60: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
6f70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
6f80: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
6f90: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
6fa0: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
6fb0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6fc0: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
6fd0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
6fe0: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
6ff0: 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  t;.  p->explain 
7000: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
7010: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
7020: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
7030: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
7040: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
7050: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
7060: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
7070: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
7080: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
7090: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
70a0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
70b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
70c0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
70d0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
70e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
70f0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
7100: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
7110: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
7120: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
7130: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
7140: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
7150: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
7160: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
7170: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
7180: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
7190: 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  , Cursor *pCx){.
71a0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
71b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
71c0: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
71d0: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
71e0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
71f0: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
7200: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
7210: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
7220: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
7230: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e  ->pBt);.  }.#ifn
7240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7250: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
7260: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
7270: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
7280: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
7290: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
72a0: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
72b0: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
72c0: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
72d0: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
72e0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
72f0: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28  ethod = 1;.    (
7300: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
7310: 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20  tyOff(p->db);.  
7320: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
7330: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
7340: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
7350: 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29  3SafetyOn(p->db)
7360: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
7370: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
7380: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43 78  endif.  if( !pCx
7390: 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62  ->ephemPseudoTab
73a0: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
73b0: 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61 74  3_free(pCx->pDat
73c0: 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 6d 65 6d  a);.  }.  /* mem
73d0: 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65  set(pCx, 0, size
73e0: 6f 66 28 43 75 72 73 6f 72 29 29 3b 20 2a 2f 0a  of(Cursor)); */.
73f0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
7400: 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 20 2a  e(pCx->aType); *
7410: 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66  /.  /* sqlite3_f
7420: 72 65 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a 0a  ree(pCx); */.}..
7430: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
7440: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 66  cursors except f
7450: 6f 72 20 56 54 61 62 20 63 75 72 73 6f 72 73 20  or VTab cursors 
7460: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
7470: 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f  ly.** in use..*/
7480: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
7490: 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65  seAllCursorsExce
74a0: 70 74 41 63 74 69 76 65 56 74 61 62 73 28 56 64  ptActiveVtabs(Vd
74b0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
74c0: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d  .  if( p->apCsr=
74d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
74e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
74f0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
7500: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
7510: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66  apCsr[i];.    if
7520: 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56  ( pC && (!p->inV
7530: 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43  tabMethod || !pC
7540: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20 29  ->pVtabCursor) )
7550: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7560: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
7570: 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61   pC);.      p->a
7580: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
7590: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
75a0: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
75b0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
75c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
75d0: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
75e0: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
75f0: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
7600: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
7610: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
7620: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
7630: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
7640: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
7650: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
7660: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
7670: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
7680: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72 65  Vdbe *p, int fre
7690: 65 62 75 66 66 65 72 73 29 7b 0a 20 20 69 6e 74  ebuffers){.  int
76a0: 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75   i;.  closeAllCu
76b0: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
76c0: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72  eVtabs(p);.  for
76d0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
76e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53  ; i++){.    MemS
76f0: 65 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61  etTypeFlag(&p->a
7700: 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c  Mem[i], MEM_Null
7710: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
7720: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
7730: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 66  m[1], p->nMem, f
7740: 72 65 65 62 75 66 66 65 72 73 29 3b 0a 20 20 73  reebuffers);.  s
7750: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7760: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
7770: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
7780: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
7790: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
77a0: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
77b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
77c0: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
77d0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
77e0: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
77f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7800: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
7810: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
7820: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
7830: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
7840: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
7850: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
7860: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
7870: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
7880: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7890: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
78a0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
78b0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
78c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
78d0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
78e0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
78f0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
7900: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
7910: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
7920: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
7930: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7940: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7950: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7960: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7970: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7980: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7990: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
79a0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
79b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
79c0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
79d0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
79e0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
79f0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
7a00: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
7a10: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
7a20: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
7a30: 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20  COLNAME_N, 1);. 
7a40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
7a50: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
7a60: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
7a70: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
7a80: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
7a90: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
7aa0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
7ab0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
7ac0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62  MallocZero(p->db
7ad0: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
7ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
7af0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
7b00: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
7b10: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
7b20: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
7b30: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
7b40: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
7b50: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
7b60: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
7b70: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7b80: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
7b90: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
7ba0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7bb0: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
7bc0: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
7bd0: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
7be0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
7bf0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
7c00: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
7c10: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7c20: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
7c30: 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f  .**.** If N==P4_
7c40: 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73  STATIC  it means
7c50: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61   that zName is a
7c60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f   pointer to a co
7c70: 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a  nstant static.**
7c80: 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63   string and we c
7c90: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
7ca0: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
7cb0: 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74  is P4_DYNAMIC, t
7cc0: 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69  hen .** the stri
7cd0: 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e  ng is freed usin
7ce0: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
7cf0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
7d00: 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a  s finished with.
7d10: 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ** it. Otherwise
7d20: 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61  , N bytes of zNa
7d30: 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a  me are copied..*
7d40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7d50: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65  eSetColName(Vdbe
7d60: 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
7d70: 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61  t var, const cha
7d80: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29  r *zName, int N)
7d90: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7da0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
7db0: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
7dc0: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
7dd0: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
7de0: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
7df0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7e00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7e10: 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74  _NOMEM;.  assert
7e20: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
7e30: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
7e40: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
7e50: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
7e60: 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d  lumn]);.  if( N=
7e70: 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e  =P4_DYNAMIC || N
7e80: 3d 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20  ==P4_STATIC ){. 
7e90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
7ea0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
7eb0: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
7ec0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
7ed0: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
7ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
7f00: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
7f10: 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45  zName, N, SQLITE
7f20: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
7f30: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69  NSIENT);.  }.  i
7f40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7f50: 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49   && N==P4_DYNAMI
7f60: 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  C ){.    pColNam
7f70: 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28 7e 4d 45  e->flags &= (~ME
7f80: 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 70  M_Static);.    p
7f90: 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c 6c 6f 63  ColName->zMalloc
7fa0: 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 3b 0a   = pColName->z;.
7fb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7fc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
7fd0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
7fe0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
7ff0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
8000: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
8010: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
8020: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
8030: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
8040: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
8050: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
8060: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
8070: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
8080: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
8090: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
80a0: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
80b0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
80c0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
80d0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
80e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
80f0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
8100: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
8110: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
8120: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
8130: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
8140: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
8150: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
8160: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
8170: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
8180: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
8190: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
81a0: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
81b0: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
81c0: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
81d0: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
81e0: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
81f0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
8200: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
8210: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
8220: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8230: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
8240: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
8250: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
8260: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
8270: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
8280: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
8290: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
82a0: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
82b0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20  (db, rc);.  if( 
82c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
82d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
82e0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
82f0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
8300: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
8310: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
8320: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
8330: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
8340: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
8350: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
8360: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
8370: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
8380: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
8390: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
83a0: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
83b0: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
83c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
83d0: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
83e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
83f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
8400: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
8410: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
8420: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
8430: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
8440: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8450: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8460: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8470: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
8480: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
8490: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
84a0: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
84b0: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
84c0: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
84d0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
84e0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
84f0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
8500: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
8510: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
8520: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
8530: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
8540: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
8550: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
8560: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
8570: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8580: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8590: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
85a0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
85b0: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
85c0: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
85d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
85e0: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
85f0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
8600: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
8610: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
8620: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
8630: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
8640: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
8650: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
8660: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
8670: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
8680: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
8690: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
86a0: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
86b0: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
86c0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
86d0: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
86e0: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
86f0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
8700: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
8710: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
8720: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
8730: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
8740: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
8750: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
8760: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
8770: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
8780: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
8790: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c  */.  if( 0==strl
87a0: 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  en(sqlite3BtreeG
87b0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
87c0: 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e  Db[0].pBt)) || n
87d0: 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20  Trans<=1 ){.    
87e0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
87f0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
8800: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
8810: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
8820: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
8830: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
8840: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8850: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8860: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
8870: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8880: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
8890: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
88a0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
88b0: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
88c0: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
88d0: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
88e0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
88f0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
8900: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
8910: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
8920: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
8930: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
8940: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
8950: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
8960: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
8970: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
8980: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
8990: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
89a0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
89b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
89c0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
89d0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
89e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
89f0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8a00: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
8a10: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8a20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
8a30: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
8a40: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
8a50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
8a60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
8a80: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
8a90: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
8aa0: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
8ab0: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
8ac0: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
8ad0: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
8ae0: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
8af0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
8b00: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
8b10: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
8b20: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
8b30: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
8b40: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8b50: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
8b60: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
8b70: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
8b80: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
8b90: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
8ba0: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
8bb0: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
8bc0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
8bd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
8be0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
8bf0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
8c00: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
8c10: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
8c20: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
8c30: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
8c40: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
8c50: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
8c60: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
8c70: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
8c80: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
8c90: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
8ca0: 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20  u32 random;.    
8cb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8cc0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
8cd0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
8ce0: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
8cf0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
8d00: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
8d10: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
8d20: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
8d30: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
8d40: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
8d50: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
8d60: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8d70: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
8d90: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
8da0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8db0: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
8dc0: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
8dd0: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
8de0: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
8df0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8e00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8e10: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
8e20: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
8e30: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8e40: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
8e50: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
8e60: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
8e70: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
8e80: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
8e90: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
8ea0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
8eb0: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
8ec0: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
8ed0: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
8ee0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8ef0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8f00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f10: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
8f20: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
8f30: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
8f40: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
8f50: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
8f60: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
8f70: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
8f80: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
8f90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
8fa0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8fb0: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
8fc0: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
8fd0: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
8fe0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8ff0: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
9000: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
9010: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
9020: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
9030: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9040: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
9050: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
9060: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
9070: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
9080: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
9090: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
90a0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
90b0: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
90c0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
90d0: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
90e0: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
90f0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
9100: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
9110: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9120: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
9130: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
9140: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
9150: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
9160: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
9170: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
9180: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
9190: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
91a0: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
91b0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
91c0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
91d0: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
91e0: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
91f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
9200: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
9210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
9220: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9230: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
9240: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
9250: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
9260: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
9270: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a  trlen(zFile)+1;.
9280: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9290: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
92a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
92b0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
92c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
92d0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
92e0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
92f0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9300: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
9310: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
9320: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
9330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
9340: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
9350: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9360: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
9370: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
9380: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
9390: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
93a0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
93b0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c   */.    zMainFil
93c0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
93d0: 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61  GetDirname(db->a
93e0: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
93f0: 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20  if( (needSync . 
9400: 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69      && (0==(sqli
9410: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
9420: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
9430: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
9440: 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20  _SEQUENTIAL)).  
9450: 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65     && (rc=sqlite
9460: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
9470: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
9480: 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  MAL))!=SQLITE_OK
9490: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
94a0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
94b0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
94c0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
94d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
94e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
94f0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
9500: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9510: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
9520: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
9530: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
9540: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
9550: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
9560: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
9570: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
9580: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
9590: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
95a0: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
95b0: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
95c0: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
95d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
95e0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
95f0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
9600: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
9610: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
9620: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
9630: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9640: 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
9650: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
9660: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
9670: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9680: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
9690: 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
96a0: 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
96b0: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
96c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96d0: 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
96e0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
96f0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
9700: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
9710: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20  ilure occured.. 
9720: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
9730: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
9740: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
9750: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
9760: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9770: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9780: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9790: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
97a0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
97b0: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
97c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
97d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
97e0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
97f0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9800: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
9810: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
9820: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
9830: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9840: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
9850: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9860: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
9870: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
9880: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
9890: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
98a0: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
98b0: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
98c0: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
98d0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
98e0: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
98f0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
9900: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
9910: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
9920: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
9930: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9940: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
9950: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
9960: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
9970: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9980: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
9990: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
99a0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
99b0: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
99c0: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
99d0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
99e0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
99f0: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
9a00: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
9a10: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
9a20: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
9a30: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
9a40: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
9a50: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
9a60: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
9a70: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
9a80: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
9a90: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
9aa0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
9ab0: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
9ac0: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
9ad0: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
9ae0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
9af0: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
9b00: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
9b10: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
9b20: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
9b30: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
9b40: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
9b50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
9b60: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
9b70: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9b80: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9b90: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
9ba0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9bb0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
9bc0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
9bd0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9be0: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
9bf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9c00: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
9c10: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
9c20: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
9c30: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
9c40: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
9c50: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
9c60: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
9c70: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
9c80: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9c90: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
9ca0: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
9cb0: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
9cc0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
9cd0: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
9ce0: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
9cf0: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
9d00: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
9d10: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
9d20: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
9d30: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
9d40: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
9d50: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
9d60: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
9d70: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
9d80: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
9d90: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
9da0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
9db0: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
9dc0: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
9dd0: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
9de0: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
9df0: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
9e00: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
9e10: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
9e20: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
9e30: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
9e40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
9e50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
9e60: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
9e70: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
9e80: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
9e90: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
9ea0: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74  rt( cnt==db->act
9eb0: 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iveVdbeCnt );.}.
9ec0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
9ed0: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9ee0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
9ef0: 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65  * For every Btre
9f00: 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61  e that in databa
9f10: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
9f20: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62   which .** has b
9f30: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74  een modified, "t
9f40: 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61  rip" or invalida
9f50: 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69  te each cursor i
9f60: 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20  n.** that Btree 
9f70: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
9f80: 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74  modified so that
9f90: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
9fa0: 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  an never be used
9fb0: 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61   again.  This ha
9fc0: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c  ppens when a rol
9fd0: 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73  lback.*** occurs
9fe0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72  .  We have to tr
9ff0: 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  ip all the other
a000: 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a   cursors, even.*
a010: 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74  * cursor from ot
a020: 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65  her VMs in diffe
a030: 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f  rent database co
a040: 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f  nnections,.** so
a050: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
a060: 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  em try to use th
a070: 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20  e data at which 
a080: 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69  they.** were poi
a090: 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20  nting and which 
a0a0: 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65  now may have bee
a0b0: 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a  n changed due.**
a0c0: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
a0d0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ..**.** Remember
a0e0: 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b   that a rollback
a0f0: 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c   can delete tabl
a100: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a  es complete and.
a110: 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70  ** reorder rootp
a120: 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20  ages.  So it is 
a130: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a  not sufficient j
a140: 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74  ust to save.** t
a150: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a160: 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65  cursor.  We have
a170: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
a180: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20  he cursor.** so 
a190: 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72  that it is never
a1a0: 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a   used again..*/.
a1b0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
a1c0: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
a1d0: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71  odifiedBtrees(sq
a1e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
a1f0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a200: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a210: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
a220: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
a230: 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c      if( p && sql
a240: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a250: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ns(p) ){.      s
a260: 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
a270: 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c  llCursors(p, SQL
a280: 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
a290: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
a2a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a2b0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
a2c0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
a2d0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
a2e0: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
a2f0: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
a300: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
a310: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
a320: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
a330: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
a340: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
a350: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
a360: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a370: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
a380: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
a390: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
a3a0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
a3b0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
a3c0: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
a3d0: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
a3e0: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
a3f0: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
a400: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
a410: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
a420: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
a430: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
a440: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
a450: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
a460: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
a470: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
a480: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
a490: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
a4a0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
a4b0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
a4c0: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
a4d0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
a4e0: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
a4f0: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
a500: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
a510: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
a520: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
a530: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
a540: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
a550: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
a560: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
a570: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  end */.  int isS
a580: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
a590: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
a5a0: 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45  o true if SQLITE
a5b0: 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20  _NOMEM or IOERR 
a5c0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
a5d0: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
a5e0: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
a5f0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
a600: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
a610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
a620: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
a630: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
a640: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
a650: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
a660: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
a670: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
a680: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
a690: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
a6a0: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
a6b0: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
a6c0: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
a6d0: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
a6e0: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
a6f0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a700: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
a710: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
a720: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
a730: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
a740: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
a750: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
a760: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
a770: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
a780: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
a790: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
a7a0: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
a7b0: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
a7c0: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
a7d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
a7e0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
a7f0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
a800: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
a810: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
a820: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
a830: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
a840: 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a  ActiveVtabs(p);.
a850: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
a860: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
a870: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
a880: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
a890: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
a8a0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
a8b0: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
a8c0: 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
a8d0: 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
a8e0: 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  arted */.  if( p
a8f0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
a900: 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
a910: 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
a920: 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20  from p->rc */.. 
a930: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
a940: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
a950: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
a960: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
a970: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26  utexArrayEnter(&
a980: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20  p->aMutex);..   
a990: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
a9a0: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
a9b0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
a9c0: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
a9d0: 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
a9e0: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
a9f0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
aa00: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
aa30: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
aa40: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
aa50: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
aa60: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
aa70: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
aa80: 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  oes static analy
aa90: 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  sis of the query
aaa0: 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66   to see which of
aab0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   the.      ** fo
aac0: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61  llowing three ca
aad0: 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c  tegories it fall
aae0: 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a  s into:.      **
aaf0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
ab00: 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a  ad-only.      **
ab10: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20       Query with 
ab20: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ab30: 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  l.      **     Q
ab40: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
ab50: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
ab60: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ab70: 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d   We could do som
ab80: 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67  ething more eleg
ab90: 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74  ant than this st
aba0: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69  atic analysis (i
abb0: 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f  .e..      ** sto
abc0: 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71  re the type of q
abd0: 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20  uery as part of 
abe0: 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20  the compliation 
abf0: 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20  phase), but .   
ac00: 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d     ** handling m
ac10: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
ac20: 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c  ilure is a fairl
ac30: 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63  y obscure edge c
ac40: 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a  ase so .      **
ac50: 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c   this is probabl
ac60: 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20  y easier. Todo: 
ac70: 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f  Might be an oppo
ac80: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63  rtunity to reduc
ac90: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  e .      ** code
aca0: 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61   size a very sma
acb0: 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68  ll amount though
acc0: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
acd0: 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e     int notReadOn
ace0: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ly = 0;.      in
acf0: 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20  t isStatement = 
ad00: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
ad10: 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70  p->aOp || p->nOp
ad20: 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ==0);.      for(
ad30: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
ad40: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77  ++){ .        sw
ad50: 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e  itch( p->aOp[i].
ad60: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
ad70: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
ad80: 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20  saction:.       
ad90: 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79       notReadOnly
ada0: 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32   |= p->aOp[i].p2
adb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
adc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
add0: 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ase OP_Statement
ade0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  :.            is
adf0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20  Statement = 1;. 
ae00: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
ae10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae20: 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f    }..   .      /
ae30: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
ae40: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
ae50: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
ae60: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
ae70: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
ae80: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
ae90: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
aea0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
aeb0: 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e     if( notReadOn
aec0: 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
aed0: 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
aee0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
aef0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
af00: 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74  LOCKED && isStat
af10: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
af20: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
af30: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
af40: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
af50: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  ->rc = SQLITE_BU
af60: 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
af70: 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c  se if( (mrc==SQL
af80: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
af90: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
afa0: 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b  & isStatement ){
afb0: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
afc0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
afd0: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
afe0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aff0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
b000: 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
b010: 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
b020: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
b030: 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
b040: 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
b050: 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
b060: 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
b070: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
b080: 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
b090: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
b0a0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
b0b0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
b0c0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
b0d0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
b0e0: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
b0f0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b100: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
b110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
b120: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
b130: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
b140: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
b150: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
b160: 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20  e vdbe, then.   
b170: 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72   ** we do either
b180: 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
b190: 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
b1a0: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
b1b0: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
b1c0: 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
b1d0: 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
b1e0: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
b1f0: 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
b200: 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
b210: 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20  as occured. .   
b220: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
b230: 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  autoCommit && db
b240: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d  ->activeVdbeCnt=
b250: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
b260: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b270: 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
b280: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
b290: 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
b2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b2b0: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
b2c0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64  lag is true, and
b2d0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
b2e0: 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a  m was .        *
b2f0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  * successful or 
b300: 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
b310: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69   constraint. Thi
b320: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
b330: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20   .        ** is 
b340: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
b350: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
b360: 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
b370: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  (db);.        if
b380: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
b390: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
b3a0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
b3b0: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
b3c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
b3d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b3e0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
b3f0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
b400: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b410: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
b420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b430: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
b440: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b450: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b460: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
b470: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
b480: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
b490: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b4a0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
b4b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b4c0: 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20  else if( !xFunc 
b4d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
b4e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b4f0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
b500: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
b510: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65      if( p->opene
b520: 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  dStatement ){.  
b530: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b540: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
b550: 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  itStmt;.        
b560: 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  } .      }else i
b570: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
b580: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
b590: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b5a0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b5b0: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
b5c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
b5d0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
b5e0: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
b5f0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
b600: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
b610: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
b620: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
b630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b640: 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e   .    /* If xFun
b650: 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  c is not NULL, t
b660: 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66  hen it is one of
b670: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b680: 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20  lbackStmt or.   
b690: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
b6a0: 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c  CommitStmt. Call
b6b0: 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68   it once on each
b6c0: 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20   backend. If an 
b6d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20  error occurs.   
b6e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75   ** and the retu
b6f0: 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c  rn code is still
b700: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20   SQLITE_OK, set 
b710: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
b720: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
b730: 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20  * error value.. 
b740: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
b750: 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20  (!xFunc ||.     
b760: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
b770: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c  treeCommitStmt |
b780: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
b790: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b7a0: 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20  ackStmt.    );. 
b7b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e     for(i=0; xFun
b7c0: 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  c && i<db->nDb; 
b7d0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
b7e0: 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65   rc;.      Btree
b7f0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
b800: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
b810: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
b820: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
b830: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
b840: 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49   && (p->rc==SQLI
b850: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
b860: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b870: 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  T) ){.          
b880: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
b890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 74        sqlite3Set
b8a0: 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d  String(&p->zErrM
b8b0: 73 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  sg, 0);.        
b8c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b8d0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
b8e0: 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c  s was an INSERT,
b8f0: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
b900: 45 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 6d  E and the statem
b910: 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74 74 65  ent was committe
b920: 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  d, .    ** set t
b930: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
b940: 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
b950: 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
b960: 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  n && p->pc>=0 ){
b970: 0a 20 20 20 20 20 20 69 66 28 20 21 78 46 75 6e  .      if( !xFun
b980: 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71 6c 69  c || xFunc==sqli
b990: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
b9a0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  mt ){.        sq
b9b0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
b9c0: 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
b9d0: 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
b9e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b9f0: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
ba00: 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
ba10: 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
ba20: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 0;.    }.  . 
ba30: 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f     /* Rollback o
ba40: 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73 63 68  r commit any sch
ba50: 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68 61 74  ema changes that
ba60: 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a 20 20   occurred. */.  
ba70: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
ba80: 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e 66 6c  ITE_OK && db->fl
ba90: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
baa0: 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20  nChanges ){.    
bab0: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
bac0: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
bad0: 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66   0);.      db->f
bae0: 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  lags = (db->flag
baf0: 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s | SQLITE_Inter
bb00: 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20 20 7d  nChanges);.    }
bb10: 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65  ..    /* Release
bb20: 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20   the locks */.  
bb30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
bb40: 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26 70  texArrayLeave(&p
bb50: 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d 0a 0a  ->aMutex);.  }..
bb60: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
bb70: 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
bb80: 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
bb90: 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
bba0: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
bbb0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
bbc0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
bbd0: 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  t--;.  }.  p->ma
bbe0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
bbf0: 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
bc00: 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
bc10: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
bc20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
bc30: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
bc40: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 72  _NOMEM;.  }..  r
bc50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
bc60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
bc70: 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
bc80: 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
bc90: 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
bca0: 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
bcb0: 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
bcc0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
bcd0: 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
bce0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
bcf0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
bd00: 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
bd10: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
bd20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
bd30: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
bd40: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
bd50: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
bd60: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
bd70: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
bd80: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
bd90: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
bda0: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
bdb0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
bdc0: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
bdd0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
bde0: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
bdf0: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
be00: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
be10: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
be20: 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
be30: 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
be40: 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
be50: 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
be60: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
be70: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
be80: 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
be90: 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
bea0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
beb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
bec0: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 2c  beReset(Vdbe *p,
bed0: 20 69 6e 74 20 66 72 65 65 62 75 66 66 65 72 73   int freebuffers
bee0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
bef0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
bf00: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
bf10: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
bf20: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
bf30: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
bf40: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
bf50: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
bf60: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
bf70: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
bf80: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
bf90: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
bfa0: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
bfb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
bfc0: 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
bfd0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
bfe0: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
bff0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
c000: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
c010: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
c020: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
c030: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
c040: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
c050: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
c060: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
c070: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
c080: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
c090: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
c0a0: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
c0b0: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
c0c0: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
c0d0: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
c0e0: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
c0f0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
c100: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
c110: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
c120: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
c130: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
c140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c150: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
c160: 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73  Err,-1,p->zErrMs
c170: 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 73 71  g,SQLITE_UTF8,sq
c180: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 20  lite3_free);.   
c190: 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
c1a0: 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20 70 2d   p->rc;.      p-
c1b0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
c1c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
c1d0: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
c1e0: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
c1f0: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
c200: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
c210: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c220: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
c230: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
c240: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
c250: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
c260: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
c270: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
c280: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
c290: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
c2a0: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
c2b0: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
c2c0: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
c2d0: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
c2e0: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
c2f0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
c300: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
c310: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
c320: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c330: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
c340: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
c350: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
c360: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
c370: 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
c380: 5f 66 72 65 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  _free);.    p->z
c390: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a  ErrMsg = 0;.  }.
c3a0: 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c  .  /* Reclaim al
c3b0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
c3c0: 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20   the VDBE.  */. 
c3d0: 20 43 6c 65 61 6e 75 70 28 70 2c 20 66 72 65 65   Cleanup(p, free
c3e0: 62 75 66 66 65 72 73 29 3b 0a 0a 20 20 2f 2a 20  buffers);..  /* 
c3f0: 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
c400: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
c410: 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
c420: 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
c430: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
c440: 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
c450: 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
c460: 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
c470: 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
c480: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
c490: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
c4a0: 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
c4b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
c4c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
c4d0: 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
c4e0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
c4f0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
c500: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
c510: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  \n");.      for(
c520: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
c530: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
c540: 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25  intf(out, "%6d %
c550: 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20  10lld %8lld ",. 
c560: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
c570: 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20  [i].cnt,.       
c580: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
c590: 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cles,.          
c5a0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30   p->aOp[i].cnt>0
c5b0: 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63   ? p->aOp[i].cyc
c5c0: 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e  les/p->aOp[i].cn
c5d0: 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b  t : 0.        );
c5e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c5f0: 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c  VdbePrintOp(out,
c600: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
c610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
c620: 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
c630: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  }.  }.#endif.  p
c640: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
c650: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
c660: 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 72  aborted = 0;.  r
c670: 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
c680: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
c690: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
c6a0: 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
c6b0: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
c6c0: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
c6d0: 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
c6e0: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
c6f0: 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
c700: 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
c710: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
c720: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
c730: 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
c740: 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
c750: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c760: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
c770: 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
c780: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
c790: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
c7a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
c7b0: 65 74 28 70 2c 20 31 29 3b 0a 20 20 20 20 61 73  et(p, 1);.    as
c7c0: 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
c7d0: 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
c7e0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
c7f0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
c800: 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
c810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
c820: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  SUSE;.  }.  rele
c830: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
c840: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
c850: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
c860: 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
c870: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c880: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 65 73  .** Call the des
c890: 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 63 68  tructor for each
c8a0: 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 20 69   auxdata entry i
c8b0: 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f 72 20  n pVdbeFunc for 
c8c0: 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 6f 72  which.** the cor
c8d0: 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
c8e0: 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 2e  n mask is clear.
c8f0: 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 69 65    Auxdata entrie
c900: 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a 20 61  s beyond 31.** a
c910: 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 72 6f  re always destro
c920: 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 6f 79  yed.  To destroy
c930: 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 6e 74   all auxdata ent
c940: 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 73 0a  ries, call this.
c950: 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  ** routine with 
c960: 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64  mask==0..*/.void
c970: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
c980: 74 65 41 75 78 44 61 74 61 28 56 64 62 65 46 75  teAuxData(VdbeFu
c990: 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c 20 69  nc *pVdbeFunc, i
c9a0: 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e 74 20  nt mask){.  int 
c9b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
c9c0: 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 78 3b  pVdbeFunc->nAux;
c9d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
c9e0: 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20  t AuxData *pAux 
c9f0: 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e 61 70  = &pVdbeFunc->ap
ca00: 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Aux[i];.    if( 
ca10: 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 26  (i>31 || !(mask&
ca20: 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  (1<<i))) && pAux
ca30: 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
ca40: 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
ca50: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
ca60: 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
ca70: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
ca80: 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
ca90: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
caa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
cab0: 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
cac0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
cad0: 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
cae0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
caf0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
cb00: 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 2c 20 31  ;.  Cleanup(p, 1
cb10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
cb20: 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
cb30: 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
cb40: 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
cb50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
cb60: 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20  >pVdbe==p );.   
cb70: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 3d 20   p->db->pVdbe = 
cb80: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
cb90: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
cba0: 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
cbb0: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
cbc0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70    }.  if( p->aOp
cbd0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20   ){.    Op *pOp 
cbe0: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f  = p->aOp;.    fo
cbf0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
cc00: 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   i++, pOp++){.  
cc10: 20 20 20 20 66 72 65 65 50 34 28 70 4f 70 2d 3e      freeP4(pOp->
cc20: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
cc30: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
cc40: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71  E_DEBUG.      sq
cc50: 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70 2d 3e  lite3_free(pOp->
cc60: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
cc70: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20  f     .    }.   
cc80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
cc90: 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  >aOp);.  }.  rel
cca0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
ccb0: 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 2c 20 31  aVar, p->nVar, 1
ccc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
ccd0: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
cce0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
ccf0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
cd00: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20  &p->aMem[1]);.  
cd10: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
cd20: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
cd30: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
cd40: 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20 20  OLNAME_N, 1);.  
cd50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
cd60: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
cd70: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 53 71  ite3_free(p->zSq
cd80: 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  l);.  p->magic =
cd90: 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44   VDBE_MAGIC_DEAD
cda0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
cdb0: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  (p);.}../*.** If
cdc0: 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74   a MoveTo operat
cdd0: 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f  ion is pending o
cde0: 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  n the given curs
cdf0: 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74  or, then do that
ce00: 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20  .** MoveTo now. 
ce10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
ce20: 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f   code.  If no Mo
ce30: 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c  veTo is pending,
ce40: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
ce50: 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e   does nothing an
ce60: 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
ce70: 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
ce80: 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76  te3VdbeCursorMov
ce90: 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a  eto(Cursor *p){.
cea0: 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
ceb0: 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
cec0: 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
ced0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
cee0: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
cef0: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
cf00: 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
cf10: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
cf20: 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
cf30: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
cf40: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
cf50: 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
cf60: 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
cf70: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
cf80: 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e 70 49  n rc;.    *p->pI
cf90: 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ncrKey = 0;.    
cfa0: 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b  p->lastRowid = k
cfb0: 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74  eyToInt(p->movet
cfc0: 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d  oTarget);.    p-
cfd0: 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
cfe0: 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20  res==0;.    if( 
cff0: 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  res<0 ){.      r
d000: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d010: 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c  Next(p->pCursor,
d020: 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66   &res);.      if
d030: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d040: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
d050: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73  QLITE_TEST.    s
d060: 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
d070: 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
d080: 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
d090: 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  eto = 0;.    p->
d0a0: 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41  cacheStatus = CA
d0b0: 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 0a 20  CHE_STALE;.  }. 
d0c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d0d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
d0e0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
d0f0: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
d100: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d110: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d120: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
d130: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
d140: 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73  erialRead().** s
d150: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d160: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
d170: 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28  VdbeSerialWrite(
d180: 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
d190: 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
d1a0: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
d1b0: 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
d1c0: 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
d1d0: 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
d1e0: 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
d1f0: 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
d200: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
d210: 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
d220: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
d230: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
d240: 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
d250: 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
d260: 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
d270: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
d280: 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
d290: 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
d2a0: 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
d2b0: 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
d2c0: 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
d2d0: 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
d2e0: 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
d2f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
d300: 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
d310: 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
d320: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d330: 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
d340: 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
d350: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
d360: 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
d370: 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
d380: 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
d390: 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
d3a0: 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
d3b0: 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  seperately..**.*
d3c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d3d0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
d3e0: 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
d3f0: 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
d400: 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
d410: 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
d420: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
d430: 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
d440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
d450: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
d460: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
d470: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
d480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d490: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
d4a0: 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
d4d0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d4e0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
d500: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d510: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d520: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
d530: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
d540: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
d550: 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
d580: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
d590: 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
d5a0: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
d5b0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d5c0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
d5f0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d600: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
d620: 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
d630: 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d660: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
d670: 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
d6a0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
d6b0: 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
d6e0: 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
d6f0: 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
d700: 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
d710: 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
d720: 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
d730: 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
d740: 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
d750: 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
d760: 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
d770: 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
d780: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
d790: 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
d7a0: 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
d7b0: 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
d7c0: 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
d7d0: 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
d7e0: 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
d7f0: 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
d800: 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
d810: 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
d820: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
d830: 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
d840: 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
d850: 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
d860: 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e  ->flags;.  int n
d870: 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  ;..  if( flags&M
d880: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
d890: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
d8a0: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74  f( flags&MEM_Int
d8b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72   ){.    /* Figur
d8c0: 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f  e out whether to
d8d0: 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20   use 1, 2, 4, 6 
d8e0: 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23  or 8 bytes. */.#
d8f0: 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42     define MAX_6B
d900: 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30  YTE ((((i64)0x00
d910: 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a  008000)<<32)-1).
d920: 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d      i64 i = pMem
d930: 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75  ->u.i;.    u64 u
d940: 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66  ;.    if( file_f
d950: 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31  ormat>=4 && (i&1
d960: 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65  )==i ){.      re
d970: 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20 7d 0a  turn 8+i;.    }.
d980: 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69      u = i<0 ? -i
d990: 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20 75 3c   : i;.    if( u<
d9a0: 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b  =127 ) return 1;
d9b0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36  .    if( u<=3276
d9c0: 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  7 ) return 2;.  
d9d0: 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37    if( u<=8388607
d9e0: 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20   ) return 3;.   
d9f0: 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
da00: 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20  47 ) return 4;. 
da10: 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
da20: 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a  YTE ) return 5;.
da30: 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
da40: 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
da50: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65  M_Real ){.    re
da60: 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73  turn 7;.  }.  as
da70: 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d 45 4d  sert( flags&(MEM
da80: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
da90: 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
daa0: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
dab0: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
dac0: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20   += pMem->u.i;. 
dad0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d   }.  assert( n>=
dae0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  0 );.  return ((
daf0: 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
db00: 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
db10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
db20: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
db30: 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73   the data corres
db40: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73  ponding to the s
db50: 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74  upplied serial-t
db60: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
db70: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
db80: 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f  eLen(u32 serial_
db90: 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72  type){.  if( ser
dba0: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
dbb0: 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
dbc0: 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
dbd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74   }else{.    stat
dbe0: 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a  ic const u8 aSiz
dbf0: 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c  e[] = { 0, 1, 2,
dc00: 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20   3, 4, 6, 8, 8, 
dc10: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
dc20: 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73    return aSize[s
dc30: 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d  erial_type];.  }
dc40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20  .}../*.** If we 
dc50: 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74  are on an archit
dc60: 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65  ecture with mixe
dc70: 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e  d-endian floatin
dc80: 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78  g .** points (ex
dc90: 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61  : ARM7) then swa
dca0: 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79  p the lower 4 by
dcb0: 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  tes with the .**
dcc0: 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20   upper 4 bytes. 
dcd0: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
dce0: 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f  lt..**.** For mo
dcf0: 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73  st architectures
dd00: 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
dd10: 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29  p..**.** (later)
dd20: 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  :  It is reporte
dd30: 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65  d to me that the
dd40: 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72   mixed-endian pr
dd50: 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37  oblem.** on ARM7
dd60: 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74   is an issue wit
dd70: 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20  h GCC, not with 
dd80: 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20  the ARM7 chip.  
dd90: 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74  It seems.** that
dda0: 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20   early versions 
ddb0: 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68  of GCC stored th
ddc0: 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61  e two words of a
ddd0: 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74   64-bit.** float
dde0: 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72   in the wrong or
ddf0: 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65  der.  And that e
de00: 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72  rror has been pr
de10: 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72  opagated.** ever
de20: 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61   since.  The bla
de30: 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  me is not necess
de40: 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20  arily with GCC, 
de50: 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d  though..** GCC m
de60: 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63  ight have just c
de70: 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  opying the probl
de80: 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20  em from a prior 
de90: 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61  compiler..** I a
dea0: 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74  m also told that
deb0: 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20   newer versions 
dec0: 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c  of GCC that foll
ded0: 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ow a different.*
dee0: 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79  * ABI get the by
def0: 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a  te order right..
df00: 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73  **.** Developers
df10: 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e   using SQLite on
df20: 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20   an ARM7 should 
df30: 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20  compile and run 
df40: 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61  their.** applica
df50: 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c  tion using -DSQL
df60: 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c  ITE_DEBUG=1 at l
df70: 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68  east once.  With
df80: 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65   DEBUG.** enable
df90: 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20  d, some asserts 
dfa0: 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72  below will ensur
dfb0: 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20  e that the byte 
dfc0: 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61  order of.** floa
dfd0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
dfe0: 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a  s is correct..**
dff0: 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29  .** (2007-08-30)
e000: 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74    Frank van Vugt
e010: 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69   has studied thi
e020: 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c  s problem closel
e030: 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e  y.** and has sen
e040: 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74  d his findings t
e050: 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76  o the SQLite dev
e060: 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a  elopers.  Frank.
e070: 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73  ** writes that s
e080: 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c  ome Linux kernel
e090: 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67  s offer floating
e0a0: 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a   point hardware.
e0b0: 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61  ** emulation tha
e0c0: 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62  t uses only 32-b
e0d0: 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73  it mantissas ins
e0e0: 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a  tead of a full .
e0f0: 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65  ** 48-bits as re
e100: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45  quired by the IE
e110: 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54  EE standard.  (T
e120: 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f  his is the.** CO
e130: 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45  NFIG_FPE_FASTFPE
e140: 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75   option.)  On su
e150: 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61  ch systems, floa
e160: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79  ting point.** by
e170: 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f  te swapping beco
e180: 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63  mes very complic
e190: 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20  ated.  To avoid 
e1a0: 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65  problems,.** the
e1b0: 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20   necessary byte 
e1c0: 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72  swapping is carr
e1d0: 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20  ied out using a 
e1e0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a  64-bit integer.*
e1f0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  * rather than a 
e200: 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46  64-bit float.  F
e210: 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20  rank assures us 
e220: 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65  that the code he
e230: 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20  re.** works for 
e240: 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65  him.  We, the de
e250: 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e  velopers, have n
e260: 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e  o way to indepen
e270: 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79  dently.** verify
e280: 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b   this, but Frank
e290: 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77   seems to know w
e2a0: 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e  hat he is talkin
e2b0: 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65  g about.** so we
e2c0: 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23   trust him..*/.#
e2d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58  ifdef SQLITE_MIX
e2e0: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
e2f0: 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34  FLOAT.static u64
e300: 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69   floatSwap(u64 i
e310: 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20  n){.  union {.  
e320: 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32    u64 r;.    u32
e330: 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20   i[2];.  } u;.  
e340: 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20  u32 t;..  u.r = 
e350: 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d  in;.  t = u.i[0]
e360: 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69  ;.  u.i[0] = u.i
e370: 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20  [1];.  u.i[1] = 
e380: 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b  t;.  return u.r;
e390: 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  .}.# define swap
e3a0: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e3b0: 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77  (X)  X = floatSw
e3c0: 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  ap(X).#else.# de
e3d0: 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
e3e0: 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e  dianFloat(X).#en
e3f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
e400: 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20   the serialized 
e410: 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68  data blob for th
e420: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
e430: 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20  n pMem into .** 
e440: 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d  buf. It is assum
e450: 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
e460: 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64  er has allocated
e470: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
e480: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
e490: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
e4a0: 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20   written..**.** 
e4b0: 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75  nBuf is the amou
e4c0: 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74  nt of space left
e4d0: 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66   in buf[].  nBuf
e4e0: 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a   must always be.
e4f0: 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
e500: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69  to hold the enti
e510: 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70  re field.  Excep
e520: 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c 64 20  t, if the field 
e530: 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74  is.** a blob wit
e540: 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  h a zero-filled 
e550: 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d  tail, then buf[]
e560: 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74 20 74   might be just t
e570: 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65  he right.** size
e580: 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68   to hold everyth
e590: 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72 20 74  ing except for t
e5a0: 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
e5b0: 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a  ail.  If buf[].*
e5c0: 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e  * is only big en
e5d0: 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
e5e0: 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78   non-zero prefix
e5f0: 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
e600: 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78  e that.** prefix
e610: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75   into buf[].  Bu
e620: 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61  t if buf[] is la
e630: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
e640: 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70  ld both the.** p
e650: 72 65 66 69 78 20 61 6e 64 20 74 68 65 20 74 61  refix and the ta
e660: 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  il then write th
e670: 65 20 70 72 65 66 69 78 20 61 6e 64 20 73 65 74  e prefix and set
e680: 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c   the tail to all
e690: 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a  .** zeros..**.**
e6a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
e6b0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
e6c0: 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
e6d0: 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
e6e0: 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
e6f0: 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
e700: 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
e710: 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
e720: 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
e730: 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
e740: 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
e750: 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  uf[]..*/ .int sq
e760: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
e770: 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20  ut(u8 *buf, int 
e780: 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  nBuf, Mem *pMem,
e790: 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
e7a0: 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  ){.  u32 serial_
e7b0: 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64  type = sqlite3Vd
e7c0: 62 65 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65  beSerialType(pMe
e7d0: 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b  m, file_format);
e7e0: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f  .  int len;..  /
e7f0: 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
e800: 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
e810: 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
e820: 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
e830: 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e     u64 v;.    in
e840: 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  t i;.    if( ser
e850: 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
e860: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
e870: 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
e880: 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20  Mem->r) );.     
e890: 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65   memcpy(&v, &pMe
e8a0: 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  m->r, sizeof(v))
e8b0: 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
e8c0: 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
e8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e8e0: 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
e8f0: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
e900: 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   i = sqlite3Vdbe
e910: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
e920: 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
e930: 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75  assert( len<=nBu
e940: 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  f );.    while( 
e950: 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66  i-- ){.      buf
e960: 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a  [i] = (v&0xFF);.
e970: 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
e980: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e990: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  len;.  }..  /* S
e9a0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f  tring or blob */
e9b0: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
e9c0: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73  pe>=12 ){.    as
e9d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20  sert( pMem->n + 
e9e0: 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ((pMem->flags & 
e9f0: 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e  MEM_Zero)?pMem->
ea00: 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20  u.i:0).         
ea10: 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64      == sqlite3Vd
ea20: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
ea30: 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a  serial_type) );.
ea40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
ea50: 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  ->n<=nBuf );.   
ea60: 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
ea70: 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20      memcpy(buf, 
ea80: 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
ea90: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61     if( pMem->fla
eaa0: 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
eab0: 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d  .      len += pM
eac0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69  em->u.i;.      i
ead0: 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20  f( len>nBuf ){. 
eae0: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75         len = nBu
eaf0: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
eb00: 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
eb10: 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
eb20: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
eb30: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
eb40: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
eb50: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
eb60: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
eb70: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
eb80: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
eb90: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
eba0: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
ebb0: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
ebc0: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
ebd0: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
ebe0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
ebf0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
ec00: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
ec10: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
ec20: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
ec30: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
ec40: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
ec50: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
ec60: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
ec70: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
ec80: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
ec90: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
eca0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
ecd0: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
ece0: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
ecf0: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
ed00: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
ed10: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
ed20: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
ed30: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
ed40: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
ed50: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
ed60: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
ed70: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
ed80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ed90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
eda0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
edb0: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
edc0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
edd0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
ede0: 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
edf0: 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
ee00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ee10: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
ee20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ee30: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
ee40: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
ee50: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
ee60: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
ee70: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
ee80: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
ee90: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
eea0: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
eeb0: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
eec0: 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
eed0: 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
eee0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
eef0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
ef00: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
ef10: 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
ef20: 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
ef30: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
ef40: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ef50: 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
ef60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
ef70: 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
ef80: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
ef90: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
efa0: 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
efb0: 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
efc0: 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
efd0: 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
efe0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
eff0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
f000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f010: 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
f020: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
f030: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
f040: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
f050: 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
f060: 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
f070: 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
f080: 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
f090: 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
f0a0: 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
f0b0: 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
f0c0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f0d0: 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
f0e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f0f0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
f100: 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
f110: 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
f120: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
f130: 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
f140: 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
f150: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
f160: 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
f170: 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
f180: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
f190: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f1a0: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
f1b0: 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
f1c0: 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
f1d0: 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
f1e0: 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
f1f0: 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
f200: 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
f210: 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
f220: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
f230: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
f240: 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
f250: 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
f260: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
f270: 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
f280: 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
f290: 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
f2a0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
f2b0: 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
f2c0: 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
f2d0: 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
f2e0: 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
f2f0: 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
f300: 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
f310: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
f320: 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
f330: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
f340: 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
f350: 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
f360: 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
f370: 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
f380: 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
f390: 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
f3a0: 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
f3b0: 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
f3c0: 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
f3d0: 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
f3e0: 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
f3f0: 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
f400: 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
f410: 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
f420: 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
f430: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
f440: 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
f450: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f460: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
f470: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
f480: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
f490: 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
f4a0: 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
f4b0: 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
f4c0: 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
f4d0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
f4e0: 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
f4f0: 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
f500: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
f510: 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
f520: 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
f530: 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
f540: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
f550: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f560: 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
f570: 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
f580: 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
f590: 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
f5a0: 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
f5b0: 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
f5c0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
f5d0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
f5e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
f5f0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
f600: 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
f610: 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
f620: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
f630: 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
f640: 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
f650: 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
f660: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
f670: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
f680: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f690: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
f6a0: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
f6b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6c0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f6d0: 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
f6e0: 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
f6f0: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
f700: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
f710: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
f720: 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
f730: 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
f740: 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
f750: 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  [], parse the.**
f760: 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55   record into a U
f770: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
f780: 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
f790: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
f7a0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e   that structure.
f7b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
f7c0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68  ng function migh
f7d0: 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63  t provide szSpac
f7e0: 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  e bytes of memor
f7f0: 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53  y.** space at pS
f800: 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63  pace.  This spac
f810: 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
f820: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
f830: 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64  ed.** VDbeParsed
f840: 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
f850: 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   if it is large 
f860: 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69  enough.  If it i
f870: 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f  s.** not big eno
f880: 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62  ugh, space is ob
f890: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
f8a0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
f8b0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
f8c0: 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
f8d0: 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61  d be closed by a
f8e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
f8f0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
f900: 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a  ackedRecord()..*
f910: 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  / .UnpackedRecor
f920: 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65  d *sqlite3VdbeRe
f930: 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
f940: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
f950: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
f960: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
f970: 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
f980: 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
f990: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
f9a0: 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
f9b0: 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
f9c0: 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
f9d0: 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
f9e0: 65 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69 64 20  ecord */.  void 
f9f0: 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
fa00: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
fa10: 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73  able to hold res
fa20: 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f  ulting object */
fa30: 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20  .  int szSpace  
fa40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fa50: 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
fa60: 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   bytes */.){.  c
fa70: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
fa80: 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
fa90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
faa0: 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b  *)pKey;.  Unpack
fab0: 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69  edRecord *p;.  i
fac0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
fad0: 69 2c 20 69 64 78 2c 20 64 3b 0a 20 20 75 33 32  i, idx, d;.  u32
fae0: 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
faf0: 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  Mem;.  .  assert
fb00: 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69  ( sizeof(Mem)>si
fb10: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42  zeof(*p) );.  nB
fb20: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d  yte = sizeof(Mem
fb30: 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
fb40: 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42  eld+2);.  if( nB
fb50: 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
fb60: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
fb70: 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
fb80: 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
fb90: 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
fba0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
fbb0: 6e 65 65 64 46 72 65 65 20 3d 20 31 3b 0a 20 20  needFree = 1;.  
fbc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 70  }else{.    p = p
fbd0: 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 6e 65  Space;.    p->ne
fbe0: 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  edFree = 0;.  }.
fbf0: 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
fc00: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
fc10: 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
fc20: 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
fc30: 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f 79 20 3d  p->needDestroy =
fc40: 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   1;.  p->aMem = 
fc50: 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29 70  pMem = &((Mem*)p
fc60: 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67 65  )[1];.  idx = ge
fc70: 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
fc80: 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
fc90: 48 64 72 3b 0a 20 20 69 20 3d 20 30 3b 0a 20 20  Hdr;.  i = 0;.  
fca0: 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
fcb0: 20 26 26 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 20   && i<p->nField 
fcc0: 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  ){.    u32 seria
fcd0: 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78  l_type;..    idx
fce0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
fcf0: 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72 69 61   aKey+idx, seria
fd00: 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28  l_type);.    if(
fd10: 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69   d>=nKey && sqli
fd20: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
fd30: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
fd40: 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  )>0 ) break;.   
fd50: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
fd60: 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
fd70: 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
fd80: 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65  nfo->db;.    pMe
fd90: 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  m->flags = 0;.  
fda0: 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20    pMem->zMalloc 
fdb0: 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
fdc0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
fdd0: 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
fde0: 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
fdf0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
fe00: 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   i++;.  }.  p->n
fe10: 46 69 65 6c 64 20 3d 20 69 3b 0a 20 20 72 65 74  Field = i;.  ret
fe20: 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a  urn (void*)p;.}.
fe30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
fe40: 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55  ine destroys a U
fe50: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62  npackedRecord ob
fe60: 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
fe70: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
fe80: 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70  packedRecord(Unp
fe90: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
fea0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
feb0: 69 66 28 20 70 2d 3e 6e 65 65 64 44 65 73 74 72  if( p->needDestr
fec0: 6f 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  oy ){.      int 
fed0: 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d  i;.      Mem *pM
fee0: 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  em;.      for(i=
fef0: 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65 6d 3b  0, pMem=p->aMem;
ff00: 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b   i<p->nField; i+
ff10: 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20 20  +, pMem++){.    
ff20: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d      if( pMem->zM
ff30: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
ff40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
ff50: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
ff60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ff70: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
ff80: 70 2d 3e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  p->needFree ){. 
ff90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ffa0: 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e(p);.    }.  }.
ffb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
ffc0: 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
ffd0: 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
ffe0: 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
fff0: 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
10000 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
10010 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
10020 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
10030 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
10040 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
10050 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b  er if {nKey1, pK
10060 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61  ey1} is less tha
10070 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
10080 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
10090 70 50 4b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  pPKey2.  The {nK
100a0 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
100b0 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
100c0 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20  * created by th 
100d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
100e0 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
100f0 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
10100 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
10110 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
10120 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
10130 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
10140 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
10150 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64   Key1 and Key2 d
10160 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f  o not have to co
10170 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e  ntain the same n
10180 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e  umber of fields.
10190 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 6c  .** But if the l
101a0 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c 20 4b  engths differ, K
101b0 65 79 32 20 6d 75 73 74 20 62 65 20 74 68 65 20  ey2 must be the 
101c0 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65 20 74  shorter of the t
101d0 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69 73 74 6f 72  wo..**.** Histor
101e0 69 63 61 6c 20 6e 6f 74 65 3a 20 49 6e 20 65 61  ical note: In ea
101f0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
10200 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  f this routine b
10210 6f 74 68 20 4b 65 79 31 0a 2a 2a 20 61 6e 64 20  oth Key1.** and 
10220 4b 65 79 32 20 77 65 72 65 20 62 6c 6f 62 73 20  Key2 were blobs 
10230 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 4f 50  obtained from OP
10240 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20 42 75  _MakeRecord.  Bu
10250 74 20 77 65 20 66 6f 75 6e 64 0a 2a 2a 20 74 68  t we found.** th
10260 61 74 20 69 6e 20 74 79 70 69 63 61 6c 20 75 73  at in typical us
10270 65 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32 20  e the same Key2 
10280 77 6f 75 6c 64 20 62 65 20 73 75 62 6d 69 74 74  would be submitt
10290 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
102a0 73 0a 2a 2a 20 69 6e 20 61 20 72 6f 77 2e 20 20  s.** in a row.  
102b0 53 6f 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  So an optimizati
102c0 6f 6e 20 77 61 73 20 61 64 64 65 64 20 74 6f 20  on was added to 
102d0 70 61 72 73 65 20 74 68 65 20 4b 65 79 32 20 6b  parse the Key2 k
102e0 65 79 0a 2a 2a 20 73 65 70 61 72 61 74 65 6c 79  ey.** separately
102f0 20 61 6e 64 20 73 75 62 6d 69 74 20 74 68 65 20   and submit the 
10300 70 61 72 73 65 64 20 76 65 72 73 69 6f 6e 2e 20  parsed version. 
10310 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 77 65   In this way, we
10320 20 61 76 6f 69 64 0a 2a 2a 20 70 61 72 73 69 6e   avoid.** parsin
10330 67 20 74 68 65 20 73 61 6d 65 20 4b 65 79 32 20  g the same Key2 
10340 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 69  multiple times i
10350 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a 69 6e 74 20  n a row..*/.int 
10360 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
10370 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
10380 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
10390 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 55 6e 70  d *pKey1, .  Unp
103a0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
103b0 65 79 32 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b  ey2.){.  u32 d1;
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
103d0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
103e0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
103f0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
10400 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
10410 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
10420 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
10430 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
10440 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
10450 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10460 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
10470 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
10480 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20  .  int nField;. 
10490 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
104a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
104b0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
104c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
104d0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
104e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
104f0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
10500 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
10510 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d  >pKeyInfo;.  mem
10520 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
10530 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62  ->enc;.  mem1.db
10540 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
10550 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  .  mem1.flags = 
10560 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  0;.  mem1.zMallo
10570 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64 78 31  c = 0;.  .  idx1
10580 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
10590 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
105a0 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20   d1 = szHdr1;.  
105b0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
105c0 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69  o->nField;.  whi
105d0 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
105e0 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
105f0 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73  eld ){.    u32 s
10600 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
10610 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
10620 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
10630 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
10640 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
10650 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
10660 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
10670 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
10680 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  1 );.    if( d1>
10690 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69 74 65  =nKey1 && sqlite
106a0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
106b0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
106c0 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  >0 ) break;..   
106d0 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
106e0 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d  values to be com
106f0 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  pared..    */.  
10700 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
10710 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
10720 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
10730 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a  type1, &mem1);..
10740 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
10750 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a  mparison.    */.
10760 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10770 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31  MemCompare(&mem1
10780 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  , &pPKey2->aMem[
10790 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
107a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
107b0 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e  <nField ? pKeyIn
107c0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30  fo->aColl[i] : 0
107d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  );.    if( rc!=0
107e0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
107f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a  .    }.    i++;.
10800 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31 2e 7a    }.  if( mem1.z
10810 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
10820 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
10830 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 65  mem1);..  /* One
10840 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
10850 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 2c 20   out of fields, 
10860 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69 65 6c  but all the fiel
10870 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
10880 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20 65 71  int.  ** were eq
10890 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e 63 72  ual. If the incr
108a0 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  Key flag is true
108b0 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e  , then the secon
108c0 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20 74 72  d key is.  ** tr
108d0 65 61 74 65 64 20 61 73 20 6c 61 72 67 65 72 2e  eated as larger.
108e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
108f0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 4b 65  0 ){.    if( pKe
10900 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29  yInfo->incrKey )
10910 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
10920 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
10930 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66 69 78  pKeyInfo->prefix
10940 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20 20 20  IsEqual ){.     
10950 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20 29 7b   if( d1<nKey1 ){
10960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
10970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10980 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
10990 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
109a0 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e  && i<pKeyInfo->n
109b0 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20 20  Field.          
109c0 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66 6f       && pKeyInfo
109d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
109e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63 3b  ){.    rc = -rc;
109f0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
10a00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
10a10 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 69  argument is an i
10a20 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d 70 6f  ndex entry compo
10a30 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  sed using the OP
10a40 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
10a50 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20  de..** The last 
10a60 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 72 65  entry in this re
10a70 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 61  cord should be a
10a80 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 63 69  n integer (speci
10a90 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 69 6e  fically.** an in
10aa0 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 20 54  teger rowid).  T
10ab0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
10ac0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
10ad0 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 74 68  f bytes in.** th
10ae0 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  at integer..*/.i
10af0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
10b00 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73 74 20  xRowidLen(const 
10b10 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
10b20 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
10b30 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
10b40 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
10b50 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
10b60 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
10b70 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 28 76  e rowid */..  (v
10b80 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
10b90 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
10ba0 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
10bb0 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d  2(&aKey[szHdr-1]
10bc0 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
10bd0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
10be0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10bf0 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20  typeRowid);.}.  
10c00 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
10c10 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
10c20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
10c30 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
10c40 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
10c50 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
10c60 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
10c70 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
10c80 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
10c90 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
10ca0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
10cb0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
10cc0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
10cd0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
10ce0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
10cf0 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  xRowid(BtCursor 
10d00 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
10d10 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
10d20 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
10d30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
10d40 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10d50 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
10d60 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
10d70 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
10d80 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
10d90 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
10da0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
10db0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
10dc0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c  Mem m, v;..  sql
10dd0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
10de0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
10df0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  );.  if( nCellKe
10e00 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  y<=0 ){.    retu
10e10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10e20 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e  T_BKPT;.  }.  m.
10e30 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64  flags = 0;.  m.d
10e40 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  b = 0;.  m.zMall
10e50 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
10e60 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
10e70 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
10e80 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
10e90 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
10ea0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
10eb0 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
10ec0 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
10ed0 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67  zHdr);.  (void)g
10ee0 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
10ef0 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
10f00 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e  ypeRowid);.  len
10f10 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56  Rowid = sqlite3V
10f20 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
10f30 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73  (typeRowid);.  s
10f40 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10f50 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
10f60 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
10f70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
10f80 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
10f90 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
10fa0 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
10fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
10fd0 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
10fe0 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
10ff0 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
11000 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  int to against.*
11010 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
11020 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e   in pKey (of len
11030 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74  gth nKey).  Writ
11040 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
11050 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
11060 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
11070 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
11080 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
11090 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
110a0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b   greater than pK
110b0 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ey.  Return SQLI
110c0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
110d0 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20  ..**.** pKey is 
110e0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77  either created w
110f0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f  ithout a rowid o
11100 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73  r is truncated s
11110 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69  o that it.** omi
11120 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20  ts the rowid at 
11130 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f  the end.  The ro
11140 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  wid at the end o
11150 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
11160 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20  y.** is ignored 
11170 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  as well..*/.int 
11180 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
11190 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73  yCompare(.  Curs
111a0 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
111b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
111c0 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65  ursor to compare
111d0 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e   against */.  Un
111e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55  packedRecord *pU
111f0 6e 70 61 63 6b 65 64 2c 0a 20 20 69 6e 74 20 6e  npacked,.  int n
11200 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  Key, const u8 *p
11210 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b 65  Key,   /* The ke
11220 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  y to compare */.
11230 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11250 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
11260 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
11270 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
11280 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
11290 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
112a0 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
112b0 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52  rsor;.  int lenR
112c0 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 20  owid;.  Mem m;. 
112d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
112e0 2a 70 52 65 63 3b 0a 20 20 63 68 61 72 20 7a 53  *pRec;.  char zS
112f0 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 73 71  pace[200];..  sq
11300 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
11310 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
11320 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b  y);.  if( nCellK
11330 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 65  ey<=0 ){.    *re
11340 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
11350 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
11360 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d  .  m.db = 0;.  m
11370 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
11380 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72  zMalloc = 0;.  r
11390 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
113a0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
113b0 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43 65 6c  pCursor, 0, nCel
113c0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
113d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
113e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6c  turn rc;.  }.  l
113f0 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
11400 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
11410 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20 69 66  ((u8*)m.z);.  if
11420 28 20 21 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a  ( !pUnpacked ){.
11430 20 20 20 20 70 52 65 63 20 3d 20 73 71 6c 69 74      pRec = sqlit
11440 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
11450 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c  ck(pC->pKeyInfo,
11460 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20   nKey, pKey,.   
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 70               zSp
11490 61 63 65 2c 20 73 69 7a 65 6f 66 28 7a 53 70 61  ace, sizeof(zSpa
114a0 63 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ce));.  }else{. 
114b0 20 20 20 70 52 65 63 20 3d 20 70 55 6e 70 61 63     pRec = pUnpac
114c0 6b 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ked;.  }.  if( p
114d0 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Rec==0 ){.    re
114e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
114f0 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  M;.  }.  *res = 
11500 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11510 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c 65 6e  dCompare(m.n-len
11520 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 70 52 65 63  Rowid, m.z, pRec
11530 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70 61 63  );.  if( !pUnpac
11540 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ked ){.    sqlit
11550 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
11560 63 6b 65 64 52 65 63 6f 72 64 28 70 52 65 63 29  ckedRecord(pRec)
11570 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
11580 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
11590 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
115a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
115b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
115c0 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
115d0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
115e0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
115f0 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
11600 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
11610 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
11620 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
11630 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
11640 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
11650 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
11660 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11670 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
11680 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
11690 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
116a0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
116b0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
116c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
116d0 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
116e0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
116f0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
11700 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
11710 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
11720 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11730 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
11740 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
11750 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
11760 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
11770 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
11780 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
11790 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
117a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
117b0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
117c0 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
117d0 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
117e0 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
117f0 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
11800 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
11810 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
11820 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
11830 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
11840 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
11850 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
11860 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
11870 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
11880 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
11890 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
118a0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
118b0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
118c0 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
118d0 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
118e0 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
118f0 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
11900 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
11910 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
11920 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
11930 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
11940 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
11950 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
11960 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
11970 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
11980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
11990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
119a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
119b0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
119c0 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
119d0 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
119e0 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.