/ Hex Artifact Content
Login

Artifact e1198d1ea2e129bd56863794a223da670e1359c7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 31 30 20 32  eaux.c,v 1.410 2
02c0: 30 30 38 2f 30 39 2f 31 36 20 30 39 3a 30 39 3a  008/09/16 09:09:
02d0: 32 30 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  20 danielk1977 E
02e0: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0310: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65  >.#include "vdbe
0320: 49 6e 74 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  Int.h"..../*.** 
0330: 57 68 65 6e 20 64 65 62 75 67 67 69 6e 67 20 74  When debugging t
0340: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
0350: 72 20 69 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20  r in a symbolic 
0360: 64 65 62 75 67 67 65 72 2c 20 6f 6e 65 20 63 61  debugger, one ca
0370: 6e 0a 2a 2a 20 73 65 74 20 74 68 65 20 73 71 6c  n.** set the sql
0380: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0390: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
03a0: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
03b0: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
03c0: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
03d0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03e0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
0400: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0410: 64 6f 70 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  dopTrace = 0;.#e
0420: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ndif.../*.** Cre
0430: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
0440: 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
0450: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
0460: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 73 71  te3VdbeCreate(sq
0470: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
0480: 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  be *p;.  p = sql
0490: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
04a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65  (db, sizeof(Vdbe
04b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
04c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
04d0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20  >db = db;.  if( 
04e0: 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  db->pVdbe ){.   
04f0: 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65   db->pVdbe->pPre
0500: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  v = p;.  }.  p->
0510: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62  pNext = db->pVdb
0520: 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20  e;.  p->pPrev = 
0530: 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  0;.  db->pVdbe =
0540: 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   p;.  p->magic =
0550: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
0560: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0570: 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
0580: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66  the SQL string f
0590: 6f 72 20 61 20 70 72 65 70 61 72 65 64 20 73 74  or a prepared st
05a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
05b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 53   sqlite3VdbeSetS
05c0: 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  ql(Vdbe *p, cons
05d0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
05e0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
0600: 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a  ( p->zSql==0 );.
0610: 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69    p->zSql = sqli
0620: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
0630: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  db, z, n);.}../*
0640: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
0650: 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  QL associated wi
0660: 74 68 20 61 20 70 72 65 70 61 72 65 64 20 73 74  th a prepared st
0670: 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74  atement.*/.const
0680: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73   char *sqlite3_s
0690: 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ql(sqlite3_stmt 
06a0: 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65 74 75 72  *pStmt){.  retur
06b0: 6e 20 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74  n ((Vdbe *)pStmt
06c0: 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  )->zSql;.}../*.*
06d0: 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65  * Swap all conte
06e0: 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56  nt between two V
06f0: 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a  DBE structures..
0700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0710: 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41  dbeSwap(Vdbe *pA
0720: 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56  , Vdbe *pB){.  V
0730: 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a  dbe tmp, *pTmp;.
0740: 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20    char *zTmp;.  
0750: 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20  int nTmp;.  tmp 
0760: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0770: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0780: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
0790: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
07a0: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
07b0: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
07c0: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
07d0: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
07e0: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
07f0: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0800: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
0810: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
0820: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
0830: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
0840: 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71    nTmp = pA->nSq
0850: 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20  l;.  pA->nSql = 
0860: 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->nSql;.  pB->
0870: 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a  nSql = nTmp;.}..
0880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0890: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  BUG./*.** Turn t
08a0: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
08b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
08c0: 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a  VdbeTrace(Vdbe *
08d0: 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b  p, FILE *trace){
08e0: 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72  .  p->trace = tr
08f0: 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ace;.}.#endif../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
0930: 6e 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a  ns at least N.**
0940: 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   elements..**.**
0950: 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   If an out-of-me
0960: 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72  mory error occur
0970: 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67  s while resizing
0980: 20 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56   the array,.** V
0990: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
09a0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09b0: 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73   unchanged (this
09c0: 20 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61   is so that.** a
09d0: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
09e0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
09f0: 20 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65   be correctly de
0a00: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
0a10: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
0a20: 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a   of the Vdbe)..*
0a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
0a40: 73 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65  sizeOpArray(Vdbe
0a50: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56   *p, int N){.  V
0a60: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 70  dbeOp *pNew;.  p
0a70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a80: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a90: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ab0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ac0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ad0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  Op = pNew;.  }.}
0ae0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0af0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0b00: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0b10: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0b20: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0b30: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0b40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0b60: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0b70: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0b80: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0b90: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0ba0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0bb0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0bc0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0bd0: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0be0: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
0bf0: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
0c00: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0c20: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0c30: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0c40: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0c50: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
0c60: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
0c70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0c80: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
0c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0ca0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
0cb0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0cc0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
0cd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0ce0: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0cf0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0d00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0d10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0d30: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0d40: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
0d50: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
0d60: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
0d70: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
0d80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0d90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0db0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0dc0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0dd0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0de0: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0df0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
0e00: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
0e10: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
0e20: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
0e30: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
0e40: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
0e50: 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72  USED;.  p->expir
0e60: 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
0e70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f  QLITE_DEBUG.  pO
0e80: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
0e90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
0ea0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 73  beAddopTrace ) s
0eb0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
0ec0: 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  p(0, i, &p->aOp[
0ed0: 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i]);.#endif.#ifd
0ee0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
0ef0: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
0f00: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
0f10: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
0f20: 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn i;.}.int sqli
0f30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64  te3VdbeAddOp0(Vd
0f40: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a  be *p, int op){.
0f50: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0f60: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
0f70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e  , 0, 0, 0);.}.in
0f80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0f90: 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op1(Vdbe *p, int
0fa0: 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20   op, int p1){.  
0fb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
0fc0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
0fd0: 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74  p1, 0, 0);.}.int
0fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0ff0: 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p2(Vdbe *p, int 
1000: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1010: 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p2){.  return sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1030: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30  p, op, p1, p2, 0
1040: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1050: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1060: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1070: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1080: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1090: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
10a0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
10b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
10c0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
10e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1100: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1110: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1120: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1130: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1140: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1150: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1170: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
1180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1190: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
11a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
11b0: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
11c0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
11d0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
11e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
11f0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1200: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
1210: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1220: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
1230: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
1240: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1250: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
1260: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f  ymbolic label fo
1270: 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  r an instruction
1280: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1290: 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54   be.** coded.  T
12a0: 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  he symbolic labe
12b0: 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  l is really just
12c0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12d0: 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65  er.  The.** labe
12e0: 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  l can be used as
12f0: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66   the P2 value of
1300: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20   an operation.  
1310: 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74  Later, when.** t
1320: 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f  he label is reso
1330: 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66  lved to a specif
1340: 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20  ic address, the 
1350: 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a  VDBE will scan.*
1360: 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70  * through its op
1370: 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  eration list and
1380: 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75   change all valu
1390: 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d  es of P2 which m
13a0: 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65  atch.** the labe
13b0: 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c  l into the resol
13c0: 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ved address..**.
13d0: 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77  ** The VDBE know
13e0: 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75  s that a P2 valu
13f0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63  e is a label bec
1400: 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a  ause labels are.
1410: 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69  ** always negati
1420: 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73  ve and P2 values
1430: 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20   are suppose to 
1440: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  be non-negative.
1450: 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67  .** Hence, a neg
1460: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69  ative P2 value i
1470: 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68  s a label that h
1480: 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73  as yet to be res
1490: 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  olved..**.** Zer
14a0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
14b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14c0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
14d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56  3VdbeMakeLabel(V
14e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
14f0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  ;.  i = p->nLabe
1500: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l++;.  assert( p
1510: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1520: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1530: 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c  ( i>=p->nLabelAl
1540: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  loc ){.    p->nL
1550: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  abelAlloc = p->n
1560: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31  LabelAlloc*2 + 1
1570: 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  0;.    p->aLabel
1580: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1590: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
15a0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
15e0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
15f0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1600: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1610: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1620: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1630: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1640: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1650: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1660: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1670: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1680: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1690: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
16a0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
16b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16c0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
16d0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
16e0: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
16f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1700: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1710: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1720: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1730: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1740: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
1760: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
1770: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
1780: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1790: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
17a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
17b0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
17c0: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
17d0: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
17e0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a  t are negative.*
17f0: 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75  * on jump instru
1800: 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75  ctions.  Each su
1810: 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  ch value is a la
1820: 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68  bel.  Resolve th
1830: 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65  e.** label by se
1840: 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c  tting the P2 val
1850: 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  ue to its correc
1860: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  t non-zero value
1870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1880: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
1890: 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  nce after all op
18a0: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
18b0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  inserted..**.** 
18c0: 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75  Variable *pMaxFu
18d0: 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f  ncArgs is set to
18e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
18f0: 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67  ue of any P2 arg
1900: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20  ument .** to an 
1910: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f  OP_Function, OP_
1920: 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46  AggStep or OP_VF
1930: 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68  ilter opcode. Th
1940: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a  is is used by .*
1950: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  * sqlite3VdbeMak
1960: 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65  eReady() to size
1970: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
1980: 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  ] array..**.** T
1990: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
19a0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
19b0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
19c0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
19d0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
19e0: 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65  that might cause
19f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
1a00: 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73  lback.  Such ins
1a10: 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  tructions.** are
1a20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
1a30: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
1a40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
1a50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
1a60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
1a70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
1a80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
1a90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49  _VRename.**.** I
1aa0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1ab0: 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ction is found, 
1ac0: 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65  then every State
1ad0: 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ment instruction
1ae0: 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20   .** is changed 
1af0: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74  to a Noop.  In t
1b00: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b10: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b20: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75  tatement .** jou
1b30: 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65  rnal file unnece
1b40: 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ssarily..*/.stat
1b50: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
1b60: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
1b70: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
1b80: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
1b90: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30  int nMaxArgs = 0
1ba0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1bb0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1bc0: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1bd0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1be0: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1bf0: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c00: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c10: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c20: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1c30: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1c40: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1c50: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1c60: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1c70: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1c80: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1c90: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
1ca0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1cb0: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64  = pOp->p5;.#ifnd
1cc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1cd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1ce0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1cf0: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
1d00: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1d10: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
1d20: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
1d30: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1d40: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
1d50: 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69  _Halt ){.      i
1d60: 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  f( pOp->p1==SQLI
1d70: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
1d80: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
1d90: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  rt ){.        do
1da0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1db0: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
1dc0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1dd0: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
1de0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ent ){.      has
1df0: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1e00: 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
1e10: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73  ( opcode==OP_Des
1e20: 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 64 6f  troy ){.      do
1e30: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1e40: 61 63 6b 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  ack = 1;.#ifndef
1e50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1e60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1e70: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1e80: 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70  OP_VUpdate || op
1e90: 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65  code==OP_VRename
1ea0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1eb0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1ec0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1ed0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46  f( opcode==OP_VF
1ee0: 69 6c 74 65 72 20 29 7b 0a 20 20 20 20 20 20 69  ilter ){.      i
1ef0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  nt n;.      asse
1f00: 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e  rt( p->nOp - i >
1f10: 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  = 3 );.      ass
1f20: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
1f30: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
1f40: 29 3b 0a 20 20 20 20 20 20 6e 20 3d 20 70 4f 70  );.      n = pOp
1f50: 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69  [-1].p1;.      i
1f60: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
1f70: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65  nMaxArgs = n;.#e
1f80: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
1f90: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4f  if( sqlite3VdbeO
1fa0: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
1fb0: 28 6f 70 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a  (opcode, OPFLG_J
1fc0: 55 4d 50 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c  UMP) && pOp->p2<
1fd0: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1fe0: 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d  t( -1-pOp->p2<p-
1ff0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
2000: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
2010: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
2020: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2030: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
2040: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 2d  p->aLabel);.  p-
2050: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a 20 20  >aLabel = 0;..  
2060: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20  *pMaxFuncArgs = 
2070: 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f 2a 20  nMaxArgs;..  /* 
2080: 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f 6c 6c  If we never roll
2090: 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
20a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
20b0: 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  en statement.  *
20c0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  * transactions a
20d0: 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20  re not needed.  
20e0: 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72 79 20  So change every 
20f0: 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20 20 2a  OP_Statement.  *
2100: 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 61 6e  * opcode into an
2110: 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69 73 20   OP_Noop.  This 
2120: 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74 6f 20  avoid a call to 
2130: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
2140: 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20 77 68  lusive().  ** wh
2150: 69 63 68 20 63 61 6e 20 62 65 20 65 78 70 65 6e  ich can be expen
2160: 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70 6c 61  sive on some pla
2170: 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20 20 69  tforms..  */.  i
2180: 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42  f( hasStatementB
2190: 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53 74 61  egin && !doesSta
21a0: 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 29  tementRollback )
21b0: 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 70 2d  {.    for(pOp=p-
21c0: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
21d0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
21e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
21f0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 53  Op->opcode==OP_S
2200: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  tatement ){.    
2210: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2220: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
2230: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
2240: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2250: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2260: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2270: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
2280: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
2290: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
22a0: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
22b0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
22c0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
22d0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
22e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
22f0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
2300: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
2310: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
2320: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
2330: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
2340: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
2350: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
2360: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
2370: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
2380: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
2390: 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e  onst *aOp){.  in
23a0: 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65 72 74  t addr;.  assert
23b0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
23c0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
23d0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f   if( p->nOp + nO
23e0: 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  p > p->nOpAlloc 
23f0: 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41  ){.    resizeOpA
2400: 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c  rray(p, p->nOpAl
2410: 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  loc ? p->nOpAllo
2420: 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f  c*2 : 1024/sizeo
2430: 66 28 4f 70 29 29 3b 0a 20 20 20 20 61 73 73 65  f(Op));.    asse
2440: 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f 70 3c 3d  rt( p->nOp+nOp<=
2450: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c 7c 20 70  p->nOpAlloc || p
2460: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2470: 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ed );.  }.  if( 
2480: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
2490: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
24a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
24b0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
24c0: 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74  nOp>0 ){.    int
24d0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
24e0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
24f0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
2500: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
2510: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
2520: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
2530: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
2540: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
2550: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
2560: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
2570: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
2580: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
2590: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26        if( p2<0 &
25a0: 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63  & sqlite3VdbeOpc
25b0: 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 70  odeHasProperty(p
25c0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50 46  Out->opcode, OPF
25d0: 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20 20  LG_JUMP) ){.    
25e0: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
25f0: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
2600: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2610: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
2620: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
2630: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
2640: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
2650: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
2660: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
2670: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
2680: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
2690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26a0: 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d  EBUG.      pOut-
26b0: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20  >zComment = 0;. 
26c0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26d0: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
26e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26f0: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20  3VdbePrintOp(0, 
2700: 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b  i+addr, &p->aOp[
2710: 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20  i+addr]);.      
2720: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
2730: 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70     p->nOp += nOp
2740: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
2750: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ddr;.}../*.** Ch
2760: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
2770: 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64  f the P1 operand
2780: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
2790: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
27a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27b0: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
27c0: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
27d0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
27e0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
27f0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
2800: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
2810: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
2820: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
2830: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
2840: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
2850: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
2860: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2870: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
2880: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
2890: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
28a0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28b0: 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26   p && addr>=0 &&
28c0: 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20   p->nOp>addr && 
28d0: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d  p->aOp ){.    p-
28e0: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20  >aOp[addr].p1 = 
28f0: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
2900: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
2910: 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65  ue of the P2 ope
2920: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
2930: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
2940: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2950: 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73   is useful for s
2960: 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65  etting a jump de
2970: 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  stination..*/.vo
2980: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2990: 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20  angeP2(Vdbe *p, 
29a0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
29b0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
29c0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
29d0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
29e0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
29f0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
2a00: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2a10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2a20: 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p2 = val;.  }
2a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2a40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2a50: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P3 operand for
2a60: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
2a70: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
2a80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2a90: 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP3(Vdbe *p, in
2aa0: 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  t addr, int val)
2ab0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
2ac0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
2ad0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2ae0: 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72  .  if( p && addr
2af0: 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64  >=0 && p->nOp>ad
2b00: 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a  dr && p->aOp ){.
2b10: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
2b20: 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p3 = val;.  }.}
2b30: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2b40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
2b50: 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74  P5 operand for t
2b60: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2b70: 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74  .** added operat
2b80: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
2b90: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2ba0: 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c  (Vdbe *p, u8 val
2bb0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2bc0: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2bd0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2be0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
2bf0: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
2c00: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
2c10: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
2c20: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
2c30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2c40: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
2c50: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
2c60: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
2c70: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
2c80: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2c90: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2ca0: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
2cb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2cc0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
2cd0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
2ce0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cf0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
2d00: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
2d10: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
2d20: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
2d30: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
2d40: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
2d50: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
2d60: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
2d70: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
2d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2d90: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
2da0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
2db0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
2dc0: 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26 20  {.  if( pDef && 
2dd0: 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53  (pDef->flags & S
2de0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
2df0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
2e00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
2e10: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
2e20: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
2e30: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
2e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e50: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
2e60: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
2e70: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
2e80: 28 20 70 34 20 29 7b 0a 20 20 20 20 73 77 69 74  ( p4 ){.    swit
2e90: 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20  ch( p4type ){.  
2ea0: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
2eb0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2ec0: 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73  INT64:.      cas
2ed0: 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20 20  e P4_MPRINTF:.  
2ee0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
2ef0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
2f00: 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20  P4_KEYINFO:.    
2f10: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
2f20: 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AY:.      case P
2f30: 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
2f40: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  F: {.        sql
2f50: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2f60: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
2f70: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2f80: 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e   case P4_VDBEFUN
2f90: 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62  C: {.        Vdb
2fa0: 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63  eFunc *pVdbeFunc
2fb0: 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70   = (VdbeFunc *)p
2fc0: 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45  4;.        freeE
2fd0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
2fe0: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d 3e  (db, pVdbeFunc->
2ff0: 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  pFunc);.        
3000: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
3010: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75  eAuxData(pVdbeFu
3020: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
3030: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3040: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  , pVdbeFunc);.  
3050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3060: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3070: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
3080: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3090: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
30a0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
30b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
30d0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
30e0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
30f0: 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ree((sqlite3_val
3100: 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  ue*)p4);.       
3110: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3120: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
3130: 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 63  .** Change N opc
3140: 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  odes starting at
3150: 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e   addr to No-ops.
3160: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3170: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
3180: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
3190: 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  dr, int N){.  if
31a0: 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ( p && p->aOp ){
31b0: 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  .    VdbeOp *pOp
31c0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
31d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
31e0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 77  b = p->db;.    w
31f0: 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20 20  hile( N-- ){.   
3200: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
3210: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
3220: 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d  p4.p);.      mem
3230: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
3240: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
3250: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
3260: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
3270: 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  pOp++;.    }.  }
3280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
3290: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
32a0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
32b0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
32c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
32d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
32e0: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
32f0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
3300: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
3310: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
3320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
3330: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
3340: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
3350: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
3360: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
3370: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
3380: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
3390: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
33a0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
33b0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
33c0: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
33d0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
33e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
33f0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
3400: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
3410: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
3420: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
3430: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
3440: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
3450: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
3460: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
3470: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f  .**.** If n==P4_
3480: 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73  KEYINFO it means
3490: 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70   that zP4 is a p
34a0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
34b0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  nfo structure..*
34c0: 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65  * A copy is made
34d0: 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20   of the KeyInfo 
34e0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d  structure into m
34f0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
3500: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
3510: 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65  alloc, to be fre
3520: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
3530: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a   is finalized..*
3540: 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f  * n==P4_KEYINFO_
3550: 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65  HANDOFF indicate
3560: 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  s that zP4 point
3570: 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73  s to a KeyInfo s
3580: 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72  tructure.** stor
3590: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61  ed in memory tha
35a0: 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
35b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
35c0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54  qlite3_malloc. T
35d0: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
35e0: 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68  ould not free th
35f0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74  e allocation, it
3600: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77   will be freed w
3610: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a  hen the Vdbe is.
3620: 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  ** finalized..**
3630: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
3640: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
3650: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
3660: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
3670: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
3680: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
3690: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
36a0: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
36b0: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
36c0: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
36d0: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
36e0: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
36f0: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
3700: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
3710: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
3720: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
3730: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
3740: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
3750: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3760: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
3770: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
3780: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
3790: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
37a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
37b0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
37c0: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
37d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
37e0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
37f0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  IT );.  if( p->a
3800: 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op==0 || db->mal
3810: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
3820: 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45 59   if (n != P4_KEY
3830: 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66 72  INFO) {.      fr
3840: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69  eeP4(db, n, (voi
3850: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34  d*)*(char**)&zP4
3860: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
3870: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3880: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
3890: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
38a0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
38b0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  nOp - 1;.    if(
38c0: 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e   addr<0 ) return
38d0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
38e0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
38f0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
3900: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
3910: 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  );.  pOp->p4.p =
3920: 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f   0;.  if( n==P4_
3930: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
3940: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
3950: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
3960: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
3970: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
3980: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
3990: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
39a0: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
39b0: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53     pOp->p4.i = S
39c0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
39d0: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
39e0: 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65  p4type = n;.  }e
39f0: 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29  lse if( zP4==0 )
3a00: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3a10: 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  = 0;.    pOp->p4
3a20: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3a30: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  D;.  }else if( n
3a40: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a  ==P4_KEYINFO ){.
3a50: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
3a60: 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e  yInfo;.    int n
3a70: 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20  Field, nByte;.. 
3a80: 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65     nField = ((Ke
3a90: 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69  yInfo*)zP4)->nFi
3aa0: 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  eld;.    nByte =
3ab0: 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66   sizeof(*pKeyInf
3ac0: 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a  o) + (nField-1)*
3ad0: 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d  sizeof(pKeyInfo-
3ae0: 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69  >aColl[0]) + nFi
3af0: 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  eld;.    pKeyInf
3b00: 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  o = sqlite3Mallo
3b10: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
3b20: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
3b30: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
3b40: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3b50: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74  .      u8 *aSort
3b60: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d  Order;.      mem
3b70: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20 7a 50  cpy(pKeyInfo, zP
3b80: 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  4, nByte);.     
3b90: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b   aSortOrder = pK
3ba0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
3bb0: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53  er;.      if( aS
3bc0: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  ortOrder ){.    
3bd0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53      pKeyInfo->aS
3be0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69  ortOrder = (unsi
3bf0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79  gned char*)&pKey
3c00: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65  Info->aColl[nFie
3c10: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ld];.        mem
3c20: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  cpy(pKeyInfo->aS
3c30: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f  ortOrder, aSortO
3c40: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20  rder, nField);. 
3c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70       }.      pOp
3c60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45  ->p4type = P4_KE
3c70: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65  YINFO;.    }else
3c80: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d  {.      p->db->m
3c90: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
3ca0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  .      pOp->p4ty
3cb0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
3cc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
3cd0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
3ce0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20  _HANDOFF ){.    
3cf0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3d00: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3d10: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59  >p4type = P4_KEY
3d20: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66  INFO;.  }else if
3d30: 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70  ( n<0 ){.    pOp
3d40: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
3d50: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
3d60: 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73  type = n;.  }els
3d70: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  e{.    if( n==0 
3d80: 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 50 34  ) n = strlen(zP4
3d90: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a  );.    pOp->p4.z
3da0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
3db0: 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20  Dup(p->db, zP4, 
3dc0: 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  n);.    pOp->p4t
3dd0: 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43  ype = P4_DYNAMIC
3de0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3df0: 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68   NDEBUG./*.** Ch
3e00: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
3e10: 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74   on the the most
3e20: 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20   recently coded 
3e30: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72  instruction.  Or
3e40: 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d  .** insert a No-
3e50: 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65 20 63  op and add the c
3e60: 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e  omment to that n
3e70: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ew instruction. 
3e80: 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74   This.** makes t
3e90: 68 65 20 63 6f 64 65 20 65 61 73 69 65 72 20 74  he code easier t
3ea0: 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20 64 65  o read during de
3eb0: 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f  bugging.  None o
3ec0: 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a  f this happens.*
3ed0: 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f  * in a productio
3ee0: 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  n build..*/.void
3ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d   sqlite3VdbeComm
3f00: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
3f10: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3f20: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3f30: 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t ap;.  assert( 
3f40: 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61  p->nOp>0 || p->a
3f50: 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Op==0 );.  asser
3f60: 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  t( p->aOp==0 || 
3f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
3f80: 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20  .zComment==0 || 
3f90: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3fa0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
3fb0: 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20  nOp ){.    char 
3fc0: 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70  **pz = &p->aOp[p
3fd0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
3fe0: 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  t;.    va_start(
3ff0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
4000: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4010: 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20  p->db, *pz);.   
4020: 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d   *pz = sqlite3VM
4030: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
4040: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
4050: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
4060: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
4070: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
4080: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
4090: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
40a0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
40b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
40c0: 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b  Op0(p, OP_Noop);
40d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
40e0: 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30  p>0 || p->aOp==0
40f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
4100: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f  >aOp==0 || p->aO
4110: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4120: 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ment==0 || p->db
4130: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4140: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29  ;.  if( p->nOp )
4150: 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20  {.    char **pz 
4160: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
4170: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20  -1].zComment;.  
4180: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
4190: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c  Format);.    sql
41a0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
41b0: 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20  , *pz);.    *pz 
41c0: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
41d0: 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74  f(p->db, zFormat
41e0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
41f0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  d(ap);.  }.}.#en
4200: 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a  dif  /* NDEBUG *
4210: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
4220: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
4230: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a   given address..
4240: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
4250: 65 33 56 64 62 65 47 65 74 4f 70 28 56 64 62 65  e3VdbeGetOp(Vdbe
4260: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
4270: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
4280: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
4290: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
42a0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
42b0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
42c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
42d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61   );.  return ((a
42e0: 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70  ddr>=0 && addr<p
42f0: 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b  ->nOp)?(&p->aOp[
4300: 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69  addr]):0);.}..#i
4310: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4320: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20  E_OMIT_EXPLAIN) 
4330: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  || !defined(NDEB
4340: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65  UG) \.     || de
4350: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49  fined(VDBE_PROFI
4360: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  LE) || defined(S
4370: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a  QLITE_DEBUG)./*.
4380: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
4390: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
43a0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65  es the P4 parame
43b0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64  ter for an opcod
43c0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20  e..** Use zTemp 
43d0: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64  for any required
43e0: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65   temporary buffe
43f0: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  r space..*/.stat
4400: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79  ic char *display
4410: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72  P4(Op *pOp, char
4420: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65   *zTemp, int nTe
4430: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34  mp){.  char *zP4
4440: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65   = zTemp;.  asse
4450: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b  rt( nTemp>=20 );
4460: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e  .  switch( pOp->
4470: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  p4type ){.    ca
4480: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54  se P4_KEYINFO_ST
4490: 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50  ATIC:.    case P
44a0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
44b0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
44c0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
44d0: 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Info = pOp->p4.p
44e0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73  KeyInfo;.      s
44f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4500: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b  nTemp, zTemp, "k
4510: 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79  eyinfo(%d", pKey
4520: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
4530: 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28       i = strlen(
4540: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f  zTemp);.      fo
4550: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66  r(j=0; j<pKeyInf
4560: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b  o->nField; j++){
4570: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
4580: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e   *pColl = pKeyIn
4590: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  fo->aColl[j];.  
45a0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20        if( pColl 
45b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
45c0: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c   n = strlen(pCol
45d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
45e0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
45f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4600: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4610: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4620: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4630: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4640: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4650: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4660: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4670: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4680: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4690: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
46a0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
46b0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
46c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
46d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
46e0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
46f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4700: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4710: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4720: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4730: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4740: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4750: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4770: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4780: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4790: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
47a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
47b0: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
47c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
47d0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
47e0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
47f0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4800: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4820: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
4830: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
4840: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4860: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
4870: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4880: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4890: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
48a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
48b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
48c0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
48d0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
48e0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
48f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4900: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4910: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4920: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4930: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
4940: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
4950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4960: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
4970: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4980: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4990: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
49a0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
49b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
49c0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
49d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
49e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
49f0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
4a00: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
4a10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4a20: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
4a30: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
4a40: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
4a50: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
4a60: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4a70: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
4a80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
4a90: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
4aa0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
4ab0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
4ac0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4ad0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
4ae0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4af0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4b00: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4b10: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
4b20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4b30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4b40: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
4b50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4b60: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4b70: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
4b80: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4b90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4ba0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4bb0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4bc0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4bd0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4be0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
4bf0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
4c00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4c10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4c20: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
4c30: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
4c40: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
4c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4c60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
4c70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
4c80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4c90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4ca0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
4cb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4cc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4cd0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
4ce0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
4cf0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
4d00: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
4d10: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
4d20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4d30: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
4d40: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
4d50: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
4d60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
4d70: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
4d80: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
4d90: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
4da0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f  ] is used..**.*/
4db0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4dc0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
4dd0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
4de0: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
4df0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
4e00: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4e10: 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e  rt( i<sizeof(p->
4e20: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
4e30: 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20    mask = 1<<i;. 
4e40: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
4e50: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
4e60: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
4e70: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
4e80: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
4e90: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
4ea0: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
4eb0: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
4ec0: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
4ed0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4ee0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4ef0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
4f00: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
4f10: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
4f20: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
4f30: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
4f40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4f50: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
4f60: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
4f70: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
4f80: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
4f90: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
4fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4fb0: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
4fc0: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
4fd0: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
4fe0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
4ff0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
5000: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
5010: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
5020: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
5030: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
5040: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
5050: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
5060: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
5070: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
5080: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
5090: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
50a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
50b0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
50c0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
50d0: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
50e0: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
50f0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
5100: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
5110: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
5120: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
5130: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5140: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5150: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
5160: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
5170: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
5180: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 6e 74  = p->db;.    int
5190: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d   malloc_failed =
51a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
51b0: 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  d;.    while( N-
51c0: 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ->0 ){.      ass
51d0: 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b 30 5d  ert( N<2 || p[0]
51e0: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a  .db==p[1].db );.
51f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5200: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
5210: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
5220: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
5230: 20 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20   p++;.    }.    
5240: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5250: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
5260: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20  ;.  }.}..#ifdef 
5270: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
5280: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
5290: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
52a0: 65 6c 65 61 73 65 42 75 66 66 65 72 73 28 56 64  eleaseBuffers(Vd
52b0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69  be *p){.  int ii
52c0: 3b 0a 20 20 69 6e 74 20 6e 46 72 65 65 20 3d 20  ;.  int nFree = 
52d0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
52e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
52f0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
5300: 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c  .  for(ii=1; ii<
5310: 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b  =p->nMem; ii++){
5320: 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
5330: 20 26 70 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20   &p->aMem[ii];. 
5340: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26     if( pMem->z &
5350: 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45  & pMem->flags&ME
5360: 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 61  M_Dyn ){.      a
5370: 73 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44  ssert( !pMem->xD
5380: 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  el );.      nFre
5390: 65 20 2b 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  e += sqlite3DbMa
53a0: 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64  llocSize(pMem->d
53b0: 62 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  b, pMem->z);.   
53c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
53d0: 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
53e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
53f0: 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64  rn nFree;.}.#end
5400: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
5410: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
5420: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
5430: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
5440: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
5450: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
5460: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
5470: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
5480: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
5490: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
54a0: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
54b0: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
54c0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
54d0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
54e0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
54f0: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
5500: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
5510: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
5520: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
5530: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
5540: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
5550: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
5560: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
5570: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
5580: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
5590: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
55a0: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
55b0: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
55c0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
55d0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
55e0: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
55f0: 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20  RY PLAN..*/.int 
5600: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
5610: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5630: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
5640: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5650: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ->db;.  int i;. 
5660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5670: 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  _OK;.  Mem *pMem
5680: 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74   = p->pResultSet
5690: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
56a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78  .  assert( p->ex
56b0: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70  plain );.  if( p
56c0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
56d0: 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e  GIC_RUN ) return
56e0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
56f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
5700: 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic==SQLITE_MAGI
5710: 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65  C_BUSY );.  asse
5720: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
5730: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
5740: 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20  QLITE_BUSY );.. 
5750: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
5760: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
5770: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
5780: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
5790: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
57a0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
57b0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
57c0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
57d0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
57e0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
57f0: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
5800: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
5810: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
5820: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
5830: 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  (pMem, p->nMem);
5840: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
5850: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
5860: 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70  e( i<p->nOp && p
5870: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
5880: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
5890: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
58a0: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
58b0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
58c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
58d0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
58e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
58f0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
5900: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
5910: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
5920: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5930: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
5940: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
5950: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
5960: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
5970: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
5980: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
5990: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  ;.    Op *pOp = 
59a0: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
59b0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
59c0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
59d0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
59e0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
59f0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5a00: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
5a10: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
5a40: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
5a50: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
5a60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5a70: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
5a80: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
5a90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
5aa0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
5ab0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
5ac0: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
5ad0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
5ae0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5af0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5b00: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5b10: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
5b20: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
5b30: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
5b40: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5b50: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
5b60: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
5b70: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5b80: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
5b90: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
5bc0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
5bd0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
5be0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
5bf0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5c00: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5c10: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
5c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c30: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
5c40: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5c50: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5c60: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5c70: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
5c80: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
5c90: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5ca0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
5cb0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
5ce0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
5cf0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5d00: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
5d10: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
5d20: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
5d30: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
5d40: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
5d50: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70  /* P4 */.      p
5d60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
5d70: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
5d80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
5d90: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  M;.    }.    pMe
5da0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
5db0: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
5dc0: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
5dd0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
5de0: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
5df0: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
5e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5e10: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
5e20: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
5e30: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
5e40: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
5e50: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
5e60: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
5e70: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
5e80: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
5e90: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5ea0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
5eb0: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
5ec0: 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  XT;.    pMem++;.
5ed0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5ee0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5ef0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
5f00: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20  emGrow(pMem, 4, 
5f10: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  0) ){.        p-
5f20: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
5f30: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  d = 1;.        r
5f40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
5f50: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
5f60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5f70: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
5f80: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
5f90: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
5fa0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
5fb0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
5fc0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
5fd0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
5fe0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5ff0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
6000: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
6010: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
6020: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
6030: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6040: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
6050: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
6060: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6070: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
6080: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
6090: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
60a0: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
60b0: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
60c0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
60d0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
60e0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
60f0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6100: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
6110: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6120: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
6130: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
6140: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6160: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
6170: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6180: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
6190: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
61a0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
61b0: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
61c0: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
61d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
61e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
61f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6200: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6210: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6220: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
6230: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6240: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
6250: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
6260: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
6270: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
6280: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
6290: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
62a0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
62b0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
62c0: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
62d0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
62e0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
62f0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6300: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6310: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
6320: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
6330: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
6340: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
6350: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
6360: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
6370: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
6380: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
6390: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
63a0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
63b0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
63c0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
63d0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
63e0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
63f0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
6400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6410: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
6420: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6430: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6440: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6450: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6460: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6470: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6480: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6490: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
64a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
64b0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
64c0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
64d0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
64e0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
64f0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6500: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
6510: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
6520: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6530: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6540: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6550: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6560: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6570: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6580: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
6590: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
65a0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
65b0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
65c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
65d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
65e0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
65f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6600: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
6610: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
6620: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6630: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6640: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6650: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6660: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6670: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6680: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
6690: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
66a0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
66b0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
66c0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
66d0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
66e0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
66f0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
6700: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
6710: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
6720: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6730: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6740: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6750: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6760: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6770: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6780: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
6790: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
67a0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
67b0: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
67c0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
67d0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
6800: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6830: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6840: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6850: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6880: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
6890: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
68a0: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68c0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
68d0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
68e0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6900: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
6910: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
6920: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6930: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6940: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6950: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6960: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6970: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6980: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
6990: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
69a0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
69b0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
69c0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
69d0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
69e0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
69f0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
6a00: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
6a10: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
6a20: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
6a30: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
6a40: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
6a50: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
6a60: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
6a70: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
6a80: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
6a90: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
6aa0: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
6ab0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
6ac0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
6ad0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
6ae0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
6af0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
6b00: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
6b10: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
6b20: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
6b30: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
6b40: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
6b50: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
6b60: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
6b70: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
6b80: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
6b90: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72  ace for.  ** Cur
6ba0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
6bb0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
6bc0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
6bd0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
6be0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
6bf0: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
6c00: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
6c10: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
6c20: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
6c30: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6c40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
6c50: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
6c60: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
6c70: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
6c80: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
6c90: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
6ca0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
6cb0: 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73   space for regis
6cc0: 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
6cd0: 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20   p->aMem==0 ){. 
6ce0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
6cf0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
6d00: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
6d10: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
6d20: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
6d30: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
6d40: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 2f 2a  , &nArg);.    /*
6d50: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
6d60: 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20 20 20   p->nOp);*/.    
6d70: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
6d80: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  );.    if( isExp
6d90: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
6da0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ){.      p->nMem
6db0: 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20   = nMem = 10;.  
6dc0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20    }.    p->aMem 
6dd0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6de0: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
6df0: 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65    nMem*sizeof(Me
6e00: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
6e10: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6e20: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6e30: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6e40: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6e50: 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f      + nArg*sizeo
6e60: 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20  f(Mem*)         
6e70: 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f       /* apArg */
6e80: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
6e90: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
6ea0: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
6eb0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72   */.      + nCur
6ec0: 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f  sor*sizeof(Curso
6ed0: 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20 61 70  r*) + 1    /* ap
6ee0: 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  Csr */.    );.  
6ef0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
6f00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
6f10: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
6f20: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
6f30: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
6f40: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  Mem */.      p->
6f50: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
6f60: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
6f70: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
6f80: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  */.      p->aVar
6f90: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d   = &p->aMem[nMem
6fa0: 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56  +1];.      p->nV
6fb0: 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20  ar = nVar;.     
6fc0: 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20   p->okVar = 0;. 
6fd0: 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20       p->apArg = 
6fe0: 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b  (Mem**)&p->aVar[
6ff0: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nVar];.      p->
7000: 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29  azVar = (char**)
7010: 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b  &p->apArg[nArg];
7020: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
7030: 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e  = (Cursor**)&p->
7040: 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  azVar[nVar];.   
7050: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
7060: 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66  nCursor;.      f
7070: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
7080: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
7090: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
70a0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
70b0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
70c0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
70d0: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
70e0: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
70f0: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
7100: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
7110: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
7120: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
7130: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7140: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7150: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
7160: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
7170: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
7180: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
7190: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
71a0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
71b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
71c0: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
71d0: 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63   0;.  p->errorAc
71e0: 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
71f0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d  .  p->explain |=
7200: 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d   isExplain;.  p-
7210: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
7220: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43  GIC_RUN;.  p->nC
7230: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  hange = 0;.  p->
7240: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20  cacheCtr = 1;.  
7250: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46  p->minWriteFileF
7260: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70  ormat = 255;.  p
7270: 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e  ->openedStatemen
7280: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
7290: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20  BE_PROFILE.  {. 
72a0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
72b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
72c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i++){.      p->
72d0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a  aOp[i].cnt = 0;.
72e0: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
72f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20  cycles = 0;.    
7300: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
7310: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44  /*.** Close a VD
7320: 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65  BE cursor and re
7330: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65  lease all the re
7340: 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72  sources that cur
7350: 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20  sor .** happens 
7360: 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64  to hold..*/.void
7370: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
7380: 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20  Cursor(Vdbe *p, 
7390: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
73a0: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
73b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
73c0: 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a  if( pCx->pBt ){.
73d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
73e0: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
73f0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d  .    /* The pCx-
7400: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65  >pCursor will be
7410: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63   close automatic
7420: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73  ally, if it exis
7430: 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68  ts, by.    ** th
7440: 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f  e call above. */
7450: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78  .  }else if( pCx
7460: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  ->pCursor ){.   
7470: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
7480: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43  seCursor(pCx->pC
7490: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e  ursor);.  }.#ifn
74a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
74b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
74c0: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
74d0: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
74e0: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
74f0: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
7500: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
7510: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
7520: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
7530: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
7540: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
7550: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28  ethod = 1;.    (
7560: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
7570: 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20  tyOff(p->db);.  
7580: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
7590: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
75a0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
75b0: 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29  3SafetyOn(p->db)
75c0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
75d0: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
75e0: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43 78  endif.  if( !pCx
75f0: 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62  ->ephemPseudoTab
7600: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
7610: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  3DbFree(p->db, p
7620: 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d 0a  Cx->pData);.  }.
7630: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
7640: 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65 70  ll cursors excep
7650: 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73 6f  t for VTab curso
7660: 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  rs that are curr
7670: 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e  ently.** in use.
7680: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7690: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45  closeAllCursorsE
76a0: 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73  xceptActiveVtabs
76b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
76c0: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
76d0: 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  sr==0 ) return;.
76e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
76f0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
7700: 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d 20     Cursor *pC = 
7710: 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20  p->apCsr[i];.   
7720: 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d 3e   if( pC && (!p->
7730: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20  inVtabMethod || 
7740: 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  !pC->pVtabCursor
7750: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
7760: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
7770: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 70  (p, pC);.      p
7780: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
7790: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
77a0: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
77b0: 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69  VM after executi
77c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
77d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f  outine will auto
77e0: 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20  matically close 
77f0: 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73  any cursors, lis
7800: 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f  ts, and/or.** so
7810: 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20  rters that were 
7820: 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61  left open.  It a
7830: 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20  lso deletes the 
7840: 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72  values of.** var
7850: 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56  iables in the aV
7860: 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ar[] array..*/.s
7870: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e  tatic void Clean
7880: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  up(Vdbe *p){.  i
7890: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
78a0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 63  *db = p->db;.  c
78b0: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78  loseAllCursorsEx
78c0: 63 65 70 74 41 63 74 69 76 65 56 74 61 62 73 28  ceptActiveVtabs(
78d0: 70 29 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  p);.  for(i=1; i
78e0: 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  <=p->nMem; i++){
78f0: 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65 46  .    MemSetTypeF
7900: 6c 61 67 28 26 70 2d 3e 61 4d 65 6d 5b 69 5d 2c  lag(&p->aMem[i],
7910: 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a   MEM_Null);.  }.
7920: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
7930: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70  y(&p->aMem[1], p
7940: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ->nMem);.  sqlit
7950: 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72 28  e3VdbeFifoClear(
7960: 26 70 2d 3e 73 46 69 66 6f 29 3b 0a 20 20 69 66  &p->sFifo);.  if
7970: 28 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  ( p->contextStac
7980: 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  k ){.    for(i=0
7990: 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ; i<p->contextSt
79a0: 61 63 6b 54 6f 70 3b 20 69 2b 2b 29 7b 0a 20 20  ackTop; i++){.  
79b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
79c0: 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 63 6f 6e  ifoClear(&p->con
79d0: 74 65 78 74 53 74 61 63 6b 5b 69 5d 2e 73 46 69  textStack[i].sFi
79e0: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  fo);.    }.    s
79f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7a00: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
7a10: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74  );.  }.  p->cont
7a20: 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20  extStack = 0;.  
7a30: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44  p->contextStackD
7a40: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  epth = 0;.  p->c
7a50: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d  ontextStackTop =
7a60: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
7a70: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
7a80: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
7a90: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
7aa0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
7ab0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
7ac0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
7ad0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
7ae0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
7af0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
7b00: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
7b10: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
7b20: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
7b30: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
7b40: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
7b50: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
7b60: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
7b70: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
7b80: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
7b90: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
7ba0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
7bb0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
7bc0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
7bd0: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
7be0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
7bf0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
7c00: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
7c10: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
7c20: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
7c30: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
7c40: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
7c50: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
7c60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
7c70: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
7c80: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
7c90: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
7ca0: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c  Column = nResCol
7cb0: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61  umn;.  p->aColNa
7cc0: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  me = pColName = 
7cd0: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d  (Mem*)sqlite3DbM
7ce0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
7cf0: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20  zeof(Mem)*n );. 
7d00: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65   if( p->aColName
7d10: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7d20: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29  while( n-- > 0 )
7d30: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  {.    pColName->
7d40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
7d50: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e  ;.    pColName->
7d60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
7d70: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a  pColName++;.  }.
7d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
7d90: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78   name of the idx
7da0: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65  'th column to be
7db0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
7dc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
7dd0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65  ** zName must be
7de0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
7df0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73  nul terminated s
7e00: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
7e10: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d  s call must be m
7e20: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ade after a call
7e30: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53   to sqlite3VdbeS
7e40: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a  etNumCols()..**.
7e50: 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f 53 54 41 54  ** If N==P4_STAT
7e60: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61  IC  it means tha
7e70: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69  t zName is a poi
7e80: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61  nter to a consta
7e90: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72  nt static.** str
7ea0: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a  ing and we can j
7eb0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
7ec0: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50  nter. If it is P
7ed0: 34 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  4_DYNAMIC, then 
7ee0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
7ef0: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  s freed using sq
7f00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7f10: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
7f20: 69 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  is finished with
7f30: 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73  .** it. Otherwis
7f40: 65 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e  e, N bytes of zN
7f50: 61 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a  ame are copied..
7f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
7f70: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62  beSetColName(Vdb
7f80: 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69  e *p, int idx, i
7f90: 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68  nt var, const ch
7fa0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e  ar *zName, int N
7fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
7fc0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
7fd0: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
7fe0: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
7ff0: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
8000: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
8010: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8020: 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
8030: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72  E_NOMEM;.  asser
8040: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
8050: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
8060: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
8070: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
8080: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e  olumn]);.  if( N
8090: 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20  ==P4_DYNAMIC || 
80a0: 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a  N==P4_STATIC ){.
80b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
80c0: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
80d0: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
80e0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
80f0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
8100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
8110: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
8120: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
8130: 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54   zName, N, SQLIT
8140: 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52  E_UTF8,SQLITE_TR
8150: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20  ANSIENT);.  }.  
8160: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8170: 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d  K && N==P4_DYNAM
8180: 49 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61  IC ){.    pColNa
8190: 6d 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28 7e 4d  me->flags &= (~M
81a0: 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20  EM_Static);.    
81b0: 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c 6c 6f  pColName->zMallo
81c0: 63 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 3b  c = pColName->z;
81d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
81e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
81f0: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
8200: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
8210: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
8220: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
8230: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
8240: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
8250: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
8260: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
8270: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
8280: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
8290: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
82a0: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
82b0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
82c0: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
82d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
82e0: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
82f0: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
8300: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
8310: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8320: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
8330: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
8340: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
8350: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
8360: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
8370: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8380: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
8390: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42  mit = 0;..  /* B
83a0: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
83b0: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
83c0: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
83d0: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
83e0: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
83f0: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
8400: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
8410: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
8420: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
8430: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
8440: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
8450: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8460: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
8470: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
8480: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
8490: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
84a0: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
84b0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
84c0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
84d0: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
84e0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  p->zErrMsg);.  i
84f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8500: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8510: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
8520: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
8530: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
8540: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
8550: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
8560: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
8570: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
8580: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
8590: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
85a0: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
85b0: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
85c0: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
85d0: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
85e0: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
85f0: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
8600: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
8610: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
8620: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
8630: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
8640: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
8650: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
8660: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
8670: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8680: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
8690: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
86a0: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
86b0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
86c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
86d0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
86e0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
86f0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
8700: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8710: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
8720: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
8730: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
8740: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
8750: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
8760: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
8770: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
8780: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
8790: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
87a0: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
87b0: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
87c0: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
87d0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
87e0: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
87f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8800: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
8810: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
8820: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
8830: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
8840: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8850: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
8860: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
8870: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
8880: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
8890: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
88a0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
88b0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
88c0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
88d0: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
88e0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
88f0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8900: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
8910: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
8920: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
8930: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8940: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
8950: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
8960: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
8970: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
8980: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
8990: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
89a0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
89b0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
89c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
89d0: 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72  trlen(sqlite3Btr
89e0: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
89f0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c  ->aDb[0].pBt)) |
8a00: 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20  | nTrans<=1 ){. 
8a10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
8a20: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
8a30: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8a40: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
8a50: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8a60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
8a70: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8a80: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8a90: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
8aa0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8ab0: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
8ac0: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
8ad0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
8ae0: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
8af0: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
8b00: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
8b10: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
8b20: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
8b30: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
8b40: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
8b50: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
8b60: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
8b70: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
8b80: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
8b90: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
8ba0: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
8bb0: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
8bc0: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
8bd0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
8be0: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
8bf0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
8c00: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
8c10: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
8c20: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8c30: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
8c40: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
8c50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8c60: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
8c70: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
8c80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
8c90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8ca0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8cb0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
8cc0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8cd0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
8ce0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
8cf0: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
8d00: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
8d10: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
8d20: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
8d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
8d40: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
8d50: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
8d60: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
8d70: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
8d80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
8d90: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
8da0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
8db0: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
8dc0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
8dd0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
8de0: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
8df0: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
8e00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
8e10: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
8e20: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
8e30: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
8e40: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
8e50: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
8e60: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
8e70: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
8e80: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
8e90: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
8ea0: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
8eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8ec0: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
8ed0: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
8ee0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8ef0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
8f00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8f10: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8f20: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
8f30: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
8f40: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
8f50: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
8f60: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
8f70: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
8f80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
8f90: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
8fa0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8fb0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
8fc0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8fd0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
8fe0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
8ff0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
9000: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
9010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
9020: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
9030: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9040: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
9050: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9060: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
9070: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
9080: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
9090: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
90a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
90b0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
90c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
90d0: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
90e0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
90f0: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
9100: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
9110: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
9120: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9130: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9150: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
9160: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9170: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
9180: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
9190: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
91a0: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
91b0: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
91c0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
91d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
91e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
91f0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
9200: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
9210: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
9230: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
9240: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
9250: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
9260: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
9270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9280: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
9290: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
92a0: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
92b0: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
92c0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
92d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
92e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
92f0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9300: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9310: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
9320: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
9330: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
9340: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
9350: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
9360: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
9370: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
9380: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
9390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
93a0: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
93b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
93c0: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
93d0: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
93e0: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
93f0: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
9400: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
9410: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
9420: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
9430: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
9440: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
9450: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
9460: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9470: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
9480: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
9490: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
94a0: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
94b0: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
94c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
94d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
94e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
94f0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
9500: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9510: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
9520: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
9530: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
9540: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
9550: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
9560: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
9570: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9580: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
9590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
95a0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
95b0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
95c0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
95d0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
95e0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
95f0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
9600: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
9610: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
9620: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
9630: 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20    if( (needSync 
9640: 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71  .     && (0==(sq
9650: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
9660: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
9670: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
9680: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a  AP_SEQUENTIAL)).
9690: 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69       && (rc=sqli
96a0: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
96b0: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
96c0: 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f  ORMAL))!=SQLITE_
96d0: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OK) ){.      sql
96e0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
96f0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
9700: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9710: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
9720: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9730: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
9740: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9750: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9760: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
9770: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
9780: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
9790: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
97a0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
97b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
97c0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
97d0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
97e0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
97f0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9800: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
9810: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9820: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
9830: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
9840: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
9850: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
9860: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
9870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9880: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
9890: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
98a0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
98b0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
98c0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
98d0: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
98e0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
98f0: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
9900: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
9910: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
9920: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
9930: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9940: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
9950: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
9960: 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ured..    */.   
9970: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9980: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9990: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
99a0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
99b0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
99c0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
99d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
99e0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
99f0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
9a00: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
9a10: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9a20: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9a30: 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
9a40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9a50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9a60: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
9a70: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9a80: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9a90: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
9aa0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9ab0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
9ac0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
9ad0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
9ae0: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
9af0: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
9b00: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
9b10: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
9b20: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
9b30: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
9b40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
9b50: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9b60: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9b70: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
9b80: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
9b90: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
9ba0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
9bb0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9bc0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
9bd0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
9be0: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
9bf0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
9c00: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
9c10: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
9c20: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
9c30: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
9c40: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
9c50: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
9c60: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
9c70: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
9c80: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
9c90: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
9ca0: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
9cb0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
9cc0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
9cd0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
9ce0: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
9cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
9d00: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
9d10: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
9d20: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
9d30: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
9d40: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
9d50: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
9d60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
9d70: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
9d80: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
9d90: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
9da0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
9db0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9dc0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
9dd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
9de0: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
9df0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9e00: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
9e10: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
9e20: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9e30: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
9e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9e50: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
9e60: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
9e70: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
9e80: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
9e90: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
9ea0: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
9eb0: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
9ec0: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
9ed0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9ee0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
9ef0: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
9f00: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
9f10: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
9f20: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
9f30: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
9f40: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
9f50: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
9f60: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
9f70: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
9f80: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
9f90: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
9fa0: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
9fb0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
9fc0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
9fd0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
9fe0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
9ff0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
a000: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
a010: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
a020: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
a030: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
a040: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
a050: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
a060: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
a070: 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
a080: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
a090: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67  {.    if( p->mag
a0a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
a0b0: 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29  UN && p->pc>=0 )
a0c0: 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
a0d0: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
a0e0: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
a0f0: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63  ert( cnt==db->ac
a100: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d  tiveVdbeCnt );.}
a110: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
a120: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
a130: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
a140: 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72  ** For every Btr
a150: 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62  ee that in datab
a160: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
a170: 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  b which .** has 
a180: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22  been modified, "
a190: 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64  trip" or invalid
a1a0: 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20  ate each cursor 
a1b0: 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65  in.** that Btree
a1c0: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
a1d0: 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61   modified so tha
a1e0: 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  t the cursor.** 
a1f0: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65  can never be use
a200: 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68  d again.  This h
a210: 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f  appens when a ro
a220: 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72  llback.*** occur
a230: 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74  s.  We have to t
a240: 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  rip all the othe
a250: 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a  r cursors, even.
a260: 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f  ** cursor from o
a270: 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66  ther VMs in diff
a280: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63  erent database c
a290: 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73  onnections,.** s
a2a0: 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74  o that none of t
a2b0: 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74  hem try to use t
a2c0: 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68  he data at which
a2d0: 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f   they.** were po
a2e0: 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68  inting and which
a2f0: 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65   now may have be
a300: 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a  en changed due.*
a310: 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  * to the rollbac
a320: 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  k..**.** Remembe
a330: 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63  r that a rollbac
a340: 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62  k can delete tab
a350: 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64  les complete and
a360: 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74  .** reorder root
a370: 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73  pages.  So it is
a380: 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
a390: 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20  just to save.** 
a3a0: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
a3b0: 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76   cursor.  We hav
a3c0: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
a3d0: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f  the cursor.** so
a3e0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
a3f0: 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f  r used again..*/
a400: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
a410: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
a420: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73  ModifiedBtrees(s
a430: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
a440: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
a450: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a460: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
a470: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
a480: 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71  .    if( p && sq
a490: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
a4a0: 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ans(p) ){.      
a4b0: 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
a4c0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51  AllCursors(p, SQ
a4d0: 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20  LITE_ABORT);.   
a4e0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a4f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a500: 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
a510: 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
a520: 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
a530: 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
a540: 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
a550: 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
a560: 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
a570: 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
a580: 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
a590: 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
a5a0: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
a5b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a5c0: 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
a5d0: 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
a5e0: 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
a5f0: 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
a600: 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
a610: 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
a620: 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
a630: 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
a640: 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
a650: 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
a660: 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
a670: 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
a680: 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
a690: 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
a6a0: 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
a6b0: 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
a6c0: 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
a6d0: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
a6e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
a6f0: 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
a700: 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
a710: 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
a720: 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
a730: 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
a740: 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
a750: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
a760: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
a770: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
a780: 28 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a  (*xFunc)(Btree *
a790: 70 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75  pBt) = 0;  /* Fu
a7a0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f  nction to call o
a7b0: 6e 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63  n each btree bac
a7c0: 6b 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73  kend */.  int is
a7d0: 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
a7e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
a7f0: 74 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54  to true if SQLIT
a800: 45 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52  E_NOMEM or IOERR
a810: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   */..  /* This f
a820: 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  unction contains
a830: 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20   the logic that 
a840: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  determines if a 
a850: 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a  statement or.  *
a860: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
a870: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ll be committed 
a880: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  or rolled back a
a890: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
a8a0: 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e  e.  ** execution
a8b0: 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c   of this virtual
a8c0: 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a   machine. .  **.
a8d0: 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    ** If any of t
a8e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72  he following err
a8f0: 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a  ors occur:.  **.
a900: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a910: 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53  NOMEM.  **     S
a920: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a  QLITE_IOERR.  **
a930: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c       SQLITE_FULL
a940: 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
a950: 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a  _INTERRUPT.  **.
a960: 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e    ** Then the in
a970: 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67  ternal cache mig
a980: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66  ht have been lef
a990: 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73  t in an inconsis
a9a0: 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e  tent.  ** state.
a9b0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a9c0: 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  lback the statem
a9d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
a9e0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a   if there is.  *
a9f0: 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f  * one, or the co
aa00: 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69  mplete transacti
aa10: 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  on if there is n
aa20: 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
aa30: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20  saction..  */.. 
aa40: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
aa50: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
aa60: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
aa70: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73  OMEM;.  }.  clos
aa80: 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70  eAllCursorsExcep
aa90: 74 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b  tActiveVtabs(p);
aaa0: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
aab0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
aac0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
aad0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
aae0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
aaf0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
ab00: 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
ab10: 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
ab20: 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
ab30: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  tarted */.  if( 
ab40: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
ab50: 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72  int mrc;   /* Pr
ab60: 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65  imary error code
ab70: 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a   from p->rc */..
ab80: 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
ab90: 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
aba0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
abb0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
abc0: 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28  MutexArrayEnter(
abd0: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20  &p->aMutex);..  
abe0: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f    /* Check for o
abf0: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
ac00: 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
ac10: 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78  mrc = p->rc & 0x
ac20: 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61  ff;.    isSpecia
ac30: 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51  lError = mrc==SQ
ac40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
ac50: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  c==SQLITE_IOERR.
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c       || mrc==SQL
ac80: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c  ITE_INTERRUPT ||
ac90: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
aca0: 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65  L;.    if( isSpe
acb0: 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20  cialError ){.   
acc0: 20 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20     /* This loop 
acd0: 64 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c  does static anal
ace0: 79 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72  ysis of the quer
acf0: 79 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f  y to see which o
ad00: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66  f the.      ** f
ad10: 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63  ollowing three c
ad20: 61 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c  ategories it fal
ad30: 6c 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a  ls into:.      *
ad40: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52  *.      **     R
ad50: 65 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a  ead-only.      *
ad60: 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68  *     Query with
ad70: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ad80: 61 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  al.      **     
ad90: 51 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74  Query without st
ada0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a  atement journal.
adb0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
adc0: 2a 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f  * We could do so
add0: 6d 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65  mething more ele
ade0: 67 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73  gant than this s
adf0: 74 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28  tatic analysis (
ae00: 69 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74  i.e..      ** st
ae10: 6f 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  ore the type of 
ae20: 71 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66  query as part of
ae30: 20 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e   the compliation
ae40: 20 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20   phase), but .  
ae50: 20 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20      ** handling 
ae60: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
ae70: 61 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72  ailure is a fair
ae80: 6c 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20  ly obscure edge 
ae90: 63 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a  case so .      *
aea0: 2a 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62  * this is probab
aeb0: 6c 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a  ly easier. Todo:
aec0: 20 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70   Might be an opp
aed0: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75  ortunity to redu
aee0: 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ce .      ** cod
aef0: 65 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d  e size a very sm
af00: 61 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67  all amount thoug
af10: 68 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  h....      */.  
af20: 20 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f      int notReadO
af30: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  nly = 0;.      i
af40: 6e 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d  nt isStatement =
af50: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
af60: 28 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f  (p->aOp || p->nO
af70: 70 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  p==0);.      for
af80: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
af90: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73  i++){ .        s
afa0: 77 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d  witch( p->aOp[i]
afb0: 2e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20  .opcode ){.     
afc0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
afd0: 6e 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20  nsaction:.      
afe0: 20 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c        notReadOnl
aff0: 79 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70  y |= p->aOp[i].p
b000: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  2;.            b
b010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
b020: 63 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e  case OP_Statemen
b030: 74 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t:.            i
b040: 73 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a  sStatement = 1;.
b050: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b060: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
b070: 20 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20     }..   .      
b080: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
b090: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
b0a0: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
b0b0: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
b0c0: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
b0d0: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
b0e0: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
b0f0: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
b100: 20 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f      if( notReadO
b110: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
b120: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
b130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
b140: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
b150: 42 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61  BLOCKED && isSta
b160: 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  tement ){.      
b170: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69      xFunc = sqli
b180: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
b190: 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stmt;.          
b1a0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42  p->rc = SQLITE_B
b1b0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  USY;.        } e
b1c0: 6c 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51  lse if( (mrc==SQ
b1d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
b1e0: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
b1f0: 26 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29  && isStatement )
b200: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b210: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b220: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
b230: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
b240: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
b250: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
b260: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
b270: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
b280: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
b290: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
b2a0: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
b2b0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
b2c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
b2d0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
b2e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
b2f0: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
b300: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
b310: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
b320: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
b330: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
b340: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
b350: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
b360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b370: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
b380: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
b390: 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
b3a0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
b3b0: 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20  ve vdbe, then.  
b3c0: 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65    ** we do eithe
b3d0: 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
b3e0: 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
b3f0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
b400: 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
b410: 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
b420: 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
b430: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
b440: 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
b450: 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
b460: 68 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20  has occured. .  
b470: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
b480: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64  >autoCommit && d
b490: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
b4a0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
b4b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b4c0: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
b4d0: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
b4e0: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
b4f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
b500: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
b510: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
b520: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
b530: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
b540: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
b550: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
b560: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
b570: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
b580: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
b590: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
b5a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
b5b0: 74 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69  t rc = vdbeCommi
b5c0: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
b5d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b5e0: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
b5f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
b600: 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28 26  utexArrayLeave(&
b610: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 20 20  p->aMutex);.    
b620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b630: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
b640: 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
b650: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b660: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
b670: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
b680: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
b690: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  db);.        }el
b6a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  se{.          sq
b6b0: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
b6c0: 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
b6d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
b6f0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
b700: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l(db);.      }. 
b710: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 78 46     }else if( !xF
b720: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28  unc ){.      if(
b730: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b740: 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74  K || p->errorAct
b750: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a  ion==OE_Fail ){.
b760: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f          if( p->o
b770: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 29  penedStatement )
b780: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b790: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b7a0: 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20  CommitStmt;.    
b7b0: 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
b7c0: 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41  se if( p->errorA
b7d0: 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20  ction==OE_Abort 
b7e0: 29 7b 0a 20 20 20 20 20 20 20 20 78 46 75 6e 63  ){.        xFunc
b7f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b800: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b810: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b820: 20 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73    invalidateCurs
b830: 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72  orsOnModifiedBtr
b840: 65 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ees(db);.       
b850: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b860: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b870: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b880: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
b890: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
b8a0: 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c  xFunc is not NUL
b8b0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e  L, then it is on
b8c0: 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
b8d0: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72  eRollbackStmt or
b8e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  .    ** sqlite3B
b8f0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20  treeCommitStmt. 
b900: 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20  Call it once on 
b910: 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66  each backend. If
b920: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
b930: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
b940: 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
b950: 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  till SQLITE_OK, 
b960: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  set the return c
b970: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20  ode to the new. 
b980: 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75     ** error valu
b990: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
b9a0: 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20  sert(!xFunc ||. 
b9b0: 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69       xFunc==sqli
b9c0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
b9d0: 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e  mt ||.      xFun
b9e0: 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52  c==sqlite3BtreeR
b9f0: 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20  ollbackStmt.    
ba00: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ba10: 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e  xFunc && i<db->n
ba20: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
ba30: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42   int rc;.      B
ba40: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
ba50: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
ba60: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ba70: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28       rc = xFunc(
ba80: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
ba90: 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d  ( rc && (p->rc==
baa0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
bab0: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
bac0: 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20  RAINT) ){.      
bad0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
bae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
baf0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
bb00: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
bb10: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
bb20: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
bb30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
bb40: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
bb50: 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
bb60: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
bb70: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77   the statement w
bb80: 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20  as committed, . 
bb90: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68     ** set the ch
bba0: 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20  ange counter. . 
bbb0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
bbc0: 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20  >changeCntOn && 
bbd0: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
bbe0: 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20    if( !xFunc || 
bbf0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
bc00: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b  reeCommitStmt ){
bc10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bc20: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
bc30: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
bc40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bc50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc60: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
bc70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
bc80: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
bc90: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
bca0: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
bcb0: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
bcc0: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
bcd0: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
bce0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
bcf0: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
bd00: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
bd10: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
bd20: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
bd30: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
bd40: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
bd50: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
bd60: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
bd70: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
bd80: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
bd90: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
bda0: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
bdb0: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
bdc0: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
bdd0: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
bde0: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
bdf0: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
be00: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
be10: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
be20: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
be30: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
be40: 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
be50: 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
be60: 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
be70: 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
be80: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
be90: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
bea0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
beb0: 4d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  M;.  }..  return
bec0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
bed0: 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
bee0: 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
bef0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
bf00: 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
bf10: 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
bf20: 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
bf30: 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
bf40: 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
bf50: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
bf60: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
bf70: 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
bf80: 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
bf90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
bfa0: 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
bfb0: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
bfc0: 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
bfd0: 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
bfe0: 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
bff0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
c000: 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
c010: 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
c020: 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
c030: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
c040: 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
c050: 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
c060: 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
c070: 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
c080: 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
c090: 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
c0a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
c0b0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
c0c0: 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
c0d0: 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
c0e0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
c0f0: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
c100: 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
c110: 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
c120: 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
c130: 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
c140: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
c150: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
c160: 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
c170: 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
c180: 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
c190: 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
c1a0: 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
c1b0: 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
c1c0: 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
c1d0: 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
c1e0: 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
c1f0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
c200: 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73  afetyOn(db);.  s
c210: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
c220: 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  );.  (void)sqlit
c230: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
c240: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
c250: 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
c260: 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
c270: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
c280: 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
c290: 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
c2a0: 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
c2b0: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
c2c0: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
c2d0: 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
c2e0: 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
c2f0: 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
c300: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
c310: 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
c320: 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
c330: 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
c340: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
c350: 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
c360: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
c370: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
c380: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
c390: 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
c3a0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
c3b0: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31  tStr(db->pErr,-1
c3c0: 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49  ,p->zErrMsg,SQLI
c3d0: 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54  TE_UTF8,SQLITE_T
c3e0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
c3f0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70   db->errCode = p
c400: 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  ->rc;.      sqli
c410: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
c420: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
c430: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
c440: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
c450: 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71  ->rc ){.      sq
c460: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
c470: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65  ->rc, 0);.    }e
c480: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
c490: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
c4a0: 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d  TE_OK, 0);.    }
c4b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
c4c0: 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64  rc && p->expired
c4d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65   ){.    /* The e
c4e0: 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20  xpired flag was 
c4f0: 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20  set on the VDBE 
c500: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
c510: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
c520: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20  sqlite3_step(). 
c530: 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  For consistency 
c540: 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73  (since sqlite3_s
c550: 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a  tep() was.    **
c560: 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68   called), set th
c570: 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  e database error
c580: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73   in this case as
c590: 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   well..    */.  
c5a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
c5b0: 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20  b, p->rc, 0);.  
c5c0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
c5d0: 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
c5e0: 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
c5f0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
c600: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
c610: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
c620: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
c630: 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
c640: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
c650: 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f  Reclaim all memo
c660: 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56  ry used by the V
c670: 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e  DBE.  */.  Clean
c680: 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76  up(p);..  /* Sav
c690: 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f  e profiling info
c6a0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69  rmation from thi
c6b0: 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f  s VDBE run..  */
c6c0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
c6d0: 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c  FILE.  {.    FIL
c6e0: 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22  E *out = fopen("
c6f0: 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74  vdbe_profile.out
c700: 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28  ", "a");.    if(
c710: 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e   out ){.      in
c720: 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  t i;.      fprin
c730: 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29  tf(out, "---- ")
c740: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c750: 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
c760: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
c770: 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d  (out, "%02x", p-
c780: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b  >aOp[i].opcode);
c790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
c7a0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
c7b0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
c7c0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
c7d0: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
c7e0: 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c  f(out, "%6d %10l
c7f0: 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20  ld %8lld ",.    
c800: 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
c810: 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
c820: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
c830: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
c840: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
c850: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
c860: 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
c870: 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
c880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c890: 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
c8a0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
c8b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
c8c0: 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
c8d0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d   }.#endif.  p->m
c8e0: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c8f0: 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
c900: 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
c910: 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
c920: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
c930: 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
c940: 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
c950: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
c960: 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
c970: 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
c980: 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
c990: 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
c9a0: 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
c9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
c9c0: 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
c9d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c9e0: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
c9f0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
ca00: 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
ca10: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
ca20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
ca30: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
ca40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
ca50: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
ca60: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
ca70: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
ca80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ca90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
caa0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
cab0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
cac0: 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
cad0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
cae0: 43 61 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63  Call the destruc
caf0: 74 6f 72 20 66 6f 72 20 65 61 63 68 20 61 75 78  tor for each aux
cb00: 64 61 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56  data entry in pV
cb10: 64 62 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63  dbeFunc for whic
cb20: 68 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70  h.** the corresp
cb30: 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61  onding bit in ma
cb40: 73 6b 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75  sk is clear.  Au
cb50: 78 64 61 74 61 20 65 6e 74 72 69 65 73 20 62 65  xdata entries be
cb60: 79 6f 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61  yond 31.** are a
cb70: 6c 77 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e  lways destroyed.
cb80: 20 20 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c    To destroy all
cb90: 20 61 75 78 64 61 74 61 20 65 6e 74 72 69 65 73   auxdata entries
cba0: 2c 20 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  , call this.** r
cbb0: 6f 75 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b  outine with mask
cbc0: 3d 3d 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ==0..*/.void sql
cbd0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
cbe0: 78 44 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a  xData(VdbeFunc *
cbf0: 70 56 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d  pVdbeFunc, int m
cc00: 61 73 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ask){.  int i;. 
cc10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62   for(i=0; i<pVdb
cc20: 65 46 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b  eFunc->nAux; i++
cc30: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 41 75  ){.    struct Au
cc40: 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70  xData *pAux = &p
cc50: 56 64 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b  VdbeFunc->apAux[
cc60: 69 5d 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33  i];.    if( (i>3
cc70: 31 20 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c  1 || !(mask&(1<<
cc80: 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41  i))) && pAux->pA
cc90: 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ux ){.      if( 
cca0: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
ccb0: 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
ccc0: 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
ccd0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
cce0: 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30    pAux->pAux = 0
ccf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
cd00: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
cd10: 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76  ntire VDBE..*/.v
cd20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
cd30: 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a  elete(Vdbe *p){.
cd40: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
cd50: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70  e3 *db;..  if( p
cd60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
cd70: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
cd80: 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ( p->pPrev ){.  
cd90: 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78    p->pPrev->pNex
cda0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
cdb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
cdc0: 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20  t( db->pVdbe==p 
cdd0: 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65  );.    db->pVdbe
cde0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
cdf0: 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20  .  if( p->pNext 
ce00: 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d  ){.    p->pNext-
ce10: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
ce20: 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  v;.  }.  if( p->
ce30: 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70  aOp ){.    Op *p
ce40: 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20  Op = p->aOp;.   
ce50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ce60: 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  Op; i++, pOp++){
ce70: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
ce80: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
ce90: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
cea0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
ceb0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
cec0: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
ced0: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
cee0: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c    .    }.    sql
cef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
cf00: 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ->aOp);.  }.  re
cf10: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
cf20: 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
cf30: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
cf40: 28 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b  (db, p->aLabel);
cf50: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
cf60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
cf70: 72 65 65 28 64 62 2c 20 26 70 2d 3e 61 4d 65 6d  ree(db, &p->aMem
cf80: 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [1]);.  }.  rele
cf90: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
cfa0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
cfb0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
cfc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
cfd0: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
cfe0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
cff0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
d000: 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  );.  p->magic = 
d010: 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
d020: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d030: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
d040: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
d050: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
d060: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
d070: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
d080: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
d090: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
d0a0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
d0b0: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
d0c0: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
d0d0: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
d0e0: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
d0f0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
d100: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
d110: 72 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a  rMoveto(Cursor *
d120: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66  p){.  if( p->def
d130: 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
d140: 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a     int res, rc;.
d150: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d160: 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ST.    extern in
d170: 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
d180: 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  _count;.#endif. 
d190: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73     assert( p->is
d1a0: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20  Table );.    rc 
d1b0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
d1c0: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e  vetoUnpacked(p->
d1d0: 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
d1e0: 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
d1f0: 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72  &res);.    if( r
d200: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d210: 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20     p->lastRowid 
d220: 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f  = keyToInt(p->mo
d230: 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20  vetoTarget);.   
d240: 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64   p->rowidIsValid
d250: 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69   = res==0;.    i
d260: 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
d270: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
d280: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
d290: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
d2a0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
d2b0: 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65   rc;.    }.#ifde
d2c0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
d2d0: 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
d2e0: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
d2f0: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
d300: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
d310: 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
d320: 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
d330: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75  }else if( p->pCu
d340: 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rsor ){.    int 
d350: 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
d360: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
d370: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
d380: 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
d390: 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
d3a0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
d3b0: 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
d3c0: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
d3d0: 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
d3e0: 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
d3f0: 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
d400: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d410: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d430: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
d440: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
d450: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
d460: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d470: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
d480: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d490: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
d4a0: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
d4b0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
d4c0: 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
d4d0: 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
d4e0: 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
d4f0: 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
d500: 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
d510: 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
d520: 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
d530: 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
d540: 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
d550: 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
d560: 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
d570: 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
d580: 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
d590: 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
d5a0: 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
d5b0: 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
d5c0: 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
d5d0: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
d5e0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
d5f0: 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
d600: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
d610: 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
d620: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
d630: 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
d640: 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
d650: 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
d660: 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
d670: 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
d680: 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
d690: 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
d6a0: 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
d6b0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
d6c0: 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
d6d0: 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
d6e0: 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
d6f0: 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
d700: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
d710: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
d720: 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
d730: 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
d740: 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
d750: 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
d760: 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
d770: 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
d780: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
d790: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
d7a0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
d7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
d7c0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d7d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
d7e0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
d7f0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
d800: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
d810: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d820: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
d830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d840: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
d850: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d860: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
d880: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d890: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d8a0: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
d8b0: 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
d8c0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
d8d0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
d900: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d910: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
d920: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
d930: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d940: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d950: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
d960: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
d970: 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
d980: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
d990: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
d9a0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
d9b0: 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
d9c0: 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
d9d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
d9e0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
d9f0: 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
da00: 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
da30: 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
da40: 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
da50: 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
da60: 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
da70: 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
da80: 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
da90: 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
daa0: 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
dab0: 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
dac0: 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
dad0: 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
dae0: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
daf0: 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
db00: 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
db10: 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
db20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
db30: 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
db40: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
db50: 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
db60: 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
db70: 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
db80: 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
db90: 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
dba0: 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
dbb0: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
dbc0: 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
dbd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dbe0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
dbf0: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
dc00: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
dc10: 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
dc20: 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
dc30: 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
dc40: 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
dc50: 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
dc60: 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
dc70: 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
dc80: 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
dc90: 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
dca0: 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
dcb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69        return 8+i
dcc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20  ;.    }.    u = 
dcd0: 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20  i<0 ? -i : i;.  
dce0: 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
dcf0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
dd00: 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
dd10: 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
dd20: 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
dd30: 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
dd40: 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
dd50: 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
dd60: 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
dd70: 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
dd80: 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
dd90: 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
dda0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
ddb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 6c    }.  assert( fl
ddc0: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
ddd0: 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
dde0: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
ddf0: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
de00: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
de10: 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73  ->u.i;.  }.  ass
de20: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
de30: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
de40: 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
de50: 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
de60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
de70: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
de80: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
de90: 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
dea0: 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
deb0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
dec0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
ded0: 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
dee0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
def0: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
df00: 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
df10: 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
df20: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
df30: 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
df40: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
df50: 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
df60: 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
df70: 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
df80: 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
df90: 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
dfa0: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
dfb0: 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
dfc0: 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
dfd0: 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
dfe0: 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
dff0: 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
e000: 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
e010: 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
e020: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
e030: 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
e040: 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
e050: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
e060: 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
e070: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
e080: 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
e090: 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
e0a0: 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
e0b0: 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
e0c0: 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
e0d0: 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
e0e0: 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
e0f0: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
e100: 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
e110: 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
e120: 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
e130: 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
e140: 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
e150: 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
e160: 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
e170: 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
e180: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
e190: 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
e1a0: 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
e1b0: 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
e1c0: 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
e1d0: 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
e1e0: 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
e1f0: 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
e200: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
e210: 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
e220: 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
e230: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
e240: 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
e250: 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
e260: 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
e270: 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
e280: 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
e290: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
e2a0: 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
e2b0: 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
e2c0: 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
e2d0: 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
e2e0: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
e2f0: 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
e300: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
e310: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
e320: 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
e330: 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
e340: 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
e350: 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
e360: 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
e370: 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
e380: 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
e390: 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
e3a0: 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
e3b0: 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
e3c0: 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
e3d0: 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
e3e0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
e3f0: 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
e400: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
e410: 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
e420: 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
e430: 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
e440: 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
e450: 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
e460: 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
e470: 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
e480: 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
e490: 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
e4a0: 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
e4b0: 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
e4c0: 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
e4d0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
e4e0: 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
e4f0: 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
e500: 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
e510: 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
e520: 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
e530: 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
e540: 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
e550: 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
e560: 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
e570: 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
e580: 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
e590: 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
e5a0: 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
e5b0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
e5c0: 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
e5d0: 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
e5e0: 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
e5f0: 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
e600: 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
e610: 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
e620: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
e630: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
e640: 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
e650: 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
e660: 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
e670: 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
e680: 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
e690: 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
e6a0: 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
e6b0: 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
e6c0: 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
e6d0: 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
e6e0: 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
e6f0: 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
e700: 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
e710: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
e720: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e730: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
e740: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
e750: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
e760: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
e770: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
e780: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
e790: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
e7a0: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
e7b0: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
e7c0: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
e7d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e7e0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
e7f0: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
e800: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
e810: 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
e820: 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
e830: 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
e840: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
e850: 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
e860: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
e870: 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
e880: 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
e890: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
e8a0: 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
e8b0: 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
e8c0: 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
e8d0: 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
e8e0: 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
e8f0: 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
e900: 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
e910: 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
e920: 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
e930: 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
e940: 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
e950: 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
e960: 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
e970: 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
e980: 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
e990: 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
e9a0: 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
e9b0: 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
e9c0: 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
e9d0: 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
e9e0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
e9f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
ea00: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
ea10: 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
ea20: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
ea30: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
ea40: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
ea50: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
ea60: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
ea70: 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
ea80: 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
ea90: 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
eaa0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
eab0: 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
eac0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
ead0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
eae0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
eaf0: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
eb00: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
eb10: 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
eb20: 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c  format);.  int l
eb30: 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
eb40: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
eb50: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
eb60: 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
eb70: 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
eb80: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
eb90: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
eba0: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
ebb0: 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
ebc0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
ebd0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
ebe0: 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
ebf0: 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
ec00: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
ec10: 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
ec20: 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
ec30: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
ec40: 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
ec50: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
ec60: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
ec70: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
ec80: 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  len<=nBuf );.   
ec90: 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
eca0: 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76       buf[i] = (v
ecb0: 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
ecc0: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
ecd0: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
ece0: 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
ecf0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
ed00: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
ed10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
ed20: 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
ed30: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
ed40: 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20  )?pMem->u.i:0). 
ed50: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
ed60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ed70: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
ed80: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
ed90: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
eda0: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
edb0: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
edc0: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
edd0: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
ede0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
edf0: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
ee00: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  en += pMem->u.i;
ee10: 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e  .      if( len>n
ee20: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
ee30: 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20  en = nBuf;.     
ee40: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
ee50: 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
ee60: 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
ee70: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ee80: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
ee90: 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
eea0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
eeb0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
eec0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
eed0: 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
eee0: 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
eef0: 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
ef00: 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
ef10: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
ef20: 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
ef30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ef40: 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69  ytes read..*/ .i
ef50: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
ef60: 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
ef70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ef80: 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
ef90: 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
efa0: 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
efb0: 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
efc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
efd0: 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
efe0: 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
eff0: 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
f000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
f010: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
f020: 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
f030: 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
f040: 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
f050: 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
f060: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
f070: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
f080: 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
f090: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
f0a0: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
f0b0: 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
f0c0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f0d0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
f0e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f0f0: 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
f100: 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
f110: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
f120: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
f130: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f140: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f150: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f160: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
f170: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
f180: 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
f190: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f1a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f1b0: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
f1c0: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
f1d0: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
f1e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f1f0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f200: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
f210: 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
f220: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f230: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
f240: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
f250: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
f260: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
f270: 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
f280: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
f290: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
f2a0: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
f2b0: 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
f2c0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
f2d0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
f2e0: 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
f2f0: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
f300: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
f310: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
f320: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f330: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f340: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
f350: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
f360: 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
f370: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f380: 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
f390: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f3a0: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f3b0: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
f3c0: 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
f3d0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
f3e0: 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
f3f0: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
f400: 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
f410: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
f420: 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
f430: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f440: 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
f450: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
f460: 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
f470: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f480: 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
f490: 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
f4a0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
f4b0: 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
f4c0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
f4d0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
f4e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
f4f0: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
f500: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
f510: 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
f520: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
f530: 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
f540: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
f550: 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
f560: 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
f570: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
f580: 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
f590: 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
f5a0: 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
f5b0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
f5c0: 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
f5d0: 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
f5e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
f5f0: 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
f600: 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
f610: 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
f620: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
f630: 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
f640: 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
f650: 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
f660: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
f670: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
f680: 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
f690: 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
f6a0: 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
f6b0: 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
f6c0: 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
f6d0: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
f6e0: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
f6f0: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
f700: 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
f710: 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
f720: 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
f730: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
f740: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
f750: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
f760: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
f770: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
f780: 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
f790: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
f7a0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f7b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f7c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
f7d0: 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
f7e0: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
f7f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
f800: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
f810: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
f820: 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
f830: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
f840: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f850: 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
f860: 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
f870: 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
f880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f890: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
f8a0: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
f8b0: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
f8c0: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
f8d0: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
f8e0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
f8f0: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
f900: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f910: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f930: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f940: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
f950: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
f960: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
f970: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
f980: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
f990: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
f9a0: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
f9b0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
f9c0: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
f9d0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f9e0: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
f9f0: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
fa00: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
fa10: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
fa20: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
fa30: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
fa40: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
fa50: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fa60: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
fa70: 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
fa80: 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
fa90: 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
faa0: 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
fab0: 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
fac0: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
fad0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
fae0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
faf0: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
fb00: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
fb10: 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
fb20: 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
fb30: 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
fb40: 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
fb50: 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
fb60: 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
fb70: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
fb80: 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
fb90: 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
fba0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
fbb0: 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
fbc0: 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
fbd0: 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
fbe0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
fbf0: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
fc00: 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
fc10: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
fc20: 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
fc30: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
fc40: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
fc50: 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
fc60: 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
fc70: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
fc80: 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
fc90: 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
fca0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
fcb0: 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
fcc0: 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
fcd0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
fce0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
fcf0: 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
fd00: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
fd10: 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
fd20: 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
fd30: 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
fd40: 64 20 2a 70 53 70 61 63 65 2c 2f 2a 20 53 70 61  d *pSpace,/* Spa
fd50: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ce available to 
fd60: 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f  hold resulting o
fd70: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73  bject */.  int s
fd80: 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20  zSpace          
fd90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
fda0: 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
fdb0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
fdc0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
fdd0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
fde0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
fdf0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
fe00: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   *p;.  int nByte
fe10: 3b 0a 20 20 69 6e 74 20 69 64 78 2c 20 64 3b 0a  ;.  int idx, d;.
fe20: 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
fe30: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
fe40: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
fe50: 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  r */.  u32 szHdr
fe60: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
fe70: 20 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65   .  assert( size
fe80: 6f 66 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a  of(Mem)>sizeof(*
fe90: 70 29 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  p) );.  nByte = 
fea0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
feb0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29  yInfo->nField+2)
fec0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
fed0: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d  Space ){.    p =
fee0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
fef0: 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  Raw(pKeyInfo->db
ff00: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
ff10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
ff20: 30 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  0;.    p->flags 
ff30: 3d 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  = UNPACKED_NEED_
ff40: 46 52 45 45 20 7c 20 55 4e 50 41 43 4b 45 44 5f  FREE | UNPACKED_
ff50: 4e 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20  NEED_DESTROY;.  
ff60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 70  }else{.    p = p
ff70: 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  Space;.    p->fl
ff80: 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e  ags = UNPACKED_N
ff90: 45 45 44 5f 44 45 53 54 52 4f 59 3b 0a 20 20 7d  EED_DESTROY;.  }
ffa0: 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
ffb0: 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
ffc0: 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
ffd0: 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
ffe0: 20 70 2d 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20   p->aMem = pMem 
fff0: 3d 20 26 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b  = &((Mem*)p)[1];
10000 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69  .  idx = getVari
10010 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72  nt32(aKey, szHdr
10020 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a  );.  d = szHdr;.
10030 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65    u = 0;.  while
10040 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 75  ( idx<szHdr && u
10050 3c 70 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20  <p->nField ){.  
10060 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
10070 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
10080 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
10090 2b 69 64 78 2c 20 73 65 72 69 61 6c 5f 74 79 70  +idx, serial_typ
100a0 65 29 3b 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e  e);.    if( d>=n
100b0 4b 65 79 20 26 26 20 73 71 6c 69 74 65 33 56 64  Key && sqlite3Vd
100c0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
100d0 73 65 72 69 61 6c 5f 74 79 70 65 29 3e 30 20 29  serial_type)>0 )
100e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d   break;.    pMem
100f0 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
10100 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
10110 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
10120 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  db;.    pMem->fl
10130 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65  ags = 0;.    pMe
10140 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
10150 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
10160 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
10170 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
10180 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
10190 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
101a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
101b0 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
101c0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
101d0 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 65 74  Field = u;.  ret
101e0 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a 7d 0a  urn (void*)p;.}.
101f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
10200 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 20 55  ine destroys a U
10210 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 6f 62  npackedRecord ob
10220 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ject.*/.void sql
10230 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
10240 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55 6e 70  packedRecord(Unp
10250 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b  ackedRecord *p){
10260 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
10270 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55  if( p->flags & U
10280 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
10290 54 52 4f 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  TROY ){.      in
102a0 74 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  t i;.      Mem *
102b0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  pMem;.      for(
102c0 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65  i=0, pMem=p->aMe
102d0 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20  m; i<p->nField; 
102e0 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
102f0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
10300 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
10310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10320 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
10330 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10350 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ( p->flags & UNP
10360 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52 45 45 20  ACKED_NEED_FREE 
10370 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10380 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 79 49 6e  DbFree(p->pKeyIn
10390 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  fo->db, p);.    
103a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
103b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
103c0 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61  pares the two ta
103d0 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65  ble rows or inde
103e0 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65  x records.** spe
103f0 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31  cified by {nKey1
10400 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b  , pKey1} and pPK
10410 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73  ey2.  It returns
10420 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72   a negative, zer
10430 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
10440 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31   integer if key1
10450 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
10460 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67  qual to or .** g
10470 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32  reater than key2
10480 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70  .  The {nKey1, p
10490 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62  Key1} key must b
104a0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61  e a blob.** crea
104b0 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b  ted by th OP_Mak
104c0 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
104d0 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
104e0 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
104f0 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
10500 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
10510 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
10520 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
10530 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ord..**.** Key1 
10540 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
10550 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
10560 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
10570 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68  of fields..** Th
10580 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72  e key with fewer
10590 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c   fields is usual
105a0 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73  ly compares less
105b0 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f   than the .** lo
105c0 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76  nger key.  Howev
105d0 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b  er if the UNPACK
105e0 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73  ED_INCRKEY flags
105f0 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65   in pPKey2 is se
10600 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d  t.** and the com
10610 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65  mon prefixes are
10620 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79   equal, then key
10630 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b  1 is less than k
10640 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68  ey2..** Or if th
10650 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48  e UNPACKED_MATCH
10660 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20  _PREFIX flag is 
10670 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66  set and the pref
10680 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61  ixes are.** equa
10690 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73  l, then the keys
106a0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
106b0 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a  to be equal and.
106c0 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79  ** the parts bey
106d0 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70  ond the common p
106e0 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65  refix are ignore
106f0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
10700 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
10710 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65  ROWID flag is se
10720 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10730 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
10740 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20  header of pKey1 
10750 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20  is ignored.  It 
10760 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
10770 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69  pKey1 is.** an i
10780 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68  ndex key, and th
10790 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72  us ends with a r
107a0 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65  owid value.  The
107b0 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66   last byte.** of
107c0 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c   the header will
107d0 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68   therefore be th
107e0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66  e serial type of
107f0 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f   the rowid:.** o
10800 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34  ne of 1, 2, 3, 4
10810 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20  , 5, 6, 8, or 9 
10820 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65  - the integer se
10830 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54  rial types..** T
10840 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f  he serial type o
10850 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69  f the final rowi
10860 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  d will always be
10870 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
10880 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74  ** By ignoring t
10890 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66  his last byte of
108a0 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20   the header, we 
108b0 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72  force the compar
108c0 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72  ison.** to ignor
108d0 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  e the rowid at t
108e0 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a  he end of key1..
108f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
10900 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
10910 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
10920 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
10930 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
10940 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
10950 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
10960 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
10970 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
10980 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
10990 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
109a0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
109b0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  nt */.  u32 idx1
109c0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
109d0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
109e0 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20   of next header 
109f0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
10a00 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
10a10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
10a20 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  es in header */.
10a30 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69    int i = 0;.  i
10a40 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74  nt nField;.  int
10a50 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
10a60 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10a70 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
10a80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
10a90 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
10aa0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
10ab0 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
10ac0 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
10ad0 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
10ae0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
10af0 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
10b00 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d  KeyInfo->db;.  m
10b10 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  em1.flags = 0;. 
10b20 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20   mem1.zMalloc = 
10b30 30 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67  0;.  .  idx1 = g
10b40 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
10b50 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 64 31 20  , szHdr1);.  d1 
10b60 3d 20 73 7a 48 64 72 31 3b 0a 20 20 69 66 28 20  = szHdr1;.  if( 
10b70 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20  pPKey2->flags & 
10b80 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f  UNPACKED_IGNORE_
10b90 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 73 7a 48  ROWID ){.    szH
10ba0 64 72 31 2d 2d 3b 0a 20 20 7d 0a 20 20 6e 46 69  dr1--;.  }.  nFi
10bb0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
10bc0 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28  nField;.  while(
10bd0 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20   idx1<szHdr1 && 
10be0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
10bf0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
10c00 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f  al_type1;..    /
10c10 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61  * Read the seria
10c20 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20  l types for the 
10c30 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  next element in 
10c40 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20  each key. */.   
10c50 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69   idx1 += getVari
10c60 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31  nt32( aKey1+idx1
10c70 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29  , serial_type1 )
10c80 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b  ;.    if( d1>=nK
10c90 65 79 31 20 26 26 20 73 71 6c 69 74 65 33 56 64  ey1 && sqlite3Vd
10ca0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
10cb0 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 30 20  serial_type1)>0 
10cc0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a  ) break;..    /*
10cd0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
10ce0 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
10cf0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
10d00 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
10d10 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
10d20 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
10d30 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
10d40 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
10d50 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
10d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
10d70 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
10d80 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
10d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10da0 20 20 20 20 20 20 20 20 20 20 20 20 69 3c 6e 46              i<nF
10db0 69 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d  ield ? pKeyInfo-
10dc0 3e 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a  >aColl[i] : 0);.
10dd0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
10de0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10df0 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d    }.    i++;.  }
10e00 0a 20 20 69 66 28 20 6d 65 6d 31 2e 7a 4d 61 6c  .  if( mem1.zMal
10e10 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
10e20 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
10e30 31 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30  1);..  if( rc==0
10e40 20 29 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30   ){.    /* rc==0
10e50 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
10e60 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
10e70 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
10e80 64 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c  ds and.    ** al
10e90 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
10ea0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
10eb0 72 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65  re equal. If the
10ec0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
10ed0 59 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  Y.    ** flag is
10ee0 20 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b   set, then break
10ef0 20 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61   the tie by trea
10f00 74 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72  ting key2 as lar
10f10 67 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  ger..    ** If t
10f20 68 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49  he UPACKED_PREFI
10f30 58 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20  X_MATCH flag is 
10f40 73 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77  set, then keys w
10f50 69 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  ith common prefi
10f60 78 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63  xes.    ** are c
10f70 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
10f80 65 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  equal.  Otherwis
10f90 65 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65  e, the longer ke
10fa0 79 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  y is the .    **
10fb0 20 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20   larger.  As it 
10fc0 68 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b  happens, the pPK
10fd0 65 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  ey2 will always 
10fe0 62 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20  be the longer.  
10ff0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73    ** if there is
11000 20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20   a difference.. 
11010 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
11020 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
11030 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29  PACKED_INCRKEY )
11040 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b  {.      rc = -1;
11050 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
11060 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55  PKey2->flags & U
11070 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d  NPACKED_PREFIX_M
11080 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ATCH ){.      /*
11090 20 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a   Leave rc==0 */.
110a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64      }else if( id
110b0 78 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20  x1<szHdr1 ){.   
110c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
110d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
110e0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
110f0 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
11100 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
11110 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
11120 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
11130 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
11140 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
11150 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20   rc;.}. ../*.** 
11160 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
11170 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
11180 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
11190 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
111a0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
111b0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
111c0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
111d0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
111e0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
111f0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
11200 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
11210 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
11220 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
11230 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
11240 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
11250 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
11260 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
11270 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
11280 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
11290 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
112a0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
112b0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
112c0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
112d0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
112e0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
112f0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
11300 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
11310 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
11320 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
11330 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
11340 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
11350 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
11360 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11370 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
11380 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20    }.  m.flags = 
11390 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20  0;.  m.db = 0;. 
113a0 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a   m.zMalloc = 0;.
113b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
113c0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
113d0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
113e0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
113f0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11400 20 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64   rc;.  }.  (void
11410 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
11420 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
11430 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
11440 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
11450 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
11460 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
11470 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11480 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
11490 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
114a0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
114b0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
114c0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
114d0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
114e0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
114f0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
11500 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
11510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11520 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
11530 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
11540 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
11550 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
11560 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
11570 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
11580 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
11590 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
115a0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
115b0 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
115c0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
115d0 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
115e0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
115f0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
11600 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
11610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
11620 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
11630 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
11640 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
11650 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
11660 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
11670 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
11680 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
11690 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
116a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
116b0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
116c0 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
116d0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f    Hence, this ro
116e0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61  utine only compa
116f0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73  res the prefixes
11700 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73   .** of the keys
11710 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69   prior to the fi
11720 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74  nal rowid, not t
11730 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a  he entire key..*
11740 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 6d  *.** pUnpacked m
11750 61 79 20 62 65 20 61 6e 20 75 6e 70 61 63 6b 65  ay be an unpacke
11760 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65  d version of pKe
11770 79 2c 6e 4b 65 79 2e 20 20 49 66 20 70 55 6e 70  y,nKey.  If pUnp
11780 61 63 6b 65 64 20 69 73 0a 2a 2a 20 73 75 70 70  acked is.** supp
11790 6c 69 65 64 20 69 74 20 69 73 20 75 73 65 64 20  lied it is used 
117a0 69 6e 20 70 6c 61 63 65 20 6f 66 20 70 4b 65 79  in place of pKey
117b0 2c 6e 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ,nKey..*/.int sq
117c0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43  lite3VdbeIdxKeyC
117d0 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72  ompare(.  Cursor
117e0 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
117f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
11800 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
11810 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
11820 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
11830 61 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63  acked,  /* Unpac
11840 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  ked version of p
11850 4b 65 79 20 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a  Key and nKey */.
11860 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11880 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
11890 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
118a0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
118b0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
118c0 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
118d0 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
118e0 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
118f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65    sqlite3BtreeKe
11900 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
11910 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43  llKey);.  if( nC
11920 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20  ellKey<=0 ){.   
11930 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
11940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11950 0a 20 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b  .  }.  m.db = 0;
11960 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a  .  m.flags = 0;.
11970 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b    m.zMalloc = 0;
11980 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
11990 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
119a0 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  pC->pCursor, 0, 
119b0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
119c0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
119d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
119e0 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70 61  .  assert( pUnpa
119f0 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e  cked->flags & UN
11a00 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f  PACKED_IGNORE_RO
11a10 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20  WID );.  *res = 
11a20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11a30 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
11a40 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
11a50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
11a60 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
11a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
11a90 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
11aa0 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
11ab0 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
11ac0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
11ad0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
11ae0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
11af0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
11b00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
11b10 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
11b20 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
11b30 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
11b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11b50 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
11b60 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
11b70 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
11b80 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
11b90 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
11ba0 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
11bb0 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
11bc0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
11bd0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
11be0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
11bf0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
11c00 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
11c10 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
11c20 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
11c30 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
11c40 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
11c50 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
11c60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11c70 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
11c80 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
11c90 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
11ca0 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
11cb0 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
11cc0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
11cd0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
11ce0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
11cf0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
11d00 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
11d10 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
11d20 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
11d30 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
11d40 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
11d50 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
11d60 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
11d70 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
11d80 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
11d90 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
11da0 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
11db0 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
11dc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
11dd0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
11de0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
11df0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
11e00 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
11e10 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
11e20 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
11e30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
11e40 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
11e50 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
11e60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
11e70 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
11e80 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
11e90 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
11ea0 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
11eb0 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
11ec0 3e 64 62 3b 0a 7d 0a                             >db;.}.