/ Hex Artifact Content
Login

Artifact 8ca1189489e4e415e39e5a3a1dd3dfa57b1294bb:


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 34 20 32  eaux.c,v 1.384 2
02c0: 30 30 38 2f 30 36 2f 30 35 20 31 31 3a 33 39 3a  008/06/05 11:39:
02d0: 31 31 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  11 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 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1c80: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
1c90: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1ca0: 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p5;.    }else i
1cb0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67  f( opcode==OP_Ag
1cc0: 67 53 74 65 70 20 0a 23 69 66 6e 64 65 66 20 53  gStep .#ifndef S
1cd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ce0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1cf0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
1d00: 70 64 61 74 65 0a 23 65 6e 64 69 66 0a 20 20 20  pdate.#endif.   
1d10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1d20: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
1d30: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1d40: 3e 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  >p2;.    }.    i
1d50: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  f( opcode==OP_Ha
1d60: 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  lt ){.      if( 
1d70: 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f  pOp->p1==SQLITE_
1d80: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
1d90: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  p->p2==OE_Abort 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53  ){.        doesS
1db0: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1dc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1de0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
1df0: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61   ){.      hasSta
1e00: 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b  tementBegin = 1;
1e10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1e20: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
1e30: 79 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  y ){.      doesS
1e40: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1e50: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
1e60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e70: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
1e80: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1e90: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
1ea0: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b  e==OP_VRename ){
1eb0: 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65  .      doesState
1ec0: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1ed0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ee0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74  opcode==OP_VFilt
1ef0: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
1f00: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1f10: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
1f20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f30: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
1f40: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
1f50: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
1f60: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ].p1;.      if( 
1f70: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
1f80: 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69  xArgs = n;.#endi
1f90: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  f.    }..    if(
1fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f   sqlite3VdbeOpco
1fb0: 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70  deHasProperty(op
1fc0: 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50  code, OPFLG_JUMP
1fd0: 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  ) && pOp->p2<0 )
1fe0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ff0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
2000: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f  abel );.      pO
2010: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
2020: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  1-pOp->p2];.    
2030: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
2040: 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  free(p->aLabel);
2050: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
2060: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2070: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a  gs = nMaxArgs;..
2080: 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72    /* If we never
2090: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   rollback a stat
20a0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
20b0: 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e  n, then statemen
20c0: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
20d0: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ons are not need
20e0: 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65  ed.  So change e
20f0: 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e  very OP_Statemen
2100: 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e  t.  ** opcode in
2110: 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20  to an OP_Noop.  
2120: 54 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c  This avoid a cal
2130: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2140: 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20  enExclusive().  
2150: 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ** which can be 
2160: 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d  expensive on som
2170: 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a  e platforms..  *
2180: 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65  /.  if( hasState
2190: 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f  mentBegin && !do
21a0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
21b0: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ack ){.    for(p
21c0: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
21d0: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
21e0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
21f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2200: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
2210: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2220: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2230: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2250: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2260: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2270: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
2280: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
2290: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
22a0: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
22b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
22c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
22d0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
22e0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
22f0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
2300: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
2310: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2320: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2330: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2340: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2350: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
2360: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
2370: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
2380: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
2390: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
23a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
23b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
23c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
23d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
23e0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
23f0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69  lloc ){.    resi
2400: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
2410: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
2420: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
2430: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
2440: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b   assert( p->nOp+
2450: 6e 4f 70 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  nOp<=p->nOpAlloc
2460: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
2470: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20  cFailed );.  }. 
2480: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
2490: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
24b0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
24c0: 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20   if( nOp>0 ){.  
24d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
24e0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
24f0: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
2500: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
2510: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
2520: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
2530: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
2540: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
2550: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
2560: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
2570: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
2580: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
2590: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
25a0: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
25b0: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
25c0: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
25d0: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
25e0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
25f0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
2600: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
2610: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
2620: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
2630: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
2640: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
2650: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
2660: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
2670: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
2680: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
2690: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
26a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
26b0: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
26c0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
26d0: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
26e0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
26f0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2700: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2710: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2720: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2730: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2740: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2750: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2760: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2770: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2780: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2790: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
27a0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
27b0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
27c0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
27d0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
27e0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
27f0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2800: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2810: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2820: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2830: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2840: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2850: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2860: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2870: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2880: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2890: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
28a0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
28b0: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
28c0: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
28d0: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
28e0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
28f0: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
2900: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2910: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2920: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
2930: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2940: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2950: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2960: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
2970: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
2980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2990: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
29a0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
29b0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
29c0: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
29d0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
29e0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
29f0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2a00: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2a10: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2a20: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
2a30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2a40: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2a50: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
2a60: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2a80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2a90: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
2aa0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2ab0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2ac0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2ad0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2ae0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2af0: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2b00: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2b10: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2b20: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2b40: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b50: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2b60: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2b70: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2b80: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2b90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2ba0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2bb0: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2bc0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
2bd0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2be0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2bf0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2c00: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
2c10: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70   );.    p->aOp[p
2c20: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61  ->nOp-1].p5 = va
2c30: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2c40: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
2c50: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2c60: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2c70: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2c80: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2c90: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2ca0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2cb0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2cc0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
2cd0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2ce0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2cf0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
2d00: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
2d10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
2d20: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
2d30: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
2d40: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
2d50: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
2d60: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
2d70: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
2d80: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2d90: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
2da0: 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65  lFunction(FuncDe
2db0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2dc0: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2dd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2de0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e00: 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDef);.  }.}../
2e10: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2e20: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2e30: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2e40: 6f 69 64 20 66 72 65 65 50 34 28 69 6e 74 20 70  oid freeP4(int p
2e50: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29  4type, void *p3)
2e60: 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20  {.  if( p3 ){.  
2e70: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
2e80: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
2e90: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
2ea0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
2eb0: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
2ec0: 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  TF:.      case P
2ed0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
2ee0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
2ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2f00: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
2f10: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2f20: 65 33 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20  e3_free(p3);.   
2f30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f40: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
2f50: 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  4_VDBEFUNC: {.  
2f60: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2f70: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2f80: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2f90: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
2fa0: 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46  lFunction(pVdbeF
2fb0: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
2fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56  DeleteAuxData(pV
2fe0: 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20  dbeFunc, 0);.   
2ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3000: 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  e(pVdbeFunc);.  
3010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3020: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3030: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
3040: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3050: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e  ralFunction((Fun
3060: 63 44 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20  cDef*)p3);.     
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3080: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3090: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
30a0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
30b0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
30c0: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
30d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30e0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
30f0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
3100: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
3110: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
3120: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3130: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
3140: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3150: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
3160: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
3170: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
3180: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3190: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
31a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 70 4f 70        freeP4(pOp
31b0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
31c0: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
31d0: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
31e0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
31f0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
3200: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
3210: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
3220: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3230: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3240: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
3250: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3260: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3270: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3280: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3290: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
32a0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
32b0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
32c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
32d0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
32e0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
32f0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
3300: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
3310: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
3320: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3330: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
3340: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
3350: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
3360: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
3370: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3380: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3390: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
33a0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
33b0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
33c0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
33d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
33e0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
33f0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
3400: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
3410: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
3420: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
3430: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
3440: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
3450: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
3460: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
3470: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
3480: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
3490: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
34a0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
34b0: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
34c0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
34d0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
34e0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
34f0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
3500: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
3510: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
3520: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
3530: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
3540: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
3550: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3560: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
3570: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
3580: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
3590: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
35a0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
35b0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
35c0: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
35d0: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
35e0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
35f0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
3600: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
3610: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
3620: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
3630: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
3640: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
3650: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
3660: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
3670: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
3680: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
3690: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
36a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
36b0: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
36c0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
36d0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
36e0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
36f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3700: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
3710: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
3720: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
3730: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
3740: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3760: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3770: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3780: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  >aOp==0 || p->db
3790: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
37a0: 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50  {.    if (n != P
37b0: 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20  4_KEYINFO) {.   
37c0: 20 20 20 66 72 65 65 50 34 28 6e 2c 20 28 76 6f     freeP4(n, (vo
37d0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
37e0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
37f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3800: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
3810: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
3820: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3830: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
3840: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
3850: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
3860: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3870: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
3880: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
3890: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
38a0: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
38b0: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
38c0: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
38d0: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
38e0: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
38f0: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
3900: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
3910: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
3920: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
3930: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 28 69 6e 74  pOp->p4.i = (int
3940: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
3950: 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  4type = n;.  }el
3960: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
3970: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3980: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
3990: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
39a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
39b0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
39c0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
39d0: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
39e0: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
39f0: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
3a00: 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65  Info*)zP4)->nFie
3a10: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
3a20: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
3a30: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
3a40: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
3a50: 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65  aColl[0]) + nFie
3a60: 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ld;.    pKeyInfo
3a70: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3a80: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
3a90: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
3aa0: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
3ab0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3ac0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
3ad0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
3ae0: 74 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  te);.      /* In
3af0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
3b00: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 50 34 5f  lementation, P4_
3b10: 4b 45 59 49 4e 46 4f 20 69 73 20 6f 6e 6c 79 20  KEYINFO is only 
3b20: 65 76 65 72 20 75 73 65 64 20 6f 6e 0a 20 20 20  ever used on.   
3b30: 20 20 20 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74     ** KeyInfo st
3b40: 72 75 63 74 75 72 65 73 20 74 68 61 74 20 68 61  ructures that ha
3b50: 76 65 20 6e 6f 20 61 53 6f 72 74 4f 72 64 65 72  ve no aSortOrder
3b60: 20 63 6f 6d 70 6f 6e 65 6e 74 2e 20 20 45 6c 65   component.  Ele
3b70: 6d 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 77  ments.      ** w
3b80: 69 74 68 20 61 6e 20 61 53 6f 72 74 4f 72 64 65  ith an aSortOrde
3b90: 72 20 61 6c 77 61 79 73 20 75 73 65 20 50 34 5f  r always use P4_
3ba0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2e  KEYINFO_HANDOFF.
3bb0: 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 0a 20    So we do not. 
3bc0: 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
3bd0: 62 6f 74 68 65 72 20 77 69 74 68 20 64 75 70 6c  bother with dupl
3be0: 69 63 61 74 69 6e 67 20 74 68 65 20 61 53 6f 72  icating the aSor
3bf0: 74 4f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  tOrder. */.     
3c00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
3c10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3d 3d 30  o->aSortOrder==0
3c20: 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   );.#if 0.      
3c30: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
3c40: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3c50: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
3c60: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
3c70: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
3c80: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
3c90: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
3ca0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
3cb0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
3cc0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
3cd0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
3ce0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
3cf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
3d00: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3d10: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20   P4_KEYINFO;.   
3d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3d30: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3d40: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  d = 1;.      pOp
3d50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
3d60: 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  TUSED;.    }.  }
3d70: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
3d80: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
3d90: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3da0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
3db0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3dc0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
3dd0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
3de0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
3df0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
3e00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a  Op->p4type = n;.
3e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3e20: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c   n==0 ) n = strl
3e30: 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  en(zP4);.    pOp
3e40: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
3e50: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
3e60: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
3e70: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
3e80: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
3e90: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3ea0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
3eb0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68  omment on the th
3ec0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3ed0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3ee0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3ef0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
3f00: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
3f10: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
3f20: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3f40: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
3f50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
3f60: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
3f70: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
3f80: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
3f90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3fa0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
3fb0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
3fc0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
3fd0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
3fe0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
3ff0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
4000: 74 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20  te3_free(*pz);. 
4010: 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33     *pz = sqlite3
4020: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
4030: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
4040: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4050: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
4060: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
4070: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
4080: 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65  address..*/.Vdbe
4090: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
40a0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
40b0: 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72  t addr){.  asser
40c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
40d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
40e0: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
40f0: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
4100: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
4110: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
4120: 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20  eturn ((addr>=0 
4130: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f  && addr<p->nOp)?
4140: 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a  (&p->aOp[addr]):
4150: 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  0);.}..#if !defi
4160: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4170: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
4180: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
4190: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
41a0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
41b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
41c0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
41d0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
41e0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
41f0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
4200: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
4210: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
4220: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
4230: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
4240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
4250: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
4260: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
4270: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
4280: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
4290: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
42a0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
42b0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
42c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
42d0: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
42e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
42f0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
4300: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
4310: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  Info;.      sqli
4320: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4330: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
4340: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
4350: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
4360: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65    i = strlen(zTe
4370: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
4380: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
4390: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
43a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
43b0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
43c0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
43d0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
43e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
43f0: 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  = strlen(pColl->
4400: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4410: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
4420: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
4430: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
4440: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
4450: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4460: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4470: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
4480: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
4490: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
44a0: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
44b0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
44c0: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
44d0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
44e0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
44f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
4500: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
4510: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
4520: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
4530: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
4540: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
4550: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
4560: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
4570: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
4580: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
4590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
45a0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
45b0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
45c0: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
45d0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
45e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
45f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4600: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
4610: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
4620: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
4630: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
4640: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4650: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
4660: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
4670: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4690: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
46a0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
46b0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
46c0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
46d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
46e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
46f0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
4700: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
4710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4720: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4730: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
4740: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4750: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4760: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
4770: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
4780: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4790: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
47b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
47c0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
47d0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
47e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
47f0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
4800: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4810: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4820: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
4830: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
4840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4850: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4860: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
4870: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
4880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4890: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
48a0: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20  EM_Null)==0 );. 
48b0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
48c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
48d0: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
48e0: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
48f0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
4900: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4920: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4930: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
4940: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
4950: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
4960: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
4970: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
4980: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4990: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
49a0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
49b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
49c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
49d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
49e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
49f0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
4a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
4a10: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
4a20: 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20  ->p4.pVtab;.    
4a30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4a40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4a50: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
4a60: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
4a70: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
4a80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4a90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4aa0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
4ab0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
4ac0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
4ad0: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
4ae0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
4af0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4b00: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
4b10: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
4b20: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
4b30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
4b40: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
4b50: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
4b60: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
4b70: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f  ] is used..**.*/
4b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4b90: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
4ba0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
4bb0: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
4bc0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
4bd0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4be0: 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e  rt( i<sizeof(p->
4bf0: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
4c00: 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20    mask = 1<<i;. 
4c10: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
4c20: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
4c30: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
4c40: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
4c50: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
4c60: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
4c70: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
4c80: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
4c90: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
4ca0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4cb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4cc0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
4cd0: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
4ce0: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
4cf0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
4d00: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
4d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4d20: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
4d30: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
4d40: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
4d50: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
4d60: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
4d70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4d80: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
4d90: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
4da0: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
4db0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
4dc0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
4dd0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
4de0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
4df0: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
4e00: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
4e10: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
4e20: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
4e30: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
4e40: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
4e50: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
4e60: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
4e70: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
4e80: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
4e90: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
4ea0: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
4eb0: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
4ec0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4ed0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4ee0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4ef0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4f10: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4f20: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69  Mem *p, int N, i
4f30: 6e 74 20 66 72 65 65 62 75 66 66 65 72 73 29 7b  nt freebuffers){
4f40: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
4f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4f60: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 6e   = p->db;.    in
4f70: 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  t malloc_failed 
4f80: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
4f90: 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e  ed;.    while( N
4fa0: 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73  -->0 ){.      as
4fb0: 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b 30  sert( N<2 || p[0
4fc0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
4fd0: 0a 20 20 20 20 20 20 69 66 28 20 66 72 65 65 62  .      if( freeb
4fe0: 75 66 66 65 72 73 20 29 7b 0a 20 20 20 20 20 20  uffers ){.      
4ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5000: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
5010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5020: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
5030: 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70  eleaseExternal(p
5040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5050: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
5060: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2b 2b 3b  Null;.      p++;
5070: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d  .    }.    db->m
5080: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
5090: 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  lloc_failed;.  }
50a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
50b0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
50c0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73  MANAGEMENT.int s
50d0: 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65 61 73  qlite3VdbeReleas
50e0: 65 42 75 66 66 65 72 73 28 56 64 62 65 20 2a 70  eBuffers(Vdbe *p
50f0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
5100: 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  nt nFree = 0;.  
5110: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5120: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
5130: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
5140: 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e  r(ii=1; ii<=p->n
5150: 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Mem; ii++){.    
5160: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
5170: 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66  aMem[ii];.    if
5180: 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65  ( pMem->z && pMe
5190: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  m->flags&MEM_Dyn
51a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
51b0: 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b  ( !pMem->xDel );
51c0: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  .      nFree += 
51d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
51e0: 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  e(pMem->z);.    
51f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5200: 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
5210: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5220: 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69  n nFree;.}.#endi
5230: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
5240: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
5250: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
5260: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
5270: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
5280: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
5290: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
52a0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
52b0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
52c0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
52d0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
52e0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
52f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
5300: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
5310: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5320: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
5330: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
5340: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
5350: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
5360: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
5370: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
5380: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
5390: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
53a0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
53b0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
53c0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
53d0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
53e0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
53f0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
5400: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5410: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
5420: 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  Y PLAN..*/.int s
5430: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
5440: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5460: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
5470: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5480: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
5490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
54a0: 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  OK;.  Mem *pMem 
54b0: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
54c0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a  = &p->aMem[1];..
54d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
54e0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  lain );.  if( p-
54f0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
5500: 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20  IC_RUN ) return 
5510: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
5520: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67   assert( db->mag
5530: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
5540: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
5550: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
5560: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
5570: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20  LITE_BUSY );..  
5580: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
5590: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
55a0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
55b0: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
55c0: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
55d0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
55e0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
55f0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
5600: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
5610: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
5620: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5630: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5640: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5650: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5660: 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 31  pMem, p->nMem, 1
5670: 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  );..  do{.    i 
5680: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
5690: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
56a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
56b0: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
56c0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
56d0: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
56e0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
56f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5700: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
5710: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
5720: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
5730: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
5740: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5750: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
5760: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
5770: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
5780: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
5790: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
57a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
57b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
57c0: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  *z;.    Op *pOp 
57d0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
57e0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
57f0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
5800: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5810: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
5820: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5830: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5840: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5870: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
5880: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5890: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
58a0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
58b0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
58c0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
58d0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
58e0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
58f0: 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70  >opcode);  /* Op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
5910: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5920: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
5930: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5940: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5950: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5960: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
5970: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5980: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
5990: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
59a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
59b0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
59c0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
59f0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5a00: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
5a10: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
5a20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5a30: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5a40: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
5a70: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5a80: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5a90: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5aa0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5ab0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5ac0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5ad0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
5ae0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
5af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
5b10: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
5b20: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5b30: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5b40: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5b50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
5b60: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
5b70: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
5b80: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
5b90: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5ba0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
5bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5bc0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
5bd0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5be0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
5bf0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
5c00: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
5c10: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
5c20: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
5c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5c40: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
5c50: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
5c60: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
5c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
5c80: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5c90: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5ca0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5cb0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
5cc0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
5ce0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5cf0: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
5d00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5d10: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5d20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5d30: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
5d40: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
5d50: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5d60: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  led = 1;.       
5d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5d80: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
5d90: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5da0: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
5db0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5dc0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
5dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5de0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
5df0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
5e00: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
5e10: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5e20: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5e30: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5e40: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5e50: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
5e60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5e70: 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  UG.      if( pOp
5e80: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
5e90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5ea0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
5eb0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
5ec0: 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f  em->z = pOp->zCo
5ed0: 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  mment;.        p
5ee0: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5ef0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5f00: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5f10: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5f20: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5f30: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
5f40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5f50: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f70: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
5f80: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5f90: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
5fa0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
5fb0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
5fc0: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
5fd0: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
5fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5ff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
6000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6010: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6020: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6030: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
6040: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6050: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
6060: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
6070: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
6080: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
6090: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
60a0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
60b0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
60c0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
60d0: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
60e0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
60f0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
6100: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6110: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6120: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
6130: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
6140: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
6150: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
6160: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
6170: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
6180: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
6190: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
61a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
61b0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
61c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
61d0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
61e0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
61f0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
6200: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
6210: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6220: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
6230: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6240: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6250: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6260: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6270: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6280: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6290: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
62a0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
62b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
62c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
62d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
62e0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
62f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
6300: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6310: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
6320: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
6330: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6340: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6350: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6360: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6370: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6380: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6390: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
63a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
63b0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
63c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
63d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
63e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
63f0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
6400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6410: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
6420: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
6430: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6440: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6460: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6470: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6480: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6490: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
64a0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
64b0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
64c0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
64d0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
64e0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
64f0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
6500: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
6510: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
6520: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
6530: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6540: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6550: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6560: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6570: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6580: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6590: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
65a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
65b0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
65c0: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
65d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
65e0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
6610: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6640: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6650: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6660: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6690: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
66a0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
66b0: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66d0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
66e0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
66f0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
6720: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
6730: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6740: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6760: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6770: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6780: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6790: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
67a0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
67b0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
67c0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
67d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
67e0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
67f0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
6800: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
6810: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
6820: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
6830: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
6840: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
6850: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
6860: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
6870: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
6880: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
6890: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
68a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
68b0: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
68c0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
68d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
68e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
68f0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
6900: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
6910: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
6920: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
6930: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
6940: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
6950: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
6960: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
6970: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
6980: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
6990: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
69a0: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72  ace for.  ** Cur
69b0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
69c0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
69d0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
69e0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
69f0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
6a00: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
6a10: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
6a20: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
6a30: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
6a40: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6a50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
6a60: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
6a70: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
6a80: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
6a90: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
6aa0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
6ab0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
6ac0: 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73   space for regis
6ad0: 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
6ae0: 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20   p->aMem==0 ){. 
6af0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
6b00: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
6b10: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
6b20: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
6b30: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
6b40: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
6b50: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 2f 2a  , &nArg);.    /*
6b60: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
6b70: 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20 20 20   p->nOp);*/.    
6b80: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
6b90: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  );.    if( isExp
6ba0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
6bb0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ){.      p->nMem
6bc0: 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20   = nMem = 10;.  
6bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20    }.    p->aMem 
6be0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6bf0: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
6c00: 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65    nMem*sizeof(Me
6c10: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
6c20: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6c30: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6c40: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6c50: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6c60: 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f      + nArg*sizeo
6c70: 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20  f(Mem*)         
6c80: 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f       /* apArg */
6c90: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
6ca0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
6cb0: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
6cc0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72   */.      + nCur
6cd0: 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f  sor*sizeof(Curso
6ce0: 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20 61 70  r*) + 1    /* ap
6cf0: 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  Csr */.    );.  
6d00: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
6d10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
6d20: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
6d30: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
6d40: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
6d50: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  Mem */.      p->
6d60: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
6d70: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
6d80: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
6d90: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  */.      p->aVar
6da0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d   = &p->aMem[nMem
6db0: 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56  +1];.      p->nV
6dc0: 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20  ar = nVar;.     
6dd0: 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20   p->okVar = 0;. 
6de0: 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20       p->apArg = 
6df0: 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b  (Mem**)&p->aVar[
6e00: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nVar];.      p->
6e10: 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29  azVar = (char**)
6e20: 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b  &p->apArg[nArg];
6e30: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
6e40: 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e  = (Cursor**)&p->
6e50: 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  azVar[nVar];.   
6e60: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
6e70: 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66  nCursor;.      f
6e80: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
6e90: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
6ea0: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
6eb0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
6ec0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
6ed0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
6ee0: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
6ef0: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
6f00: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
6f10: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6f20: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
6f30: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
6f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6f60: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
6f70: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
6f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6f90: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
6fa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
6fb0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
6fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6fd0: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
6fe0: 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44   0;.  p->returnD
6ff0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  epth = 0;.  p->e
7000: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
7010: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c  Abort;.  p->expl
7020: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
7030: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
7040: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
7050: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
7060: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
7070: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
7080: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
7090: 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74  5;.  p->openedSt
70a0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66  atement = 0;.#if
70b0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
70c0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
70d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
70e0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
70f0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
7100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
7110: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
7120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7130: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
7140: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
7150: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
7160: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
7170: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
7180: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
7190: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
71a0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
71b0: 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43  e *p, Cursor *pC
71c0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
71d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
71e0: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
71f0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
7200: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
7210: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
7220: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
7230: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
7240: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
7250: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pCx->pBt);.  }.
7260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7270: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7280: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
7290: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
72a0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
72b0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
72c0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
72d0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
72e0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
72f0: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
7300: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
7310: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
7320: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
7330: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
7340: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
7350: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
7360: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
7370: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
7380: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
7390: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
73a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
73b0: 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64  !pCx->ephemPseud
73c0: 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  oTable ){.    sq
73d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e  lite3_free(pCx->
73e0: 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a  pData);.  }.  /*
73f0: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
7400: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29 3b  sizeof(Cursor));
7410: 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33   */.  /* sqlite3
7420: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
7430: 29 3b 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74  ); */.  /* sqlit
7440: 65 33 5f 66 72 65 65 28 70 43 78 29 3b 20 2a 2f  e3_free(pCx); */
7450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
7460: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
7470: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
7480: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
7490: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
74a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
74b0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
74c0: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
74d0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
74e0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
74f0: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
7500: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7510: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
7520: 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d      Cursor *pC =
7530: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
7540: 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d    if( pC && (!p-
7550: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c  >inVtabMethod ||
7560: 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f   !pC->pVtabCurso
7570: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
7580: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7590: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
75a0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
75b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
75c0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
75d0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
75e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
75f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
7600: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
7610: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
7620: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
7630: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
7640: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
7650: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
7660: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
7670: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
7680: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
7690: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
76a0: 6e 75 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  nup(Vdbe *p, int
76b0: 20 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a 20   freebuffers){. 
76c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41   int i;.  closeA
76d0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
76e0: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
76f0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
7700: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
7710: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
7720: 70 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f  p->aMem[i], MEM_
7730: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
7740: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
7750: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
7760: 6d 2c 20 66 72 65 65 62 75 66 66 65 72 73 29 3b  m, freebuffers);
7770: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  .  sqlite3VdbeFi
7780: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66  foClear(&p->sFif
7790: 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  o);.  if( p->con
77a0: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
77b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63   for(i=0; i<p->c
77c0: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20  ontextStackTop; 
77d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
77e0: 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72  te3VdbeFifoClear
77f0: 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  (&p->contextStac
7800: 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20  k[i].sFifo);.   
7810: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
7820: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
7830: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
7840: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
7850: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
7860: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
7870: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
7880: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  p = 0;.  sqlite3
7890: 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67  _free(p->zErrMsg
78a0: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
78b0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
78c0: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
78d0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
78e0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
78f0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
7900: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7910: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
7920: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
7930: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
7940: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
7950: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
7960: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
7970: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
7980: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7990: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
79a0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
79b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
79c0: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
79d0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
79e0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
79f0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
7a00: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
7a10: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
7a20: 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65  nt n;..  release
7a30: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
7a40: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
7a50: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31  umn*COLNAME_N, 1
7a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
7a70: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
7a80: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
7a90: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
7aa0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
7ab0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
7ac0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
7ad0: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
7ae0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7af0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  ->db, sizeof(Mem
7b00: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
7b10: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
7b20: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
7b30: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
7b40: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
7b50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
7b60: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
7b70: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
7b80: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
7b90: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
7ba0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
7bb0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
7bc0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
7bd0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
7be0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
7bf0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
7c00: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
7c10: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
7c20: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
7c30: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
7c40: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7c50: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d  s()..**.** If N=
7c60: 3d 50 34 5f 53 54 41 54 49 43 20 20 69 74 20 6d  =P4_STATIC  it m
7c70: 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20  eans that zName 
7c80: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7c90: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
7ca0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
7cb0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
7cc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66   the pointer. If
7cd0: 20 69 74 20 69 73 20 50 34 5f 44 59 4e 41 4d 49   it is P4_DYNAMI
7ce0: 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20  C, then .** the 
7cf0: 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20  string is freed 
7d00: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
7d10: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
7d20: 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77  be is finished w
7d30: 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72  ith.** it. Other
7d40: 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66  wise, N bytes of
7d50: 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65   zName are copie
7d60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7d70: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7d80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  Vdbe *p, int idx
7d90: 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74  , int var, const
7da0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
7db0: 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t N){.  int rc;.
7dc0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
7de0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
7df0: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
7e00: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
7e10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
7e20: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
7e30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
7e40: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
7e50: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
7e60: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
7e70: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
7e80: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66  esColumn]);.  if
7e90: 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ( N==P4_DYNAMIC 
7ea0: 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20  || N==P4_STATIC 
7eb0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7ec0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7ed0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
7ee0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
7ef0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7f00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7f10: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7f20: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
7f30: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51  me, zName, N, SQ
7f40: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
7f50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
7f60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7f70: 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59  E_OK && N==P4_DY
7f80: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f  NAMIC ){.    pCo
7f90: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 3d 20  lName->flags &= 
7fa0: 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  (~MEM_Static);. 
7fb0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61     pColName->zMa
7fc0: 6c 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d  lloc = pColName-
7fd0: 3e 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >z;.  }.  return
7fe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
7ff0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
8000: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
8010: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
8020: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
8030: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
8040: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
8050: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
8060: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
8070: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
8080: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
8090: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
80a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
80b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
80c0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
80d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
80e0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
80f0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
8100: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8110: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
8120: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
8130: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
8140: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
8150: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
8160: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
8170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8180: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
8190: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
81a0: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
81b0: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
81c0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
81d0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
81e0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
81f0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
8200: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
8210: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
8220: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
8230: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
8240: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
8250: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
8260: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
8270: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
8280: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
8290: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
82a0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
82b0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
82c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
82d0: 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20  Sync(db, rc);.  
82e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
82f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8300: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
8310: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
8320: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
8330: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
8340: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
8350: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
8360: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
8370: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
8380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
8390: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
83a0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
83b0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
83c0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
83d0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
83e0: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
83f0: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
8400: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
8410: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
8420: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
8430: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
8440: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
8450: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
8460: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8470: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
8480: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8490: 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
84a0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
84b0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
84c0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
84d0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
84e0: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
84f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
8500: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
8510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
8520: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
8530: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
8540: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
8550: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
8560: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
8570: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
8580: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
8590: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
85a0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
85b0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
85c0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
85d0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69  etyOn(db);.    i
85e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
85f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
8600: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
8610: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
8620: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
8630: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
8640: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
8650: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
8660: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
8670: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
8680: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
8690: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
86a0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
86b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
86c0: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
86d0: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
86e0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
86f0: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
8700: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
8710: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
8720: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
8730: 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74   :memory:.  In t
8740: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 0a 20  hat case we do. 
8750: 20 2a 2a 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   ** not support 
8760: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
8770: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
8780: 65 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73  e the simple cas
8790: 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e  e then.  ** too.
87a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
87b0: 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72  trlen(sqlite3Btr
87c0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
87d0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c  ->aDb[0].pBt)) |
87e0: 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20  | nTrans<=1 ){. 
87f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
8800: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
8810: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8820: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
8830: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
8850: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8860: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8870: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
8880: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8890: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
88a0: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
88b0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
88c0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
88d0: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
88e0: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
88f0: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
8900: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
8910: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
8920: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
8930: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
8940: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
8950: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
8960: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
8970: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
8980: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
8990: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
89a0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
89b0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
89c0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
89d0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
89e0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
89f0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
8a00: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8a10: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8a20: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8a30: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8a40: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8a50: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
8a60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8a70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8a80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a90: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
8aa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8ab0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
8ac0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
8ad0: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
8ae0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
8af0: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
8b00: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
8b10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
8b20: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
8b30: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
8b40: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
8b50: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
8b60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
8b70: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
8b80: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
8b90: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
8ba0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
8bb0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
8bc0: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
8bd0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
8be0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
8bf0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
8c00: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
8c10: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
8c20: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
8c30: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
8c40: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
8c50: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
8c60: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
8c70: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
8c80: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
8c90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8ca0: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
8cb0: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
8cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
8cd0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
8ce0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
8cf0: 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e 64  ness(sizeof(rand
8d00: 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20  om), &random);. 
8d10: 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73       zMaster = s
8d20: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
8d30: 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a  , "%s-mj%08X", z
8d40: 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d  MainFile, random
8d50: 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20  &0x7fffffff);.  
8d60: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
8d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8d80: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
8d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
8da0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
8db0: 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
8dc0: 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
8dd0: 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
8de0: 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
8df0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
8e00: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
8e10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
8e20: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
8e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
8e40: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
8e50: 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
8e60: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8e70: 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
8e80: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
8e90: 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
8ea0: 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
8eb0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
8ec0: 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
8ed0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
8ee0: 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
8ef0: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
8f00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8f10: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
8f20: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
8f30: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
8f40: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
8f50: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
8f60: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
8f70: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
8f80: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
8f90: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
8fa0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8fb0: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
8fc0: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
8fd0: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
8fe0: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
8ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9000: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
9010: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
9020: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
9030: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
9040: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
9050: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
9060: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
9070: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
9080: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
9090: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
90a0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
90b0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
90c0: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
90d0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
90e0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
90f0: 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65   i==1 ) continue
9100: 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68  ;   /* Ignore th
9110: 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
9120: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
9130: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
9140: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
9150: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
9160: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
9170: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
9180: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
9190: 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20  if( zFile[0]==0 
91a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20  ) continue;  /* 
91b0: 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20  Ignore :memory: 
91c0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20  databases */.   
91d0: 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79       if( !needSy
91e0: 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74  nc && !sqlite3Bt
91f0: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
9200: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
9210: 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
9220: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9230: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9240: 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a  Write(pMaster, z
9250: 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69  File, strlen(zFi
9260: 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
9270: 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
9280: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b  = strlen(zFile)+
9290: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
92a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
92b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
92c0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
92d0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
92e0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
92f0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9300: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
9310: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74  lite3_free(zMast
9320: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
9330: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
9340: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9350: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
9360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9370: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
9380: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
9390: 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
93a0: 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
93b0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
93c0: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e      */.    zMain
93d0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
93e0: 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62  reeGetDirname(db
93f0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
9400: 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63     if( (needSync
9410: 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73   .     && (0==(s
9420: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
9430: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
9440: 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
9450: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29  CAP_SEQUENTIAL))
9460: 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c  .     && (rc=sql
9470: 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
9480: 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
9490: 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45  NORMAL))!=SQLITE
94a0: 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71  _OK) ){.      sq
94b0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
94c0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
94d0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
94e0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
94f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9500: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  3_free(zMaster);
9510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9530: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
9540: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
9550: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
9560: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
9570: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
9580: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9590: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
95a0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
95b0: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
95c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
95d0: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
95e0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
95f0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
9600: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
9610: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
9620: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
9630: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
9640: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
9650: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
9660: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
9670: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
9680: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
9690: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
96a0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
96b0: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
96c0: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
96d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
96e0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
96f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
9700: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
9710: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
9720: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9730: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9740: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
9750: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
9760: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
9770: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9780: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9790: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
97a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
97b0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
97c0: 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65  eOne(pBt, zMaste
97d0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
97e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  }.    sqlite3OsC
97f0: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
9800: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
9810: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9830: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
9840: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
9850: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
9860: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9870: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
9880: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
9890: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
98a0: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
98b0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
98c0: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
98d0: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
98e0: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
98f0: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
9900: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
9910: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9920: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
9930: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
9940: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
9950: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
9960: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
9970: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
9980: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9990: 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
99a0: 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
99b0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
99c0: 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
99d0: 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
99e0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
99f0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
9a00: 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
9a10: 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
9a20: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
9a30: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
9a40: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
9a50: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
9a60: 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
9a70: 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
9a80: 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
9a90: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
9aa0: 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
9ab0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
9ac0: 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
9ad0: 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
9ae0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
9af0: 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
9b00: 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
9b10: 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
9b20: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
9b30: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
9b40: 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
9b50: 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
9b60: 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
9b70: 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
9b80: 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e  n(SQLITE_FAULTIN
9b90: 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b 0a  JECTOR_MALLOC);.
9ba0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
9bb0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
9bc0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
9bd0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
9be0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
9bf0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9c00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9c10: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9c20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9c30: 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65 6e  lite3FaultEndBen
9c40: 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54  ign(SQLITE_FAULT
9c50: 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29  INJECTOR_MALLOC)
9c60: 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
9c70: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
9c80: 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
9c90: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
9ca0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
9cb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
9cc0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9cd0: 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
9ce0: 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64  sqlite3.activeVd
9cf0: 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69  beCnt count vari
9d00: 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20  able.** matches 
9d10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64  the number of vd
9d20: 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74  be's in the list
9d30: 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74   sqlite3.pVdbe t
9d40: 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  hat are.** curre
9d50: 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20  ntly active. An 
9d60: 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20  assertion fails 
9d70: 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74  if the two count
9d80: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a  s do not match..
9d90: 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  ** This is an in
9da0: 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63  ternal self-chec
9db0: 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e  k only - it is n
9dc0: 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20  ot an essential 
9dd0: 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74  processing.** st
9de0: 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ep..**.** This i
9df0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45  s a no-op if NDE
9e00: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  BUG is defined..
9e10: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
9e20: 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  G.static void ch
9e30: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
9e40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
9e50: 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20   Vdbe *p;.  int 
9e60: 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  cnt = 0;.  p = d
9e70: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
9e80: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
9e90: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
9ea0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70  AGIC_RUN && p->p
9eb0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  c>=0 ){.      cn
9ec0: 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  t++;.    }.    p
9ed0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
9ee0: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
9ef0: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
9f00: 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  t );.}.#else.#de
9f10: 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65  fine checkActive
9f20: 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69  VdbeCnt(x).#endi
9f30: 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65  f../*.** For eve
9f40: 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69 6e  ry Btree that in
9f50: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9f60: 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a  tion db which .*
9f70: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
9f80: 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69  ied, "trip" or i
9f90: 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20 63  nvalidate each c
9fa0: 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74  ursor in.** that
9fb0: 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61 76   Btree might hav
9fc0: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
9fd0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72 73  so that the curs
9fe0: 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20  or.** can never 
9ff0: 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20  be used again.  
a000: 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
a010: 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a  n a rollback.***
a020: 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61 76   occurs.  We hav
a030: 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68  e to trip all th
a040: 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c  e other cursors,
a050: 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20   even.** cursor 
a060: 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69  from other VMs i
a070: 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  n different data
a080: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
a090: 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e  ,.** so that non
a0a0: 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f  e of them try to
a0b0: 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61 74   use the data at
a0c0: 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77   which they.** w
a0d0: 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64  ere pointing and
a0e0: 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68   which now may h
a0f0: 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64  ave been changed
a100: 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72   due.** to the r
a110: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  ollback..**.** R
a120: 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20 72  emember that a r
a130: 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65  ollback can dele
a140: 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65  te tables comple
a150: 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65  te and.** reorde
a160: 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f  r rootpages.  So
a170: 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
a180: 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61  cient just to sa
a190: 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ve.** the state 
a1a0: 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
a1b0: 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c  We have to inval
a1c0: 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f 72  idate the cursor
a1d0: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69  .** so that it i
a1e0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67 61  s never used aga
a1f0: 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
a200: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72  id invalidateCur
a210: 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74  sorsOnModifiedBt
a220: 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  rees(sqlite3 *db
a230: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
a240: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; i++){.    Btre
a260: 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69  e *p = db->aDb[i
a270: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
a280: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
a290: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
a2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
a2b0: 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
a2c0: 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  (p, SQLITE_ABORT
a2d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
a2e0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
a2f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
a300: 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69   when a VDBE tri
a310: 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20  es to halt.  If 
a320: 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20  the VDBE.** has 
a330: 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64  made changes and
a340: 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
a350: 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d  t mode, then com
a360: 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61  mit those.** cha
a370: 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c  nges.  If a roll
a380: 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20  back is needed, 
a390: 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c  then do the roll
a3a0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
a3b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
a3c0: 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65  only way to move
a3d0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20   the state of a 
a3e0: 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54  VM from.** SQLIT
a3f0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53  E_MAGIC_RUN to S
a400: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
a410: 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73  .  It is harmles
a420: 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69  s to.** call thi
a430: 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69  s on a VM that i
a440: 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  s in the SQLITE_
a450: 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65  MAGIC_HALT state
a460: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
a470: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
a480: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75  f the commit cou
a490: 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20  ld not complete 
a4a0: 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f  because of.** lo
a4b0: 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72  ck contention, r
a4c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
a4d0: 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55  Y.  If SQLITE_BU
a4e0: 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  SY is returned, 
a4f0: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20  it.** means the 
a500: 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61  close did not ha
a510: 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74  ppen and needs t
a520: 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a  o be repeated..*
a530: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
a540: 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  eHalt(Vdbe *p){.
a550: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a560: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
a570: 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 42    int (*xFunc)(B
a580: 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b 20  tree *pBt) = 0; 
a590: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20   /* Function to 
a5a0: 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 72  call on each btr
a5b0: 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  ee backend */.  
a5c0: 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
a5d0: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
a5e0: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
a5f0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72   SQLITE_NOMEM or
a600: 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a 20   IOERR */..  /* 
a610: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
a620: 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
a630: 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
a640: 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
a650: 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
a660: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
a670: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
a680: 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
a690: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
a6a0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
a6b0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
a6c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
a6d0: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
a6e0: 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
a6f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
a700: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
a710: 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
a720: 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
a730: 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
a740: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
a750: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
a760: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
a770: 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
a780: 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
a790: 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
a7a0: 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
a7b0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
a7c0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
a7d0: 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
a7e0: 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
a7f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
a800: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
a810: 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
a820: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
a830: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
a840: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a850: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
a860: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
a870: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
a880: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
a890: 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  bs(p);.  if( p->
a8a0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
a8b0: 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
a8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
a8d0: 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
a8e0: 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
a8f0: 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
a900: 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
a910: 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
a920: 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f 0a  ever started */.
a930: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
a940: 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
a950: 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
a960: 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
a970: 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  c */..    /* Loc
a980: 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
a990: 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
a9a0: 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
a9b0: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
a9c0: 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65 78  Enter(&p->aMutex
a9d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
a9e0: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
a9f0: 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
aa00: 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
aa10: 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
aa20: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
aa30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
aa40: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
aa50: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
aa60: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
aa70: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
aa80: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
aa90: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
aaa0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
aab0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
aac0: 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74 69   loop does stati
aad0: 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74 68  c analysis of th
aae0: 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20 77  e query to see w
aaf0: 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  hich of the.    
ab00: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
ab10: 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73 20  hree categories 
ab20: 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a 20  it falls into:. 
ab30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ab40: 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a 20       Read-only. 
ab50: 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65 72       **     Quer
ab60: 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e 74  y with statement
ab70: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ab80: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
ab90: 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  out statement jo
aba0: 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a 20  urnal.      **. 
abb0: 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64       ** We could
abc0: 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d 6f   do something mo
abd0: 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e 20  re elegant than 
abe0: 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61 6c  this static anal
abf0: 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20 20  ysis (i.e..     
ac00: 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74 79   ** store the ty
ac10: 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20 70  pe of query as p
ac20: 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70 6c  art of the compl
ac30: 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20 62  iation phase), b
ac40: 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ut .      ** han
ac50: 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20 6f  dling malloc() o
ac60: 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73 20  r IO failure is 
ac70: 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65  a fairly obscure
ac80: 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a 20   edge case so . 
ac90: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
aca0: 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 2e  probably easier.
acb0: 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65 20   Todo: Might be 
acc0: 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
acd0: 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20 20  o reduce .      
ace0: 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20 76  ** code size a v
acf0: 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e 74  ery small amount
ad00: 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20 20   though....     
ad10: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
ad20: 74 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  tReadOnly = 0;. 
ad30: 20 20 20 20 20 69 6e 74 20 69 73 53 74 61 74 65       int isState
ad40: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  ment = 0;.      
ad50: 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c 7c  assert(p->aOp ||
ad60: 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20 20   p->nOp==0);.   
ad70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
ad80: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nOp; i++){ .   
ad90: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e       switch( p->
ada0: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29 7b  aOp[i].opcode ){
adb0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
adc0: 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a  OP_Transaction:.
add0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 52              notR
ade0: 65 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61 4f  eadOnly |= p->aO
adf0: 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20 20  p[i].p2;.       
ae00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 74        case OP_St
ae20: 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20 20  atement:.       
ae30: 20 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e 74       isStatement
ae40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
ae50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ae60: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0a   }.      }..   .
ae70: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
ae80: 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
ae90: 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f 20  nly, we need do 
aea0: 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61  no rollback at a
aeb0: 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ll. Otherwise,. 
aec0: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64 20       ** proceed 
aed0: 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
aee0: 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 20   handling..     
aef0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 6f   */.      if( no
af00: 74 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63  tReadOnly || mrc
af10: 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  !=SQLITE_INTERRU
af20: 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  PT ){.        if
af30: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
af40: 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26 26  IOERR_BLOCKED &&
af50: 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a   isStatement ){.
af60: 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20            xFunc 
af70: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  = sqlite3BtreeRo
af80: 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20  llbackStmt;.    
af90: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
afa0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
afb0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28 6d     } else if( (m
afc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
afd0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
afe0: 46 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74 65  FULL) && isState
aff0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ment ){.        
b000: 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65    xFunc = sqlite
b010: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
b020: 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  mt;.        }els
b030: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
b040: 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
b050: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
b060: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
b070: 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
b080: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
b090: 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
b0a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
b0b0: 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
b0c0: 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
b0d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b0e0: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
b0f0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
b100: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
b120: 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20  lbackAll(db);.  
b130: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
b140: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
b150: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b160: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b170: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
b180: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
b190: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
b1a0: 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74  y active vdbe, t
b1b0: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f  hen.    ** we do
b1c0: 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
b1d0: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
b1e0: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
b1f0: 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
b200: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
b210: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
b220: 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
b230: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
b240: 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
b250: 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 65  above has occure
b260: 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
b270: 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
b280: 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 56  t && db->activeV
b290: 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  dbeCnt==1 ){.   
b2a0: 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
b2b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
b2c0: 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
b2d0: 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
b2e0: 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
b2f0: 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
b300: 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
b310: 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62 65  ue, and the vdbe
b320: 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20 20   program was .  
b330: 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73 73        ** success
b340: 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27 4f  ful or hit an 'O
b350: 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69  R FAIL' constrai
b360: 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  nt. This means a
b370: 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
b380: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
b390: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b3a0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64 62      int rc = vdb
b3b0: 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  eCommit(db);.   
b3c0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b3d0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
b3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
b3f0: 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76  eeMutexArrayLeav
b400: 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20  e(&p->aMutex);. 
b410: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b420: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b430: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
b440: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
b450: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
b460: 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
b470: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
b480: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
b490: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b4a0: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
b4b0: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
b4c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b4d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b4e0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
b4f0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
b500: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
b510: 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20  !xFunc ){.      
b520: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
b530: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
b540: 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
b550: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
b560: 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e  ->openedStatemen
b570: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  t ){.          x
b580: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
b590: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20  reeCommitStmt;. 
b5a0: 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
b5b0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72  }else if( p->err
b5c0: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f  orAction==OE_Abo
b5d0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46  rt ){.        xF
b5e0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
b5f0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
b600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b610: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
b620: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
b630: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
b640: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
b650: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
b660: 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
b670: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  it = 1;.      }.
b680: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b690: 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20  If xFunc is not 
b6a0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
b6b0: 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42   one of sqlite3B
b6c0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74  treeRollbackStmt
b6d0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
b6e0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
b6f0: 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20  t. Call it once 
b700: 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e  on each backend.
b710: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b720: 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  urs.    ** and t
b730: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  he return code i
b740: 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f  s still SQLITE_O
b750: 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75 72  K, set the retur
b760: 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65  n code to the ne
b770: 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76  w.    ** error v
b780: 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alue..    */.   
b790: 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c   assert(!xFunc |
b7a0: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
b7b0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b7c0: 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78  tStmt ||.      x
b7d0: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
b7e0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20  eeRollbackStmt. 
b7f0: 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d     );.    for(i=
b800: 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62  0; xFunc && i<db
b810: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
b820: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
b830: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
b840: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
b850: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
b860: 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46 75          rc = xFu
b870: 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  nc(pBt);.       
b880: 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72   if( rc && (p->r
b890: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b8a0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  p->rc==SQLITE_CO
b8b0: 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20  NSTRAINT) ){.   
b8c0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
b8d0: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
b8e0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
b8f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20  ->zErrMsg, 0);. 
b900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b910: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
b920: 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
b930: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
b940: 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65  r DELETE and the
b950: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63   statement was c
b960: 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a  ommitted, .    *
b970: 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65  * set the change
b980: 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a   counter. .    *
b990: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
b9a0: 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70  ngeCntOn && p->p
b9b0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c>=0 ){.      if
b9c0: 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e  ( !xFunc || xFun
b9d0: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43  c==sqlite3BtreeC
b9e0: 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20  ommitStmt ){.   
b9f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ba00: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
ba10: 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
ba20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ba30: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
ba40: 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
ba50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
ba60: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
ba70: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c   }.  .    /* Rol
ba80: 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20  lback or commit 
ba90: 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67  any schema chang
baa0: 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64  es that occurred
bab0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
bac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
bad0: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
bae0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
baf0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bb00: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
bb10: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ema(db, 0);.    
bb20: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64    db->flags = (d
bb30: 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54  b->flags | SQLIT
bb40: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29  E_InternChanges)
bb50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bb60: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
bb70: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
bb80: 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c  BtreeMutexArrayL
bb90: 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29  eave(&p->aMutex)
bba0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
bbb0: 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
bbc0: 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
bbd0: 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
bbe0: 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
bbf0: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
bc00: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76  ){.    db->activ
bc10: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a  eVdbeCnt--;.  }.
bc20: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
bc30: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
bc40: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
bc50: 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
bc60: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
bc70: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
bc80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bc90: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
bca0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
bcb0: 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
bcc0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
bcd0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
bce0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
bcf0: 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
bd00: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
bd10: 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
bd20: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
bd30: 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
bd40: 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
bd50: 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
bd60: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
bd70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
bd80: 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
bd90: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
bda0: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
bdb0: 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
bdc0: 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
bdd0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
bde0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
bdf0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
be00: 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
be10: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
be20: 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
be30: 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
be40: 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
be50: 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
be60: 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
be70: 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
be80: 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
be90: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
bea0: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
beb0: 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
bec0: 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
bed0: 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
bee0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
bef0: 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
bf00: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
bf10: 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72 65 65  dbe *p, int free
bf20: 62 75 66 66 65 72 73 29 7b 0a 20 20 73 71 6c 69  buffers){.  sqli
bf30: 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
bf40: 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
bf50: 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
bf60: 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
bf70: 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
bf80: 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
bf90: 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
bfa0: 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
bfb0: 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
bfc0: 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
bfd0: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28  it now..  */.  (
bfe0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
bff0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69  tyOn(db);.  sqli
c000: 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
c010: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
c020: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20  afetyOff(db);.. 
c030: 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
c040: 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
c050: 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
c060: 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
c070: 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
c080: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
c090: 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
c0a0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
c0b0: 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
c0c0: 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
c0d0: 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
c0e0: 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
c0f0: 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
c100: 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
c110: 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
c120: 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
c130: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
c140: 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
c150: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
c160: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
c170: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45  ){.    if( p->zE
c180: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73  rrMsg ){.      s
c190: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
c1a0: 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d  r(db->pErr,-1,p-
c1b0: 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f  >zErrMsg,SQLITE_
c1c0: 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72 65  UTF8,sqlite3_fre
c1d0: 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72  e);.      db->er
c1e0: 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20  rCode = p->rc;. 
c1f0: 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
c200: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
c210: 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
c220: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
c230: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
c240: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
c250: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c260: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
c270: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
c280: 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
c290: 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
c2a0: 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
c2b0: 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
c2c0: 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
c2d0: 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
c2e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
c2f0: 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
c300: 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
c310: 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
c320: 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
c330: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
c340: 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
c350: 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
c360: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
c370: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
c380: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
c390: 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
c3a0: 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
c3b0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
c3c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
c3d0: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
c3e0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
c3f0: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
c400: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
c410: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
c420: 70 2c 20 66 72 65 65 62 75 66 66 65 72 73 29 3b  p, freebuffers);
c430: 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66  ..  /* Save prof
c440: 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iling informatio
c450: 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45  n from this VDBE
c460: 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65   run..  */.#ifde
c470: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
c480: 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74   {.    FILE *out
c490: 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70   = fopen("vdbe_p
c4a0: 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22  rofile.out", "a"
c4b0: 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29  );.    if( out )
c4c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
c4d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
c4e0: 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20  , "---- ");.    
c4f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
c500: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
c510: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
c520: 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69  "%02x", p->aOp[i
c530: 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20  ].opcode);.     
c540: 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66   }.      fprintf
c550: 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
c560: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c570: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
c580: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
c590: 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c   "%6d %10lld %8l
c5a0: 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ld ",.          
c5b0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
c5c0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
c5d0: 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
c5e0: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
c5f0: 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
c600: 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
c610: 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
c620: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
c630: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
c640: 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
c650: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
c660: 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
c670: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
c680: 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d  dif.  p->magic =
c690: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
c6a0: 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20 3d  ;.  p->aborted =
c6b0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
c6c0: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
c6d0: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
c6e0: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
c6f0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
c700: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
c710: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
c720: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
c730: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
c740: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
c750: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
c760: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
c770: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
c780: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
c790: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c7a0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
c7b0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
c7c0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
c7d0: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
c7e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c7f0: 56 64 62 65 52 65 73 65 74 28 70 2c 20 31 29 3b  VdbeReset(p, 1);
c800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
c810: 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
c820: 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73  k)==rc );.  }els
c830: 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d  e if( p->magic!=
c840: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
c850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c860: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
c870: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
c880: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
c890: 70 2d 3e 6e 4d 65 6d 2c 20 31 29 3b 0a 20 20 73  p->nMem, 1);.  s
c8a0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
c8b0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
c8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  ;.}../*.** Call 
c8d0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
c8e0: 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20  or each auxdata 
c8f0: 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75  entry in pVdbeFu
c900: 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20  nc for which.** 
c910: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
c920: 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73  g bit in mask is
c930: 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61   clear.  Auxdata
c940: 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20   entries beyond 
c950: 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73  31.** are always
c960: 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20   destroyed.  To 
c970: 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64  destroy all auxd
c980: 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c  ata entries, cal
c990: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
c9a0: 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a  e with mask==0..
c9b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
c9c0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
c9d0: 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65  (VdbeFunc *pVdbe
c9e0: 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b  Func, int mask){
c9f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
ca00: 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63  i=0; i<pVdbeFunc
ca10: 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAux; i++){.  
ca20: 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61    struct AuxData
ca30: 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46   *pAux = &pVdbeF
ca40: 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20  unc->apAux[i];. 
ca50: 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20     if( (i>31 || 
ca60: 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20  !(mask&(1<<i))) 
ca70: 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b  && pAux->pAux ){
ca80: 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
ca90: 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
caa0: 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
cab0: 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
cac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75       }.      pAu
cad0: 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  x->pAux = 0;.   
cae0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
caf0: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
cb00: 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
cb10: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
cb20: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
cb30: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
cb40: 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e   return;.  Clean
cb50: 75 70 28 70 2c 20 31 29 3b 0a 20 20 69 66 28 20  up(p, 1);.  if( 
cb60: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
cb70: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
cb80: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
cb90: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
cba0: 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70   p->db->pVdbe==p
cbb0: 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70   );.    p->db->p
cbc0: 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
cbd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
cbe0: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
cbf0: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
cc00: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28  pPrev;.  }.  if(
cc10: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f   p->aOp ){.    O
cc20: 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *pOp = p->aOp;
cc30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
cc40: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70  p->nOp; i++, pOp
cc50: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
cc60: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
cc70: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
cc80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
cc90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cca0: 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  e(pOp->zComment)
ccb0: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
ccc0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
ccd0: 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 20  free(p->aOp);.  
cce0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
ccf0: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
cd00: 6e 56 61 72 2c 20 31 29 3b 0a 20 20 73 71 6c 69  nVar, 1);.  sqli
cd10: 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61 62  te3_free(p->aLab
cd20: 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  el);.  if( p->aM
cd30: 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  em ){.    sqlite
cd40: 33 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65 6d 5b  3_free(&p->aMem[
cd50: 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  1]);.  }.  relea
cd60: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
cd70: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
cd80: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c  olumn*COLNAME_N,
cd90: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   1);.  sqlite3_f
cda0: 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  ree(p->aColName)
cdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
cdc0: 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e  (p->zSql);.  p->
cdd0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
cde0: 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74  IC_DEAD;.  sqlit
cdf0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
ce00: 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f  *.** If a MoveTo
ce10: 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65   operation is pe
ce20: 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76  nding on the giv
ce30: 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  en cursor, then 
ce40: 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54  do that.** MoveT
ce50: 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20 61  o now.  Return a
ce60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49  n error code.  I
ce70: 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70  f no MoveTo is p
ce80: 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20  ending, this.** 
ce90: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
cea0: 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 73  hing and returns
ceb0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
cec0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
ced0: 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f  rsorMoveto(Curso
cee0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
cef0: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
cf00: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72  {.    int res, r
cf10: 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
cf20: 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e  _TEST.    extern
cf30: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
cf40: 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69  rch_count;.#endi
cf50: 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  f.    assert( p-
cf60: 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  >isTable );.    
cf70: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
cf80: 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73  eMoveto(p->pCurs
cf90: 6f 72 2c 20 30 2c 20 30 2c 20 70 2d 3e 6d 6f 76  or, 0, 0, p->mov
cfa0: 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
cfb0: 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  es);.    if( rc 
cfc0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
cfd0: 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20   *p->pIncrKey = 
cfe0: 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  0;.    p->lastRo
cff0: 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  wid = keyToInt(p
d000: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
d010: 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
d020: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20  alid = res==0;. 
d030: 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
d040: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d050: 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e 70  e3BtreeNext(p->p
d060: 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a 20  Cursor, &res);. 
d070: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
d080: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
d090: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
d0a0: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
d0b0: 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
d0c0: 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
d0d0: 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
d0e0: 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
d0f0: 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
d100: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d110: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d120: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d130: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
d140: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d150: 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
d160: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d170: 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
d180: 65 33 56 64 62 65 53 65 72 69 61 6c 52 65 61 64  e3VdbeSerialRead
d190: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d1a0: 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
d1b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d1c0: 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65  lWrite().**.** e
d1d0: 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63  ncapsulate the c
d1e0: 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69  ode that seriali
d1f0: 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73  zes values for s
d200: 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65  torage in SQLite
d210: 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64  .** data and ind
d220: 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68  ex records. Each
d230: 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75   serialized valu
d240: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a  e consists of a.
d250: 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27  ** 'serial-type'
d260: 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64   and a blob of d
d270: 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20  ata. The serial 
d280: 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74  type is an 8-byt
d290: 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e  e unsigned.** in
d2a0: 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73  teger, stored as
d2b0: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
d2c0: 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e   In an SQLite in
d2d0: 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20  dex record, the 
d2e0: 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73  serial type is s
d2f0: 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62  tored directly b
d300: 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f  efore.** the blo
d310: 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  b of data that i
d320: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
d330: 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63  . In a table rec
d340: 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a  ord, all serial.
d350: 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f  ** types are sto
d360: 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  red at the start
d370: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20   of the record, 
d380: 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66  and the blobs of
d390: 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20   data at.** the 
d3a0: 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65  end. Hence these
d3b0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77   functions allow
d3c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68   the caller to h
d3d0: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72  andle the.** ser
d3e0: 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74  ial-type and dat
d3f0: 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65 6c  a blob seperatel
d400: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  y..**.** The fol
d410: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73  lowing table des
d420: 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f  cribes the vario
d430: 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73  us storage class
d440: 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a  es for data:.**.
d450: 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65  **   serial type
d460: 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66          bytes of
d470: 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a   data      type.
d480: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
d490: 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
d4a0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d  -------    -----
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
d4c0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
d4d0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
d4e0: 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20        NULL.**   
d4f0: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
d500: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
d510: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
d520: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20  eger.**      2  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
d550: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
d560: 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  *      3        
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20               3  
d580: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
d590: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
d5a0: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20   4              
d5b0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20         4        
d5c0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
d5d0: 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20  er.**      5    
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69   6            si
d600: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
d610: 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20       6          
d620: 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
d630: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
d640: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37  nteger.**      7
d650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d660: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
d670: 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20    IEEE float.** 
d680: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
d690: 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
d6a0: 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
d6b0: 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20  constant 0.**   
d6c0: 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20     9            
d6d0: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
d6e0: 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
d6f0: 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20  nstant 1.**     
d700: 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20  10,11           
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72      reserved for
d730: 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20   expansion.**   
d740: 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20   N>=12 and even 
d750: 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20        (N-12)/2  
d760: 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20        BLOB.**   
d770: 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20   N>=13 and odd  
d780: 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20        (N-13)/2  
d790: 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a        text.**.**
d7a0: 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70   The 8 and 9 typ
d7b0: 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e  es were added in
d7c0: 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72   3.3.0, file for
d7d0: 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65  mat 4.  Prior ve
d7e0: 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c  rsions.** of SQL
d7f0: 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64  ite will not und
d800: 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65  erstand those se
d810: 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a  rial types..*/..
d820: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d830: 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72   serial-type for
d840: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
d850: 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33  d in pMem..*/.u3
d860: 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
d870: 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65  ialType(Mem *pMe
d880: 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
d890: 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73  at){.  int flags
d8a0: 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a   = pMem->flags;.
d8b0: 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20    int n;..  if( 
d8c0: 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29  flags&MEM_Null )
d8d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d8e0: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
d8f0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
d900: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
d910: 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
d920: 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
d930: 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
d940: 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
d950: 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
d960: 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
d970: 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
d980: 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
d990: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
d9a0: 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20  && (i&1)==i ){. 
d9b0: 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69 3b       return 8+i;
d9c0: 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69  .    }.    u = i
d9d0: 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20  <0 ? -i : i;.   
d9e0: 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65   if( u<=127 ) re
d9f0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
da00: 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72  u<=32767 ) retur
da10: 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 2;.    if( u<=
da20: 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e  8388607 ) return
da30: 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32   3;.    if( u<=2
da40: 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75  147483647 ) retu
da50: 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 4;.    if( u<
da60: 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74  =MAX_6BYTE ) ret
da70: 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72  urn 5;.    retur
da80: 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 6;.  }.  if( f
da90: 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b  lags&MEM_Real ){
daa0: 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
dab0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61   }.  assert( fla
dac0: 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
dad0: 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
dae0: 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
daf0: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
db00: 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
db10: 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >u.i;.  }.  asse
db20: 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65  rt( n>=0 );.  re
db30: 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
db40: 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
db50: 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
db60: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
db70: 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
db80: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
db90: 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
dba0: 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69  erial-type..*/.i
dbb0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
dbc0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
dbd0: 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
dbe0: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
dbf0: 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
dc00: 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
dc10: 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
dc20: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
dc30: 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
dc40: 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
dc50: 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
dc60: 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
dc70: 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
dc80: 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
dc90: 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
dca0: 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
dcb0: 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
dcc0: 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
dcd0: 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
dce0: 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
dcf0: 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
dd00: 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
dd10: 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
dd20: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
dd30: 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
dd40: 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
dd50: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
dd60: 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
dd70: 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
dd80: 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
dd90: 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
dda0: 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
ddb0: 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
ddc0: 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
ddd0: 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
dde0: 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
ddf0: 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
de00: 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
de10: 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
de20: 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
de30: 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
de40: 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
de50: 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
de60: 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
de70: 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
de80: 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
de90: 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
dea0: 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
deb0: 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
dec0: 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
ded0: 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
dee0: 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
def0: 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
df00: 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
df10: 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
df20: 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
df30: 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
df40: 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
df50: 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
df60: 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
df70: 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
df80: 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
df90: 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
dfa0: 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
dfb0: 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
dfc0: 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
dfd0: 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
dfe0: 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
dff0: 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
e000: 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
e010: 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
e020: 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
e030: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
e040: 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
e050: 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
e060: 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
e070: 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
e080: 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
e090: 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
e0a0: 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
e0b0: 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
e0c0: 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
e0d0: 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
e0e0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
e0f0: 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
e100: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
e110: 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
e120: 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
e130: 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
e140: 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
e150: 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
e160: 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
e170: 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
e180: 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
e190: 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
e1a0: 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
e1b0: 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
e1c0: 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
e1d0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
e1e0: 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
e1f0: 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
e200: 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
e210: 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
e220: 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
e230: 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
e240: 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
e250: 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
e260: 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
e270: 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
e280: 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
e290: 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
e2a0: 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
e2b0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
e2c0: 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
e2d0: 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
e2e0: 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
e2f0: 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
e300: 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
e310: 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
e320: 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
e330: 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
e340: 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
e350: 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
e360: 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
e370: 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
e380: 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
e390: 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
e3a0: 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
e3b0: 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
e3c0: 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
e3d0: 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
e3e0: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
e3f0: 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
e400: 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
e410: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
e420: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
e430: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
e440: 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
e450: 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
e460: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
e470: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
e480: 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
e490: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
e4a0: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
e4b0: 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
e4c0: 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
e4d0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
e4e0: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
e4f0: 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
e500: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
e510: 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
e520: 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c 77  .  nBuf must alw
e530: 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20  ays be.** large 
e540: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
e550: 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2e  he entire field.
e560: 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65    Except, if the
e570: 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62   field is.** a b
e580: 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f 2d  lob with a zero-
e590: 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68 65  filled tail, the
e5a0: 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62 65  n buf[] might be
e5b0: 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74 0a   just the right.
e5c0: 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20  ** size to hold 
e5d0: 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65 70  everything excep
e5e0: 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66  t for the zero-f
e5f0: 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66 20  illed tail.  If 
e600: 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79  buf[].** is only
e610: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
e620: 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f  old the non-zero
e630: 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e   prefix, then on
e640: 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a 2a  ly write that.**
e650: 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75 66   prefix into buf
e660: 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66 5b  [].  But if buf[
e670: 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  ] is large enoug
e680: 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74  h to hold both t
e690: 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e 64  he.** prefix and
e6a0: 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20 77   the tail then w
e6b0: 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78 20  rite the prefix 
e6c0: 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69 6c  and set the tail
e6d0: 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73   to all.** zeros
e6e0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
e6f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
e700: 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
e710: 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
e720: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
e730: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
e740: 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
e750: 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
e760: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
e770: 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
e780: 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
e790: 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
e7a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
e7b0: 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
e7c0: 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d  f, int nBuf, Mem
e7d0: 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65   *pMem, int file
e7e0: 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32 20  _format){.  u32 
e7f0: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71  serial_type = sq
e800: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
e810: 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66  ype(pMem, file_f
e820: 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65  ormat);.  int le
e830: 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72  n;..  /* Integer
e840: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69   and Real */.  i
e850: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d  f( serial_type<=
e860: 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65  7 && serial_type
e870: 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b  >0 ){.    u64 v;
e880: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e890: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
e8a0: 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =7 ){.      asse
e8b0: 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73  rt( sizeof(v)==s
e8c0: 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29  izeof(pMem->r) )
e8d0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
e8e0: 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a  v, &pMem->r, siz
e8f0: 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73  eof(v));.      s
e900: 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
e910: 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73  oat(v);.    }els
e920: 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65  e{.      v = pMe
e930: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20  m->u.i;.    }.  
e940: 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69    len = i = sqli
e950: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e960: 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
e970: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c  );.    assert( l
e980: 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20  en<=nBuf );.    
e990: 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20  while( i-- ){.  
e9a0: 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 26      buf[i] = (v&
e9b0: 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
e9c0: 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >= 8;.    }.    
e9d0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
e9e0: 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20  .  /* String or 
e9f0: 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65  blob */.  if( se
ea00: 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
ea10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
ea20: 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66  m->n + ((pMem->f
ea30: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
ea40: 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20 20  ?pMem->u.i:0).  
ea50: 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73 71             == sq
ea60: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
ea70: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
ea80: 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pe) );.    asser
ea90: 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66  t( pMem->n<=nBuf
eaa0: 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
eab0: 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
eac0: 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
ead0: 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4d  len);.    if( pM
eae0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
eaf0: 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c 65  Zero ){.      le
eb00: 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a  n += pMem->u.i;.
eb10: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42        if( len>nB
eb20: 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  uf ){.        le
eb30: 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20  n = nBuf;.      
eb40: 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  }.      memset(&
eb50: 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c  buf[pMem->n], 0,
eb60: 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20   len-pMem->n);. 
eb70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
eb80: 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
eb90: 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
eba0: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
ebb0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
ebc0: 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
ebd0: 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
ebe0: 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
ebf0: 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
ec00: 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
ec10: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
ec20: 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
ec30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ec40: 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e  tes read..*/ .in
ec50: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
ec60: 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
ec70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
ec80: 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
ec90: 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
eca0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
ecb0: 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
ecc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
ecd0: 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
ece0: 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
ecf0: 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
ed00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
ed10: 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
ed20: 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
ed30: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
ed40: 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
ed50: 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
ed60: 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
ed70: 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
ed80: 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
ed90: 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
eda0: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
edb0: 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
edc0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
edd0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
ede0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
edf0: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
ee00: 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
ee10: 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
ee20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69   pMem->u.i = (si
ee30: 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
ee40: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
ee50: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
ee60: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
ee70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
ee80: 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
ee90: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
eea0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
eeb0: 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
eec0: 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
eed0: 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
eee0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
eef0: 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
ef00: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
ef10: 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
ef20: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
ef30: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
ef40: 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
ef50: 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29  har)buf[0])<<16)
ef60: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c   | (buf[1]<<8) |
ef70: 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70   buf[2];.      p
ef80: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
ef90: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
efa0: 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
efb0: 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
efc0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
efd0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
efe0: 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  ->u.i = (buf[0]<
eff0: 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
f000: 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
f010: 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
f020: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f030: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
f040: 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
f050: 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
f060: 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
f070: 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
f080: 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
f090: 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
f0a0: 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
f0b0: 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
f0c0: 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
f0d0: 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
f0e0: 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
f0f0: 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
f100: 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
f110: 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
f120: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
f130: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
f140: 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
f150: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
f160: 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
f170: 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
f180: 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
f190: 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
f1a0: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
f1b0: 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
f1c0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
f1d0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
f1e0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
f1f0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
f200: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
f210: 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
f220: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
f230: 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
f240: 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
f250: 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
f260: 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
f270: 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
f280: 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
f290: 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
f2a0: 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
f2b0: 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
f2c0: 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
f2d0: 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
f2e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
f2f0: 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
f300: 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
f310: 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
f320: 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
f330: 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
f340: 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
f350: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
f360: 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
f370: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
f380: 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
f390: 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
f3a0: 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
f3b0: 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
f3c0: 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
f3d0: 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
f3e0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
f3f0: 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
f400: 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
f410: 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
f420: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
f430: 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
f440: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
f450: 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
f460: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
f470: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f480: 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
f490: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f4a0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f4b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f4c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
f4d0: 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
f4e0: 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
f4f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
f500: 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
f510: 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
f520: 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
f530: 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
f540: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
f550: 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
f560: 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e  pMem->r) ? MEM_N
f570: 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
f580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
f590: 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
f5a0: 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
f5b0: 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
f5c0: 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
f5d0: 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
f5e0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
f5f0: 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
f600: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f610: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
f630: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
f640: 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
f650: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
f660: 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
f670: 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
f680: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
f690: 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
f6a0: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
f6b0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
f6c0: 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
f6d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
f6e0: 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
f6f0: 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
f700: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
f710: 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
f720: 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
f730: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
f740: 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
f750: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f760: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
f770: 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
f780: 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
f790: 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65  in pKey[], parse
f7a0: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69   the.** record i
f7b0: 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65  nto a UnpackedRe
f7c0: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20  cord structure. 
f7d0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
f7e0: 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72  r to.** that str
f7f0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
f800: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
f810: 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65  on might provide
f820: 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f   szSpace bytes o
f830: 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  f memory.** spac
f840: 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68  e at pSpace.  Th
f850: 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  is space can be 
f860: 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
f870: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62   returned.** VDb
f880: 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74  eParsedRecord st
f890: 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73  ructure if it is
f8a0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20   large enough.  
f8b0: 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  If it is.** not 
f8c0: 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63  big enough, spac
f8d0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
f8e0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
f8f0: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  c()..**.** The r
f900: 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72  eturned structur
f910: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
f920: 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ed by a call to.
f930: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  ** sqlite3VdbeDe
f940: 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
f950: 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b  rd()..*/ .Unpack
f960: 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
f970: 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
f980: 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
f990: 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
f9a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
f9b0: 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
f9c0: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
f9d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f9e0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
f9f0: 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
fa00: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
fa10: 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
fa20: 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
fa30: 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65 2c 20    void *pSpace, 
fa40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
fa50: 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 68  e available to h
fa60: 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f 62  old resulting ob
fa70: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ject */.  int sz
fa80: 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20 20  Space           
fa90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
faa0: 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
fab0: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
fac0: 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
fad0: 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
fae0: 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
faf0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
fb00: 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  *p;.  int nByte;
fb10: 0a 20 20 69 6e 74 20 69 2c 20 69 64 78 2c 20 64  .  int i, idx, d
fb20: 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  ;.  u32 szHdr;. 
fb30: 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a 20   Mem *pMem;.  . 
fb40: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
fb50: 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70 29 20  Mem)>sizeof(*p) 
fb60: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  );.  nByte = siz
fb70: 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
fb80: 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b 0a 20  fo->nField+2);. 
fb90: 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
fba0: 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  ce ){.    p = sq
fbb0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbc0: 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
fbd0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
fbe0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
fbf0: 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20      p->needFree 
fc00: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
fc10: 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20    p = pSpace;.  
fc20: 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d 20    p->needFree = 
fc30: 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  0;.  }.  p->pKey
fc40: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
fc50: 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
fc60: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
fc70: 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64 44 65  + 1;.  p->needDe
fc80: 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70 2d 3e  stroy = 1;.  p->
fc90: 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26 28  aMem = pMem = &(
fca0: 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20 20 69  (Mem*)p)[1];.  i
fcb0: 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
fcc0: 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
fcd0: 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 69 20   d = szHdr;.  i 
fce0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
fcf0: 78 3c 73 7a 48 64 72 20 26 26 20 69 3c 70 2d 3e  x<szHdr && i<p->
fd00: 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33  nField ){.    u3
fd10: 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a  2 serial_type;..
fd20: 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
fd30: 72 69 6e 74 33 32 28 20 61 4b 65 79 2b 69 64 78  rint32( aKey+idx
fd40: 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
fd50: 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20      if( d>=nKey 
fd60: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  && sqlite3VdbeSe
fd70: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
fd80: 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62 72 65  al_type)>0 ) bre
fd90: 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ak;.    pMem->en
fda0: 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
fdb0: 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20  c;.    pMem->db 
fdc0: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
fdd0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
fde0: 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a  = 0;.    pMem->z
fdf0: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
fe00: 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
fe10: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
fe20: 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
fe30: 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
fe40: 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d  ++;.    i++;.  }
fe50: 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 69  .  p->nField = i
fe60: 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
fe70: 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  *)p;.}../*.** Th
fe80: 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72  is routine destr
fe90: 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65  oys a UnpackedRe
fea0: 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  cord object.*/.v
feb0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
fec0: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
fed0: 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  ord(UnpackedReco
fee0: 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
fef0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 65  ){.    if( p->ne
ff00: 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  edDestroy ){.   
ff10: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
ff20: 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20  Mem *pMem;.     
ff30: 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70   for(i=0, pMem=p
ff40: 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69  ->aMem; i<p->nFi
ff50: 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b  eld; i++, pMem++
ff60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
ff70: 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  Mem->zMalloc ){.
ff80: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ff90: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
ffa0: 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d  pMem);.        }
ffb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ffc0: 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 46 72     if( p->needFr
ffd0: 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ee ){.      sqli
ffe0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
fff0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
10000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
10010 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
10020 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
10030 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
10040 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
10050 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
10060 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
10070 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
10080 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
10090 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e 4b  e integer if {nK
100a0 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20 6c  ey1, pKey1} is l
100b0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
100c0 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
100d0 72 20 74 68 61 6e 20 70 50 4b 65 79 32 2e 20 20  r than pPKey2.  
100e0 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
100f0 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
10100 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
10110 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65   by th OP_MakeRe
10120 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
10130 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
10140 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
10150 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
10160 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
10170 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
10180 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
10190 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
101a0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
101b0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
101c0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
101d0 66 69 65 6c 64 73 2e 0a 2a 2a 20 42 75 74 20 69  fields..** But i
101e0 66 20 74 68 65 20 6c 65 6e 67 74 68 73 20 64 69  f the lengths di
101f0 66 66 65 72 2c 20 4b 65 79 32 20 6d 75 73 74 20  ffer, Key2 must 
10200 62 65 20 74 68 65 20 73 68 6f 72 74 65 72 20 6f  be the shorter o
10210 66 20 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a  f the two..**.**
10220 20 48 69 73 74 6f 72 69 63 61 6c 20 6e 6f 74 65   Historical note
10230 3a 20 49 6e 20 65 61 72 6c 69 65 72 20 76 65 72  : In earlier ver
10240 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72 6f  sions of this ro
10250 75 74 69 6e 65 20 62 6f 74 68 20 4b 65 79 31 0a  utine both Key1.
10260 2a 2a 20 61 6e 64 20 4b 65 79 32 20 77 65 72 65  ** and Key2 were
10270 20 62 6c 6f 62 73 20 6f 62 74 61 69 6e 65 64 20   blobs obtained 
10280 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  from OP_MakeReco
10290 72 64 2e 20 20 42 75 74 20 77 65 20 66 6f 75 6e  rd.  But we foun
102a0 64 0a 2a 2a 20 74 68 61 74 20 69 6e 20 74 79 70  d.** that in typ
102b0 69 63 61 6c 20 75 73 65 20 74 68 65 20 73 61 6d  ical use the sam
102c0 65 20 4b 65 79 32 20 77 6f 75 6c 64 20 62 65 20  e Key2 would be 
102d0 73 75 62 6d 69 74 74 65 64 20 6d 75 6c 74 69 70  submitted multip
102e0 6c 65 20 74 69 6d 65 73 0a 2a 2a 20 69 6e 20 61  le times.** in a
102f0 20 72 6f 77 2e 20 20 53 6f 20 61 6e 20 6f 70 74   row.  So an opt
10300 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 61 64  imization was ad
10310 64 65 64 20 74 6f 20 70 61 72 73 65 20 74 68 65  ded to parse the
10320 20 4b 65 79 32 20 6b 65 79 0a 2a 2a 20 73 65 70   Key2 key.** sep
10330 61 72 61 74 65 6c 79 20 61 6e 64 20 73 75 62 6d  arately and subm
10340 69 74 20 74 68 65 20 70 61 72 73 65 64 20 76 65  it the parsed ve
10350 72 73 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73 20  rsion.  In this 
10360 77 61 79 2c 20 77 65 20 61 76 6f 69 64 0a 2a 2a  way, we avoid.**
10370 20 70 61 72 73 69 6e 67 20 74 68 65 20 73 61 6d   parsing the sam
10380 65 20 4b 65 79 32 20 6d 75 6c 74 69 70 6c 65 20  e Key2 multiple 
10390 74 69 6d 65 73 20 69 6e 20 61 20 72 6f 77 2e 0a  times in a row..
103a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
103b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
103c0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
103d0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
103e0 20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   .  UnpackedReco
103f0 72 64 20 2a 70 50 4b 65 79 32 0a 29 7b 0a 20 20  rd *pPKey2.){.  
10400 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
10410 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
10420 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
10430 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
10440 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
10450 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10460 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
10470 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
10480 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
10490 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
104a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
104b0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
104c0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46   i = 0;.  int nF
104d0 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ield;.  int rc =
104e0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
104f0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
10500 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
10510 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
10520 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10530 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
10540 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
10550 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
10560 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
10570 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
10580 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
10590 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66  fo->db;.  mem1.f
105a0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31  lags = 0;.  mem1
105b0 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  .zMalloc = 0;.  
105c0 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72  .  idx1 = getVar
105d0 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48  int32(aKey1, szH
105e0 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48  dr1);.  d1 = szH
105f0 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20 3d 20  dr1;.  nField = 
10600 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
10610 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c  ;.  while( idx1<
10620 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
10630 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  y2->nField ){.  
10640 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
10650 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
10660 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
10670 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
10680 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
10690 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
106a0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
106b0 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
106c0 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20  al_type1 );.    
106d0 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26  if( d1>=nKey1 &&
106e0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
106f0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
10700 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61  _type1)>0 ) brea
10710 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61  k;..    /* Extra
10720 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
10730 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
10740 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
10750 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10760 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
10770 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
10780 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
10790 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
107a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
107b0 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
107c0 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
107d0 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20  ->aMem[i],.     
107e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107f0 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f        i<nField ?
10800 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
10810 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  [i] : 0);.    if
10820 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
10830 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10840 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28    i++;.  }.  if(
10850 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20   mem1.zMalloc ) 
10860 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
10870 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20  lease(&mem1);.. 
10880 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6b   /* One of the k
10890 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
108a0 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20 74  ields, but all t
108b0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
108c0 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a 20  that point.  ** 
108d0 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74  were equal. If t
108e0 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67 20  he incrKey flag 
108f0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
10900 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73 0a  e second key is.
10910 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
10920 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  larger..  */.  i
10930 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
10940 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69 6e  if( pKeyInfo->in
10950 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  crKey ){.      r
10960 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
10970 65 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 2d  e if( !pKeyInfo-
10980 3e 70 72 65 66 69 78 49 73 45 71 75 61 6c 20 29  >prefixIsEqual )
10990 7b 0a 20 20 20 20 20 20 69 66 28 20 64 31 3c 6e  {.      if( d1<n
109a0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
109b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
109c0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
109d0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
109e0 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79  tOrder && i<pKey
109f0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20 20  Info->nField.   
10a00 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70              && p
10a10 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
10a20 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63  der[i] ){.    rc
10a30 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72   = -rc;.  }..  r
10a40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10a50 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
10a60 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  is an index entr
10a70 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67  y composed using
10a80 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
10a90 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68  rd opcode..** Th
10aa0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
10ab0 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75  this record shou
10ac0 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
10ad0 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a   (specifically.*
10ae0 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77  * an integer row
10af0 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  id).  This routi
10b00 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
10b10 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
10b20 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65  n.** that intege
10b30 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
10b40 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e  3VdbeIdxRowidLen
10b50 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29  (const u8 *aKey)
10b60 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  {.  u32 szHdr;  
10b70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10b80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
10b90 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
10ba0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
10bb0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
10bc0 2f 0a 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  /..  (void)getVa
10bd0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
10be0 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67 65 74  dr);.  (void)get
10bf0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 73  Varint32(&aKey[s
10c00 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
10c10 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  id);.  return sq
10c20 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10c30 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
10c40 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70  );.}.  ../*.** p
10c50 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
10c60 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
10c70 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
10c80 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
10c90 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
10ca0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
10cb0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
10cc0 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
10cd0 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
10ce0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10cf0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
10d00 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
10d10 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
10d20 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
10d30 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
10d40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
10d50 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
10d60 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
10d70 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
10d80 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
10d90 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
10da0 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
10db0 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
10dc0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
10dd0 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
10de0 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
10df0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
10e00 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
10e10 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
10e20 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e  KeySize(pCur, &n
10e30 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20  CellKey);.  if( 
10e40 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20  nCellKey<=0 ){. 
10e50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10e60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
10e70 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30   }.  m.flags = 0
10e80 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20  ;.  m.db = 0;.  
10e90 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  m.zMalloc = 0;. 
10ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
10eb0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
10ec0 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  ur, 0, nCellKey,
10ed0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
10ee0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
10ef0 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64 29  rc;.  }.  (void)
10f00 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
10f10 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
10f20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
10f30 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
10f40 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
10f50 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  ;.  lenRowid = s
10f60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10f70 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
10f80 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
10f90 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
10fa0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
10fb0 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
10fc0 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
10fd0 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
10fe0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
10ff0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11000 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11010 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
11020 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
11030 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
11040 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
11050 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
11060 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
11070 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
11080 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
11090 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
110a0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
110b0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
110c0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
110d0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
110e0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
110f0 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
11100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11110 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
11120 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
11130 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
11140 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
11150 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
11160 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
11170 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
11180 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
11190 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
111a0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
111b0 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 0a  gnored as well..
111c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
111d0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
111e0 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  .  Cursor *pC,  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11200 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
11210 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20  compare against 
11220 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
11230 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 0a  ord *pUnpacked,.
11240 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
11250 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  t u8 *pKey,   /*
11260 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70   The key to comp
11270 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  are */.  int *re
11280 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
11290 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
112a0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
112b0 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
112c0 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
112d0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
112e0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
112f0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  pC->pCursor;.  i
11300 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20 4d  nt lenRowid;.  M
11310 65 6d 20 6d 3b 0a 20 20 55 6e 70 61 63 6b 65 64  em m;.  Unpacked
11320 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 0a 20 20  Record *pRec;.  
11330 63 68 61 72 20 7a 53 70 61 63 65 5b 32 30 30 5d  char zSpace[200]
11340 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11350 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
11360 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
11370 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
11380 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20      *res = 0;.  
11390 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
113a0 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d  OK;.  }.  m.db =
113b0 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20   0;.  m.flags = 
113c0 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d  0;.  m.zMalloc =
113d0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
113e0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
113f0 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20  ee(pC->pCursor, 
11400 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  0, nCellKey, 1, 
11410 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
11420 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11430 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
11440 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
11450 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e 7a  owidLen((u8*)m.z
11460 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70 61 63  );.  if( !pUnpac
11470 6b 65 64 20 29 7b 0a 20 20 20 20 70 52 65 63 20  ked ){.    pRec 
11480 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
11490 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70 4b  ordUnpack(pC->pK
114a0 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b  eyInfo, nKey, pK
114b0 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 20 20 7a 53 70 61 63 65 2c 20 73 69 7a 65      zSpace, size
114e0 6f 66 28 7a 53 70 61 63 65 29 29 3b 0a 20 20 7d  of(zSpace));.  }
114f0 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 63 20 3d  else{.    pRec =
11500 20 70 55 6e 70 61 63 6b 65 64 3b 0a 20 20 7d 0a   pUnpacked;.  }.
11510 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29 7b    if( pRec==0 ){
11520 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11530 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
11540 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
11550 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11560 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d 2e  m.n-lenRowid, m.
11570 7a 2c 20 70 52 65 63 29 3b 0a 20 20 69 66 28 20  z, pRec);.  if( 
11580 21 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a 20 20  !pUnpacked ){.  
11590 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
115a0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  eteUnpackedRecor
115b0 64 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20 73  d(pRec);.  }.  s
115c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
115d0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
115e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
115f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11600 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
11610 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
11620 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
11630 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
11640 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
11650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11660 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
11670 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
11680 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
11690 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
116a0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
116b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
116c0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
116d0 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
116e0 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
116f0 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
11700 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
11710 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
11720 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
11730 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
11740 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
11750 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
11760 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
11770 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
11780 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
11790 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
117a0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
117b0 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
117c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
117d0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
117e0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
117f0 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
11800 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
11810 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
11820 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
11830 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
11840 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
11850 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
11860 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
11870 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
11880 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
11890 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
118a0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
118b0 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
118c0 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
118d0 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
118e0 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
118f0 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
11900 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
11910 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
11920 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
11930 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
11940 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
11950 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
11960 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
11970 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
11980 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
11990 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
119a0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
119b0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
119c0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
119d0 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
119e0 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
119f0 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
11a00 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
11a10 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
11a20 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
11a30 62 3b 0a 7d 0a                                   b;.}.