/ Hex Artifact Content
Login

Artifact 2f6c3fcedaebff15f2a161750e0f4dbf7b2df8b9:


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 33 31 20 32  eaux.c,v 1.431 2
02c0: 30 30 39 2f 30 31 2f 31 36 20 31 35 3a 32 31 3a  009/01/16 15:21:
02d0: 30 36 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  06 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 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72  least one op lar
0940: 67 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20  ger than .** it 
0950: 77 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  was..**.** If an
0960: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
0970: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
0980: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
0990: 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  rray, return.** 
09a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e  SQLITE_NOMEM. In
09b0: 20 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e   this case Vdbe.
09c0: 61 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70  aOp and Vdbe.nOp
09d0: 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a  Alloc remain .**
09e0: 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73   unchanged (this
09f0: 20 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20   is so that any 
0a00: 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20  opcodes already 
0a10: 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65  allocated can be
0a20: 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64   .** correctly d
0a30: 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67  eallocated along
0a40: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f   with the rest o
0a50: 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a  f the Vdbe)..*/.
0a60: 73 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f  static int growO
0a70: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b  pArray(Vdbe *p){
0a80: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b  .  VdbeOp *pNew;
0a90: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0aa0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e  ->nOpAlloc ? p->
0ab0: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e  nOpAlloc*2 : (in
0ac0: 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f  t)(1024/sizeof(O
0ad0: 70 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  p)));.  pNew = s
0ae0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
0af0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e  p->db, p->aOp, n
0b00: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0b10: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0b20: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
0b30: 20 6e 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 61 4f   nNew;.    p->aO
0b40: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  p = pNew;.  }.  
0b50: 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53  return (pNew ? S
0b60: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
0b70: 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f 2a 0a  E_NOMEM);.}../*.
0b80: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0b90: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0ba0: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0bb0: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0bc0: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0bd0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0be0: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0bf0: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0c00: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0c10: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0c20: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0c30: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0c40: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0c50: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0c60: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0c70: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0c80: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
0c90: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
0ca0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
0cb0: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
0cc0: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
0cd0: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
0ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
0cf0: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
0d00: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
0d10: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
0d20: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
0d30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0d40: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
0d50: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
0d60: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
0d70: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
0d80: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
0d90: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
0da0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
0db0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
0dc0: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
0dd0: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
0de0: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
0df0: 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72      if( growOpAr
0e00: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 20 20  ray(p) ){.      
0e10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
0e20: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a    }.  p->nOp++;.
0e30: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
0e40: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64  i];.  pOp->opcod
0e50: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f  e = (u8)op;.  pO
0e60: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70  p->p5 = 0;.  pOp
0e70: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70  ->p1 = p1;.  pOp
0e80: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70  ->p2 = p2;.  pOp
0e90: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70  ->p3 = p3;.  pOp
0ea0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f  ->p4.p = 0;.  pO
0eb0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
0ec0: 4f 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70  OTUSED;.  p->exp
0ed0: 69 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ired = 0;.#ifdef
0ee0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
0ef0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  pOp->zComment = 
0f00: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
0f10: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
0f20: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
0f30: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f  tOp(0, i, &p->aO
0f40: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69  p[i]);.#endif.#i
0f50: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
0f60: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20  E.  pOp->cycles 
0f70: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20  = 0;.  pOp->cnt 
0f80: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  = 0;.#endif.  re
0f90: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71  turn i;.}.int sq
0fa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
0fb0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29  Vdbe *p, int op)
0fc0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
0fd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
0fe0: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  op, 0, 0, 0);.}.
0ff0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
1000: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69  ddOp1(Vdbe *p, i
1010: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a  nt op, int p1){.
1020: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1030: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1040: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  , p1, 0, 0);.}.i
1050: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1060: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp2(Vdbe *p, in
1070: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1080: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p2){.  return 
1090: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10a0: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
10b0: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   0);.}.../*.** A
10c0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
10d0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
10e0: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69  4 value as a poi
10f0: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nter..*/.int sql
1100: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a  ite3VdbeAddOp4(.
1110: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
1120: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1130: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
1140: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1160: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
1170: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1190: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
11a0: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
11b0: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
11c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e0: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
11f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1200: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50  zP4,    /* The P
1210: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
1220: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
1230: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
1240: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   type */.){.  in
1250: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33  t addr = sqlite3
1260: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
1270: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1280: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1290: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50  geP4(p, addr, zP
12a0: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65  4, p4type);.  re
12b0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
12c0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
12d0: 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20   symbolic label 
12e0: 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69  for an instructi
12f0: 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20  on that has yet 
1300: 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20  to be.** coded. 
1310: 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61   The symbolic la
1320: 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  bel is really ju
1330: 73 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  st a negative nu
1340: 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61  mber.  The.** la
1350: 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20  bel can be used 
1360: 61 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  as the P2 value 
1370: 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  of an operation.
1380: 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a    Later, when.**
1390: 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65   the label is re
13a0: 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63  solved to a spec
13b0: 69 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68  ific address, th
13c0: 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e  e VDBE will scan
13d0: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20  .** through its 
13e0: 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  operation list a
13f0: 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61  nd change all va
1400: 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68  lues of P2 which
1410: 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61   match.** the la
1420: 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73  bel into the res
1430: 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a  olved address..*
1440: 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e  *.** The VDBE kn
1450: 6f 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61  ows that a P2 va
1460: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62  lue is a label b
1470: 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72  ecause labels ar
1480: 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61  e.** always nega
1490: 74 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75  tive and P2 valu
14a0: 65 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74  es are suppose t
14b0: 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76  o be non-negativ
14c0: 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e  e..** Hence, a n
14d0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
14e0: 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74   is a label that
14f0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72   has yet to be r
1500: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a  esolved..**.** Z
1510: 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20  ero is returned 
1520: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  if a malloc() fa
1530: 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ils..*/.int sqli
1540: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1550: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
1560: 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61   i;.  i = p->nLa
1570: 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28  bel++;.  assert(
1580: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
1590: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
15a0: 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c  if( i>=p->nLabel
15b0: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74  Alloc ){.    int
15c0: 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c   n = p->nLabelAl
15d0: 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20 20 20 20 70  loc*2 + 5;.    p
15e0: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
15f0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
1600: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
1610: 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  el,.            
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 6e 2a 73 69 7a             n*siz
1640: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
1650: 29 29 3b 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65  ));.    p->nLabe
1660: 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  lAlloc = sqlite3
1670: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
1680: 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 2f 73  db, p->aLabel)/s
1690: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
16a0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0]);.  }.  if( p
16b0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
16c0: 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d  p->aLabel[i] = -
16d0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
16e0: 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  -1-i;.}../*.** R
16f0: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22  esolve label "x"
1700: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65   to be the addre
1710: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
1720: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a  nstruction to.**
1730: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54   be inserted.  T
1740: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22  he parameter "x"
1750: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1760: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
1770: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
1780: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1790: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Label()..*/.void
17a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
17b0: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  lveLabel(Vdbe *p
17c0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74 20  , int x){.  int 
17d0: 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65  j = -1-x;.  asse
17e0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
17f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
1800: 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30 20  .  assert( j>=0 
1810: 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  && j<p->nLabel )
1820: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65  ;.  if( p->aLabe
1830: 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62  l ){.    p->aLab
1840: 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  el[j] = p->nOp;.
1850: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f    }.}../*.** Loo
1860: 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 72  p through the pr
1870: 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ogram looking fo
1880: 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61 74  r P2 values that
1890: 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a   are negative.**
18a0: 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63   on jump instruc
18b0: 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63  tions.  Each suc
18c0: 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  h value is a lab
18d0: 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65  el.  Resolve the
18e0: 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74  .** label by set
18f0: 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75  ting the P2 valu
1900: 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  e to its correct
1910: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e   non-zero value.
1920: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1930: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ine is called on
1940: 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63  ce after all opc
1950: 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69  odes have been i
1960: 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56  nserted..**.** V
1970: 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e  ariable *pMaxFun
1980: 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f 20  cArgs is set to 
1990: 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  the maximum valu
19a0: 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75  e of any P2 argu
19b0: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f  ment .** to an O
19c0: 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41  P_Function, OP_A
19d0: 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69  ggStep or OP_VFi
19e0: 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69  lter opcode. Thi
19f0: 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a  s is used by .**
1a00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a10: 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20  Ready() to size 
1a20: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
1a30: 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   array..**.** Th
1a40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
1a50: 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  does the followi
1a60: 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 3a  ng optimization:
1a70: 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a 2a    It scans for.*
1a80: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  * instructions t
1a90: 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65 20  hat might cause 
1aa0: 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  a statement roll
1ab0: 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73 74  back.  Such inst
1ac0: 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 3a  ructions.** are:
1ad0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
1ae0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
1af0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
1b00: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
1b10: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
1b20: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
1b30: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
1b40: 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49 66  VRename.**.** If
1b50: 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75 63   no such instruc
1b60: 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74  tion is found, t
1b70: 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65 6d  hen every Statem
1b80: 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ent instruction 
1b90: 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20 74  .** is changed t
1ba0: 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74 68  o a Noop.  In th
1bb0: 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64  is way, we avoid
1bc0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73 74   creating the st
1bd0: 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75 72  atement .** jour
1be0: 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65 73  nal file unneces
1bf0: 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sarily..*/.stati
1c00: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
1c10: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
1c20: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
1c30: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
1c40: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30 3b  nt nMaxArgs = 0;
1c50: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 6e  .  Op *pOp;.  in
1c60: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e 61  t *aLabel = p->a
1c70: 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f 65  Label;.  int doe
1c80: 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61  sStatementRollba
1c90: 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  ck = 0;.  int ha
1ca0: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
1cb0: 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  = 0;.  p->readOn
1cc0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 75 73 65  ly = 1;.  p->use
1cd0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  sStmtJournal = 0
1ce0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
1cf0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
1d00: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
1d10: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
1d20: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
1d30: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
1d40: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20  =OP_Function || 
1d50: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74  opcode==OP_AggSt
1d60: 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ep ){.      if( 
1d70: 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73  pOp->p5>nMaxArgs
1d80: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
1d90: 70 2d 3e 70 35 3b 0a 23 69 66 6e 64 65 66 20 53  p->p5;.#ifndef S
1da0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1db0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
1dc0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50  e if( opcode==OP
1dd0: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20  _VUpdate ){.    
1de0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d    if( pOp->p2>nM
1df0: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
1e00: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e  s = pOp->p2;.#en
1e10: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  dif.    }.    if
1e20: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c  ( opcode==OP_Hal
1e30: 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
1e40: 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43  Op->p1==SQLITE_C
1e50: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
1e60: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  ->p2==OE_Abort )
1e70: 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53 74  {.        doesSt
1e80: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1e90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1ea0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64   }else if( opcod
1eb0: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
1ec0: 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61 74  ){.      hasStat
1ed0: 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a  ementBegin = 1;.
1ee0: 20 20 20 20 20 20 70 2d 3e 75 73 65 73 53 74 6d        p->usesStm
1ef0: 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  tJournal = 1;.  
1f00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1f10: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29  de==OP_Destroy )
1f20: 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74  {.      doesStat
1f30: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1f40: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1f50: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 6e   opcode==OP_Tran
1f60: 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d 3e  saction && pOp->
1f70: 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  p2!=0 ){.      p
1f80: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
1f90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fa0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1fb0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1fc0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
1fd0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
1fe0: 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  VRename ){.     
1ff0: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
2000: 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
2010: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
2020: 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b 0a  ==OP_VFilter ){.
2030: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2040: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
2050: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
2060: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
2070: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
2080: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
2090: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
20a0: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78        if( n>nMax
20b0: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
20c0: 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = n;.#endif.    
20d0: 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
20e0: 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61 73 50  e3VdbeOpcodeHasP
20f0: 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65 2c 20  roperty(opcode, 
2100: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26 20 70  OPFLG_JUMP) && p
2110: 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20  Op->p2<0 ){.    
2120: 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70    assert( -1-pOp
2130: 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29  ->p2<p->nLabel )
2140: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20  ;.      pOp->p2 
2150: 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d  = aLabel[-1-pOp-
2160: 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >p2];.    }.  }.
2170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2180: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c  p->db, p->aLabel
2190: 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  );.  p->aLabel =
21a0: 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63   0;..  *pMaxFunc
21b0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
21c0: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76  ..  /* If we nev
21d0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74  er rollback a st
21e0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21f0: 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d  ion, then statem
2200: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
2210: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65  tions are not ne
2220: 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65  eded.  So change
2230: 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d   every OP_Statem
2240: 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20  ent.  ** opcode 
2250: 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e  into an OP_Noop.
2260: 20 20 54 68 69 73 20 61 76 6f 69 64 20 61 20 63    This avoid a c
2270: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
2280: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a  OpenExclusive().
2290: 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62    ** which can b
22a0: 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73  e expensive on s
22b0: 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20  ome platforms.. 
22c0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61   */.  if( hasSta
22d0: 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21  tementBegin && !
22e0: 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c  doesStatementRol
22f0: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e  lback ){.    p->
2300: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
2310: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  = 0;.    for(pOp
2320: 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f  =p->aOp, i=p->nO
2330: 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  p-1; i>=0; i--, 
2340: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
2350: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
2360: 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  P_Statement ){. 
2370: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
2380: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
2390: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
23a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23b0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
23c0: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
23d0: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
23e0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23f0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2400: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
2410: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
2420: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2430: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
2440: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
2450: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
2460: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
2470: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
2480: 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  ck.  Return the.
2490: 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  ** address of th
24a0: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
24b0: 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20  n added..*/.int 
24c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24d0: 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  List(Vdbe *p, in
24e0: 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73  t nOp, VdbeOpLis
24f0: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20  t const *aOp){. 
2500: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
2510: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
2520: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2530: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
2540: 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c   nOp > p->nOpAll
2550: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
2560: 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  y(p) ){.    retu
2570: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72  rn 0;.  }.  addr
2580: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
2590: 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69 6e   nOp>0 ){.    in
25a0: 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c  t i;.    VdbeOpL
25b0: 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d  ist const *pIn =
25c0: 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d   aOp;.    for(i=
25d0: 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70  0; i<nOp; i++, p
25e0: 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  In++){.      int
25f0: 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20   p2 = pIn->p2;. 
2600: 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75       VdbeOp *pOu
2610: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  t = &p->aOp[i+ad
2620: 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d  dr];.      pOut-
2630: 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f  >opcode = pIn->o
2640: 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75  pcode;.      pOu
2650: 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b  t->p1 = pIn->p1;
2660: 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20  .      if( p2<0 
2670: 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70  && sqlite3VdbeOp
2680: 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79 28  codeHasProperty(
2690: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f 50  pOut->opcode, OP
26a0: 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20 20  FLG_JUMP) ){.   
26b0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
26c0: 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b  addr + ADDR(p2);
26d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26e0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
26f0: 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p2;.      }.   
2700: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
2710: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
2720: 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  t->p4type = P4_N
2730: 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f  OTUSED;.      pO
2740: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
2750: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30      pOut->p5 = 0
2760: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2770: 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75 74  DEBUG.      pOut
2780: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a  ->zComment = 0;.
2790: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
27a0: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
27b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
27c0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
27d0: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70   i+addr, &p->aOp
27e0: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20  [i+addr]);.     
27f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
2800: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f      p->nOp += nO
2810: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
2820: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
2830: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2840: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e  of the P1 operan
2850: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2860: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
2870: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2880: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
2890: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
28a0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
28b0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
28c0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
28d0: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
28e0: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
28f0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
2900: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
2910: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
2920: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
2930: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
2940: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61  r, int val){.  a
2950: 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
2960: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2970: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2980: 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26  ( p && addr>=0 &
2990: 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26  & p->nOp>addr &&
29a0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70   p->aOp ){.    p
29b0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d  ->aOp[addr].p1 =
29c0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   val;.  }.}../*.
29d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
29e0: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70  lue of the P2 op
29f0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2a00: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
2a10: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2a20: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20  e is useful for 
2a30: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64  setting a jump d
2a40: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  estination..*/.v
2a50: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2a60: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
2a70: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2a80: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2a90: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2aa0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2ab0: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2ac0: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2ad0: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2ae0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2af0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20  dr].p2 = val;.  
2b00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2b10: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2b20: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f  he P3 operand fo
2b30: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
2b40: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
2b50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2b60: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 69  ngeP3(Vdbe *p, i
2b70: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  nt addr, int val
2b80: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  ){.  assert( p==
2b90: 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  0 || p->magic==V
2ba0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2bb0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64 64  ;.  if( p && add
2bc0: 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61  r>=0 && p->nOp>a
2bd0: 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b  ddr && p->aOp ){
2be0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72  .    p->aOp[addr
2bf0: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a  ].p3 = val;.  }.
2c00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
2c10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2c20: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P5 operand for 
2c30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2c40: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61  y.** added opera
2c50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
2c60: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2c70: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61  5(Vdbe *p, u8 va
2c80: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2c90: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2ca0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2cb0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  );.  if( p && p-
2cc0: 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >aOp ){.    asse
2cd0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
2ce0: 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f      p->aOp[p->nO
2cf0: 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20  p-1].p5 = val;. 
2d00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2d10: 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  ge the P2 operan
2d20: 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e  d of instruction
2d30: 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74   addr so that it
2d40: 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
2d50: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
2d60: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2d70: 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a  n to be coded..*
2d80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2d90: 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20  beJumpHere(Vdbe 
2da0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20  *p, int addr){. 
2db0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2dc0: 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d  geP2(p, addr, p-
2dd0: 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  >nOp);.}.../*.**
2de0: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75   If the input Fu
2df0: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
2e00: 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68  is ephemeral, th
2e10: 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a  en free it.  If.
2e20: 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69  ** the FuncDef i
2e30: 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20  s not ephermal, 
2e40: 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  then do nothing.
2e50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e60: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
2e70: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
2e80: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66  b, FuncDef *pDef
2e90: 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20 26 26  ){.  if( pDef &&
2ea0: 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20   (pDef->flags & 
2eb0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45  SQLITE_FUNC_EPHE
2ec0: 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  M)!=0 ){.    sql
2ed0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
2ee0: 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Def);.  }.}../*.
2ef0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76  ** Delete a P4 v
2f00: 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72  alue if necessar
2f10: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
2f20: 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33  d freeP4(sqlite3
2f30: 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65   *db, int p4type
2f40: 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69  , void *p4){.  i
2f50: 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73 77 69  f( p4 ){.    swi
2f60: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
2f70: 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41       case P4_REA
2f80: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  L:.      case P4
2f90: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
2fa0: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 0a 20  se P4_MPRINTF:. 
2fb0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e       case P4_DYN
2fc0: 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65  AMIC:.      case
2fd0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20   P4_KEYINFO:.   
2fe0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52     case P4_INTAR
2ff0: 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 20  RAY:.      case 
3000: 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
3010: 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  FF: {.        sq
3020: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3030: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
3040: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3050: 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 55    case P4_VDBEFU
3060: 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64  NC: {.        Vd
3070: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
3080: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29  c = (VdbeFunc *)
3090: 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65  p4;.        free
30a0: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
30b0: 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 2d  n(db, pVdbeFunc-
30c0: 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  >pFunc);.       
30d0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
30e0: 74 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46  teAuxData(pVdbeF
30f0: 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unc, 0);.       
3100: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3110: 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20  b, pVdbeFunc);. 
3120: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3130: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3140: 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20   P4_FUNCDEF: {. 
3150: 20 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d         freeEphem
3160: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c  eralFunction(db,
3170: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a   (FuncDef*)p4);.
3180: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
31a0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
31b0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
31c0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
31d0: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
31e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
31f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
3200: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
3210: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
3220: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
3230: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3240: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
3250: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3260: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
3270: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
3280: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
3290: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
32a0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
32b0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
32c0: 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a 20 20  while( N-- ){.  
32d0: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70      freeP4(db, p
32e0: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
32f0: 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65  >p4.p);.      me
3300: 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a  mset(pOp, 0, siz
3310: 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20  eof(pOp[0]));.  
3320: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
3330: 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  = OP_Noop;.     
3340: 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   pOp++;.    }.  
3350: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
3360: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
3370: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
3380: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
3390: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
33a0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
33b0: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
33c0: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
33d0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
33e0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
33f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
3400: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
3410: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
3420: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
3430: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
3440: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
3450: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
3460: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
3470: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
3480: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
3490: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
34a0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
34b0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
34c0: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
34d0: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
34e0: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
34f0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
3500: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
3510: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
3520: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
3530: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
3540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34  ..**.** If n==P4
3550: 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e  _KEYINFO it mean
3560: 73 20 74 68 61 74 20 7a 50 34 20 69 73 20 61 20  s that zP4 is a 
3570: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
3580: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
3590: 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64  ** A copy is mad
35a0: 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f  e of the KeyInfo
35b0: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20   structure into 
35c0: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
35d0: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  from.** sqlite3_
35e0: 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72  malloc, to be fr
35f0: 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  eed when the Vdb
3600: 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a  e is finalized..
3610: 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  ** n==P4_KEYINFO
3620: 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74  _HANDOFF indicat
3630: 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e  es that zP4 poin
3640: 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20  ts to a KeyInfo 
3650: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f  structure.** sto
3660: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68  red in memory th
3670: 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
3680: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3690: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20  sqlite3_malloc. 
36a0: 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73  The .** caller s
36b0: 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74  hould not free t
36c0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  he allocation, i
36d0: 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
36e0: 77 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73  when the Vdbe is
36f0: 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a  .** finalized..*
3700: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
3710: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
3720: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
3730: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
3740: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
3750: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
3760: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
3770: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
3780: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
3790: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
37a0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
37b0: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
37c0: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
37d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
37e0: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
37f0: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
3800: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
3810: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
3820: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
3830: 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a  eChangeP4(Vdbe *
3840: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e  p, int addr, con
3850: 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e  st char *zP4, in
3860: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b  t n){.  Op *pOp;
3870: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
3880: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
3890: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
38a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
38b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
38c0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
38d0: 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  aOp==0 || db->ma
38e0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
38f0: 20 20 69 66 20 28 6e 20 21 3d 20 50 34 5f 4b 45    if (n != P4_KE
3900: 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20 20 66  YINFO) {.      f
3910: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
3920: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
3930: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
3940: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3950: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
3960: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
3970: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3980: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
3990: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
39a0: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
39b0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
39c0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
39d0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
39e0: 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p);.  pOp->p4.p 
39f0: 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34  = 0;.  if( n==P4
3a00: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
3a10: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
3a20: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
3a30: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
3a40: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
3a50: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
3a60: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
3a70: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
3a80: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
3a90: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
3aa0: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
3ab0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
3ac0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
3ad0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f  zP4==0 ){.    pO
3ae0: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  p->p4.p = 0;.   
3af0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3b00: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c  4_NOTUSED;.  }el
3b10: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59  se if( n==P4_KEY
3b20: 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 79 49  INFO ){.    KeyI
3b30: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
3b40: 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c 20 6e     int nField, n
3b50: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 65 6c  Byte;..    nFiel
3b60: 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a 29 7a  d = ((KeyInfo*)z
3b70: 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 20  P4)->nField;.   
3b80: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
3b90: 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 46  *pKeyInfo) + (nF
3ba0: 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 28 70  ield-1)*sizeof(p
3bb0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
3bc0: 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 20 20  ]) + nField;.   
3bd0: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
3be0: 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65  te3Malloc( nByte
3bf0: 20 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   );.    pOp->p4.
3c00: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
3c10: 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  nfo;.    if( pKe
3c20: 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 75  yInfo ){.      u
3c30: 38 20 2a 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20  8 *aSortOrder;. 
3c40: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3c50: 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65  Info, zP4, nByte
3c60: 29 3b 0a 20 20 20 20 20 20 61 53 6f 72 74 4f 72  );.      aSortOr
3c70: 64 65 72 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  der = pKeyInfo->
3c80: 61 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  aSortOrder;.    
3c90: 20 20 69 66 28 20 61 53 6f 72 74 4f 72 64 65 72    if( aSortOrder
3ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79   ){.        pKey
3cb0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3cc0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
3cd0: 72 2a 29 26 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  r*)&pKeyInfo->aC
3ce0: 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b 0a 20 20 20  oll[nField];.   
3cf0: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b 65 79       memcpy(pKey
3d00: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
3d10: 2c 20 61 53 6f 72 74 4f 72 64 65 72 2c 20 6e 46  , aSortOrder, nF
3d20: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ield);.      }. 
3d30: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3d40: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
3d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3d60: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
3d70: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  led = 1;.      p
3d80: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d90: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20  NOTUSED;.    }. 
3da0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3db0: 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46  _KEYINFO_HANDOFF
3dc0: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3dd0: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
3de0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
3df0: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
3e00: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
3e10: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3e20: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
3e30: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
3e40: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
3e50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
3e60: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
3e70: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
3e80: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
3e90: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
3ea0: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
3eb0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
3ec0: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
3ed0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
3ee0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  DEBUG./*.** Chan
3ef0: 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ge the comment o
3f00: 6e 20 74 68 65 20 74 68 65 20 6d 6f 73 74 20 72  n the the most r
3f10: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
3f20: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
3f30: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
3f40: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
3f50: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
3f60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
3f70: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
3f80: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
3f90: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
3fa0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
3fb0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
3fc0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
3fd0: 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  build..*/.void s
3fe0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
3ff0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
4000: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
4010: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
4020: 61 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  ap;.  assert( p-
4030: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
4040: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
4050: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
4060: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
4070: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
4080: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
4090: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
40a0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
40b0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
40c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
40d0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
40e0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
40f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4100: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
4110: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
4120: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
4130: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
4140: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
4150: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4160: 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65  NoopComment(Vdbe
4170: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4180: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
4190: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
41a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
41b0: 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(p, OP_Noop);. 
41c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
41d0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29  0 || p->aOp==0 )
41e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
41f0: 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b  Op==0 || p->aOp[
4200: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
4210: 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e  nt==0 || p->db->
4220: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4230: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a    if( p->nOp ){.
4240: 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20      char **pz = 
4250: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31  &p->aOp[p->nOp-1
4260: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ].zComment;.    
4270: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
4280: 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rmat);.    sqlit
4290: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
42a0: 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20  *pz);.    *pz = 
42b0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28  sqlite3VMPrintf(
42c0: 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  p->db, zFormat, 
42d0: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
42e0: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
42f0: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
4300: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4310: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67  e opcode for a g
4320: 69 76 65 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2f  iven address..*/
4330: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
4340: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
4350: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
4360: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
4370: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
4380: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  T );.  assert( (
4390: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
43a0: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62  p->nOp) || p->db
43b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
43c0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 61 64 64  ;.  return ((add
43d0: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
43e0: 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f 70 5b 61 64  nOp)?(&p->aOp[ad
43f0: 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a 23 69 66 20  dr]):0);.}..#if 
4400: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4410: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c  OMIT_EXPLAIN) ||
4420: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
4430: 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69  ) \.     || defi
4440: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45  ned(VDBE_PROFILE
4450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4460: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a  ITE_DEBUG)./*.**
4470: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
4480: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
4490: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
44a0: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
44b0: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
44c0: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
44d0: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
44e0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
44f0: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
4500: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
4510: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
4520: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
4530: 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74   zTemp;.  assert
4540: 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20  ( nTemp>=20 );. 
4550: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34   switch( pOp->p4
4560: 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
4570: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54   P4_KEYINFO_STAT
4580: 49 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f  IC:.    case P4_
4590: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
45a0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
45b0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
45c0: 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65  fo = pOp->p4.pKe
45d0: 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c  yInfo;.      sql
45e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
45f0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79  emp, zTemp, "key
4600: 69 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e  info(%d", pKeyIn
4610: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
4620: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
4630: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
4640: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
4650: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
4660: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4670: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
4680: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
4690: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [j];.        if(
46a0: 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
46b0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
46c0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c  te3Strlen30(pCol
46d0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
46e0: 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65       if( i+n>nTe
46f0: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4700: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4710: 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a  p[i],",...",4);.
4720: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
4730: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
4740: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69           zTemp[i
4750: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
4760: 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
4770: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26  o->aSortOrder &&
4780: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
4790: 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20  Order[j] ){.    
47a0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
47b0: 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20  +] = '-';.      
47c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
47d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d  memcpy(&zTemp[i]
47e0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e  , pColl->zName,n
47f0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +1);.          i
4800: 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d   += n;.        }
4810: 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65  else if( i+4<nTe
4820: 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  mp-6 ){.        
4830: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4840: 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20  i],",nil",4);.  
4850: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a          i += 4;.
4860: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4870: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
4880: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
4890: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
48a0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
48b0: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
48c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48d0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
48e0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
48f0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
4900: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
4910: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4920: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c  emp, zTemp, "col
4930: 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43  lseq(%.20s)", pC
4940: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4960: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
4970: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  DEF: {.      Fun
4980: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
4990: 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20  ->p4.pFunc;.    
49a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
49b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
49c0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
49d0: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
49e0: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
49f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
4a00: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
4a10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4a20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4a30: 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e  , "%lld", *pOp->
4a40: 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20  p4.pI64);.      
4a50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4a60: 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20   case P4_INT32: 
4a70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4a80: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4a90: 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70  zTemp, "%d", pOp
4aa0: 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62  ->p4.i);.      b
4ab0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ac0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a  case P4_REAL: {.
4ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4ae0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4af0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  emp, "%.16g", *p
4b00: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
4b10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b20: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
4b30: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
4b40: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
4b50: 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Mem;.      asser
4b60: 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  t( (pMem->flags 
4b70: 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29  & MEM_Null)==0 )
4b80: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
4b90: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
4ba0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
4bb0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
4bc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
4bd0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
4be0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
4bf0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
4c00: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
4c10: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
4c20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4c30: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4c40: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
4c50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4c60: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4c70: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
4c80: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
4c90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4ca0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4cb0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4cc0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
4cd0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4ce0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
4cf0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20  pOp->p4.pVtab;. 
4d00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4d10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4d20: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
4d30: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
4d40: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
4d50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
4d60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
4d70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
4d80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4d90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4da0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
4db0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4dc0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4dd0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
4de0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
4df0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
4e00: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
4e10: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
4e20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4e30: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
4e40: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
4e50: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
4e60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
4e70: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
4e80: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
4e90: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
4ea0: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f  ] is used..**.*/
4eb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4ec0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
4ed0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
4ee0: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
4ef0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
4f00: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4f10: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
4f20: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
4f30: 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c  8 );.  mask = 1<
4f40: 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74  <i;.  if( (p->bt
4f50: 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  reeMask & mask)=
4f60: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72  =0 ){.    p->btr
4f70: 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  eeMask |= mask;.
4f80: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
4f90: 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74  MutexArrayInsert
4fa0: 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e  (&p->aMutex, p->
4fb0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b  db->aDb[i].pBt);
4fc0: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66  .  }.}...#if def
4fd0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
4fe0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
4ff0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
5000: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
5010: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
5020: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
5030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
5040: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
5050: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
5060: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
5070: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
5080: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
5090: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74  zPtr[50];.  stat
50a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
50b0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
50c0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
50d0: 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22   %-4s %.2X %s\n"
50e0: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20  ;.  if( pOut==0 
50f0: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b  ) pOut = stdout;
5100: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79  .  zP4 = display
5110: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69  P4(pOp, zPtr, si
5120: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66  zeof(zPtr));.  f
5130: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f  printf(pOut, zFo
5140: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20  rmat1, pc, .    
5150: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e    sqlite3OpcodeN
5160: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
5170: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e  , pOp->p1, pOp->
5180: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34  p2, pOp->p3, zP4
5190: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65  , pOp->p5,.#ifde
51a0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
51b0: 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65       pOp->zComme
51c0: 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  nt ? pOp->zComme
51d0: 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20  nt : "".#else.  
51e0: 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20      "".#endif.  
51f0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
5200: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
5210: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
5220: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
5230: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
5240: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
5250: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
5260: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
5270: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
5280: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  nd;.    sqlite3 
5290: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
52a0: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65   u8 malloc_faile
52b0: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
52c0: 69 6c 65 64 3b 0a 20 20 20 20 66 6f 72 28 70 45  iled;.    for(pE
52d0: 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64  nd=&p[N]; p<pEnd
52e0: 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; p++){.      as
52f0: 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70  sert( (&p[1])==p
5300: 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d  End || p[0].db==
5310: 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20  p[1].db );..    
5320: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
5330: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
5340: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
5350: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
5360: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
5370: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
5380: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
5390: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
53a0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
53b0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
53c0: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
53d0: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
53e0: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
53f0: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
5400: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
5410: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
5420: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
5430: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
5440: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
5450: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
5460: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
5470: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
5480: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
5490: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
54a0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
54b0: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
54c0: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
54d0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
54e0: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
54f0: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
5500: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
5510: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
5520: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
5530: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
5540: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
5550: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
5560: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
5570: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
5580: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
5590: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
55a0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
55b0: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
55c0: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
55d0: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
55e0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
55f0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
5600: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
5610: 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20  MEM_Dyn) ){.    
5620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
5630: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
5640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
5650: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
5660: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5670: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
5680: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
5690: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
56a0: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
56b0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
56c0: 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c     }.    db->mal
56d0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c  locFailed = mall
56e0: 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d  oc_failed;.  }.}
56f0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5700: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
5710: 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c  NAGEMENT.int sql
5720: 69 74 65 33 56 64 62 65 52 65 6c 65 61 73 65 42  ite3VdbeReleaseB
5730: 75 66 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b  uffers(Vdbe *p){
5740: 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
5750: 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73   nFree = 0;.  as
5760: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
5770: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
5780: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
5790: 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65  ii=1; ii<=p->nMe
57a0: 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  m; ii++){.    Me
57b0: 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d  m *pMem = &p->aM
57c0: 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  em[ii];.    if( 
57d0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
57e0: 4d 5f 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20  M_RowSet ){.    
57f0: 20 20 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43    sqlite3RowSetC
5800: 6c 65 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f  lear(pMem->u.pRo
5810: 77 53 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  wSet);.    }.   
5820: 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20   if( pMem->z && 
5830: 70 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pMem->flags&MEM_
5840: 44 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dyn ){.      ass
5850: 65 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c  ert( !pMem->xDel
5860: 20 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20   );.      nFree 
5870: 2b 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  += sqlite3DbMall
5880: 6f 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c  ocSize(pMem->db,
5890: 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20   pMem->z);.     
58a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
58b0: 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20  elease(pMem);.  
58c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
58d0: 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66   nFree;.}.#endif
58e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
58f0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
5900: 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69  .** Give a listi
5910: 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61  ng of the progra
5920: 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c  m in the virtual
5930: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   machine..**.** 
5940: 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73  The interface is
5950: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
5960: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
5970: 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   But instead of.
5980: 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  ** running the c
5990: 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20  ode, it invokes 
59a0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63  the callback onc
59b0: 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72  e for each instr
59c0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
59d0: 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20  feature is used 
59e0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58  to implement "EX
59f0: 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68  PLAIN"..**.** Wh
5a00: 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  en p->explain==1
5a10: 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  , each instructi
5a20: 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57  on is listed.  W
5a30: 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69  hen.** p->explai
5a40: 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78  n==2, only OP_Ex
5a50: 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
5a60: 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e  ns are listed an
5a70: 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73  d these.** are s
5a80: 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72  hown in a differ
5a90: 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e  ent format.  p->
5aa0: 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73  explain==2 is us
5ab0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
5ac0: 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  ** EXPLAIN QUERY
5ad0: 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   PLAN..*/.int sq
5ae0: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
5af0: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
5b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5b10: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73  e VDBE */.){.  s
5b20: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
5b30: 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
5b40: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5b50: 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  K;.  Mem *pMem =
5b60: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
5b70: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20   &p->aMem[1];.. 
5b80: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
5b90: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ain );.  if( p->
5ba0: 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
5bb0: 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53  C_RUN ) return S
5bc0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
5bd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69  assert( db->magi
5be0: 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  c==SQLITE_MAGIC_
5bf0: 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74  BUSY );.  assert
5c00: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
5c10: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
5c20: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
5c30: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
5c40: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
5c50: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
5c60: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
5c70: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
5c80: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
5c90: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
5ca0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
5cb0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
5cc0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
5cd0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
5ce0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
5cf0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
5d00: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
5d10: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
5d20: 41 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e  Array(pMem, p->n
5d30: 4d 65 6d 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  Mem);..  if( p->
5d40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
5d50: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
5d60: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
5d70: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
5d80: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
5d90: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
5da0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
5db0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
5dc0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
5dd0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5de0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5df0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5e00: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
5e10: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
5e20: 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20  le( i<p->nOp && 
5e30: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
5e40: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
5e50: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
5e60: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70  .  if( i>=p->nOp
5e70: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
5e80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
5e90: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
5ea0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
5eb0: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
5ec0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
5ed0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
5ee0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
5ef0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
5f00: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
5f10: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
5f20: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
5f30: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
5f40: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
5f50: 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  z;.    Op *pOp =
5f60: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
5f70: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
5f80: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
5f90: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
5fa0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  t;.      pMem->t
5fb0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5fc0: 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d  EGER;.      pMem
5fd0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20  ->u.i = i;      
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
6000: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  gram counter */.
6010: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
6020: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
6030: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c  gs = MEM_Static|
6040: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
6050: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
6060: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
6070: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
6080: 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63  opcode);  /* Opc
6090: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
60a0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
60b0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
60c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
60d0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
60e0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
60f0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
6100: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
6110: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
6120: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a    pMem++;.    }.
6130: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
6140: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
6150: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
6160: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6180: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d   P1 */.    pMem-
6190: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49  >type = SQLITE_I
61a0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d  NTEGER;.    pMem
61b0: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
61c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
61d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
61e0: 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20  pOp->p2;        
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70    /* P2 */.    p
6210: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6220: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
6230: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
6240: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
6250: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
6260: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
6270: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
6280: 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20   pOp->p3;       
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20     /* P3 */.    
62b0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
62c0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20  QLITE_INTEGER;. 
62d0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20       pMem++;.   
62e0: 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
62f0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
6300: 4d 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20  Mem, 32, 0) ){  
6310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
6320: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e  */.      p->db->
6330: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
6340: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
6350: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6360: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
6370: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  gs = MEM_Dyn|MEM
6380: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
6390: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34     z = displayP4
63a0: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33  (pOp, pMem->z, 3
63b0: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70  2);.    if( z!=p
63c0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
63d0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
63e0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31  tStr(pMem, z, -1
63f0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
6400: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6410: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
6420: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->z!=0 );.      
6430: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
6440: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
6450: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  z);.      pMem->
6460: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6470: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  8;.    }.    pMe
6480: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6490: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b  _TEXT;.    pMem+
64a0: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
64b0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
64c0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
64d0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
64e0: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
64f0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
6500: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
6510: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6520: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
6530: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
6540: 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53   = MEM_Dyn|MEM_S
6550: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
6560: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
6570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6580: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
6590: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
65a0: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
65b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
65c0: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a   = SQLITE_TEXT;.
65d0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
65e0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
65f0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
6600: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6610: 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f  BUG.      if( pO
6620: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
6630: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61         pMem->fla
6640: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
6650: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70  _Term;.        p
6660: 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43  Mem->z = pOp->zC
6670: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  omment;.        
6680: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65  pMem->n = sqlite
6690: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e  3Strlen30(pMem->
66a0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  z);.        pMem
66b0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
66c0: 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  TF8;.        pMe
66d0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
66e0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _TEXT;.      }el
66f0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
6700: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
6710: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6730: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
6740: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d  nt */.        pM
6750: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
6760: 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_NULL;.      }.
6770: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52      }..    p->nR
6780: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 35  esColumn = 8 - 5
6790: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b  *(p->explain-1);
67a0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
67b0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
67c0: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
67d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
67e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
67f0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
6800: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6810: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
6820: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
6830: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
6840: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
6850: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
6860: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
6870: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
6880: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
6890: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
68a0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
68b0: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
68c0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
68d0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
68e0: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
68f0: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
6900: 63 68 61 72 20 2a 7a 20 3d 20 70 4f 70 2d 3e 70  char *z = pOp->p
6910: 34 2e 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  4.z;.    while( 
6920: 69 73 73 70 61 63 65 28 2a 28 75 38 2a 29 7a 29  isspace(*(u8*)z)
6930: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 70 72 69 6e   ) z++;.    prin
6940: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
6950: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
6960: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
6970: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
6980: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
6990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
69a0: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
69b0: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
69c0: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
69d0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
69e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
69f0: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
6a00: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
6a10: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
6a20: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
6a30: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
6a40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
6a50: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
6a60: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
6a70: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
6a80: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
6a90: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
6aa0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
6ab0: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
6ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ad0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
6ae0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
6af0: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
6b00: 3b 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ; isspace((unsig
6b10: 6e 65 64 20 63 68 61 72 29 7a 5b 69 5d 29 3b 20  ned char)z[i]); 
6b20: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
6b30: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
6b40: 20 20 20 20 20 20 69 66 28 20 69 73 73 70 61 63        if( isspac
6b50: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
6b60: 29 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  )z[i]) ){.      
6b70: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
6b80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
6b90: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
6ba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6bb0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
6bc0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
6be0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
6bf0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
6c00: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
6c10: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
6c20: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
6c30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
6c40: 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  TRACE */.../*.**
6c50: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
6c60: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
6c70: 78 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20  xecution.  This 
6c80: 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20  involves things 
6c90: 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63  such.** as alloc
6ca0: 61 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63  ating stack spac
6cb0: 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69  e and initializi
6cc0: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63  ng the program c
6cd0: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72  ounter..** After
6ce0: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
6cf0: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e   prepped, it can
6d00: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20   be executed by 
6d10: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63  one or more.** c
6d20: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
6d30: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a  dbeExec().  .**.
6d40: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f  ** This is the o
6d50: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
6d60: 61 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45  a VDBE from VDBE
6d70: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a  _MAGIC_INIT to.*
6d80: 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  * VDBE_MAGIC_RUN
6d90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6da0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
6db0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
6de0: 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20    int nVar,     
6df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f   /* Number of '?
6e10: 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c  ' see in the SQL
6e20: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
6e30: 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20  int nMem,       
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6e50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f  * Number of memo
6e60: 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f  ry cells to allo
6e70: 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  cate */.  int nC
6e80: 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20  ursor,          
6e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6ea0: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f  er of cursors to
6eb0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69   allocate */.  i
6ec0: 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20  nt isExplain    
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6ee0: 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50   True if the EXP
6ef0: 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73  LAIN keywords is
6f00: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20   present */.){. 
6f10: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
6f20: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
6f30: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
6f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
6f50: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
6f60: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
6f70: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
6f80: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
6f90: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
6fa0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
6fb0: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
6fc0: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
6fd0: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
6fe0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
6ff0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
7000: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
7010: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
7020: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
7030: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
7040: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
7050: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
7060: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
7070: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
7080: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
7090: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
70a0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
70b0: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
70c0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
70d0: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
70e0: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
70f0: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
7100: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
7110: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
7120: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
7130: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
7140: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
7150: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
7160: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
7170: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
7180: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
7190: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
71a0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
71b0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
71c0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
71d0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
71e0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
71f0: 63 61 74 69 6f 6e 20 73 70 61 63 65 20 66 6f 72  cation space for
7200: 20 72 65 67 69 73 74 65 72 73 2e 0a 20 20 2a 2f   registers..  */
7210: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d  .  if( p->aMem==
7220: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  0 ){.    int nAr
7230: 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69  g;       /* Maxi
7240: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
7250: 67 73 20 70 61 73 73 65 64 20 74 6f 20 61 20 75  gs passed to a u
7260: 73 65 72 20 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f  ser function. */
7270: 0a 20 20 20 20 72 65 73 6f 6c 76 65 50 32 56 61  .    resolveP2Va
7280: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 6e 56 61 72      assert( nVar
72a0: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >=0 );.    if( i
72b0: 73 45 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  sExplain && nMem
72c0: 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 6e 4d 65  <10 ){.      nMe
72d0: 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20  m = 10;.    }.  
72e0: 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 73 71 6c 69    p->aMem = sqli
72f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7300: 64 62 2c 0a 20 20 20 20 20 20 20 20 6e 4d 65 6d  db,.        nMem
7310: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20 20 20  *sizeof(Mem)    
7320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d             /* aM
7330: 65 6d 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56  em */.      + nV
7340: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 20  ar*sizeof(Mem)  
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7360: 61 56 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20  aVar */.      + 
7370: 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a  nArg*sizeof(Mem*
7380: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
7390: 2a 20 61 70 41 72 67 20 2a 2f 0a 20 20 20 20 20  * apArg */.     
73a0: 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63   + nVar*sizeof(c
73b0: 68 61 72 2a 29 20 20 20 20 20 20 20 20 20 20 20  har*)           
73c0: 20 20 2f 2a 20 61 7a 56 61 72 20 2a 2f 0a 20 20    /* azVar */.  
73d0: 20 20 20 20 2b 20 6e 43 75 72 73 6f 72 2a 73 69      + nCursor*si
73e0: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
73f0: 29 2b 31 20 20 2f 2a 20 61 70 43 73 72 20 2a 2f  )+1  /* apCsr */
7400: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
7410: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
7420: 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  d ){.      p->aM
7430: 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20  em--;           
7440: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
7450: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
7460: 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  .      p->nMem =
7470: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 2f 2a   nMem;        /*
7480: 20 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20         not from 
7490: 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20  0..nMem-1 */.   
74a0: 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 26 70 2d     p->aVar = &p-
74b0: 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31 5d 3b 0a 20  >aMem[nMem+1];. 
74c0: 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e       p->nVar = n
74d0: 56 61 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 6b  Var;.      p->ok
74e0: 56 61 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Var = 0;.      p
74f0: 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 2a 2a  ->apArg = (Mem**
7500: 29 26 70 2d 3e 61 56 61 72 5b 6e 56 61 72 5d 3b  )&p->aVar[nVar];
7510: 0a 20 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  .      p->azVar 
7520: 3d 20 28 63 68 61 72 2a 2a 29 26 70 2d 3e 61 70  = (char**)&p->ap
7530: 41 72 67 5b 6e 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[nArg];.     
7540: 20 70 2d 3e 61 70 43 73 72 20 3d 20 28 56 64 62   p->apCsr = (Vdb
7550: 65 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e 61 7a  eCursor**)&p->az
7560: 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20  Var[nVar];.     
7570: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43   p->nCursor = nC
7580: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  ursor;.      for
7590: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
75a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
75b0: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
75c0: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
75d0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
75e0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
75f0: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e     for(n=1; n<=n
7600: 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Mem; n++){.     
7610: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c     p->aMem[n].fl
7620: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
7630: 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b          p->aMem[
7640: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
7650: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
7660: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7670: 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70  G.  for(n=1; n<p
7680: 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  ->nMem; n++){.  
7690: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
76a0: 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20  m[n].db==db );. 
76b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e   }.#endif..  p->
76c0: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
76d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
76e0: 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d 20 30  p->uniqueCnt = 0
76f0: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
7700: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
7710: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69   p->explain |= i
7720: 73 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d  sExplain;.  p->m
7730: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
7740: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
7750: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
7760: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
7770: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
7780: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
7790: 6f 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20  openedStatement 
77a0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
77b0: 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
77c0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
77d0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
77e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f  ++){.      p->aO
77f0: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
7800: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79      p->aOp[i].cy
7810: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  cles = 0;.    }.
7820: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
7830: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
7840: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
7850: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
7860: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
7870: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
7880: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
7890: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
78a0: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
78b0: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
78c0: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
78d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
78e0: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29    if( pCx->pBt )
78f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
7900: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74  eeClose(pCx->pBt
7910: 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43  );.    /* The pC
7920: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
7930: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
7940: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
7950: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20  ists, by.    ** 
7960: 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20  the call above. 
7970: 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  */.  }else if( p
7980: 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20  Cx->pCursor ){. 
7990: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
79a0: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
79b0: 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69  pCursor);.  }.#i
79c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
79d0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
79e0: 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43   if( pCx->pVtabC
79f0: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c  ursor ){.    sql
7a00: 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72  ite3_vtab_cursor
7a10: 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20   *pVtabCursor = 
7a20: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
7a30: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  ;.    const sqli
7a40: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
7a50: 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75  ule = pCx->pModu
7a60: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
7a70: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
7a80: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
7a90: 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a  fetyOff(p->db);.
7aa0: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c      pModule->xCl
7ab0: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29  ose(pVtabCursor)
7ac0: 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69  ;.    (void)sqli
7ad0: 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64  te3SafetyOn(p->d
7ae0: 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  b);.    p->inVta
7af0: 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d  bMethod = 0;.  }
7b00: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
7b10: 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54  Cx->ephemPseudoT
7b20: 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  able ){.    sqli
7b30: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c  te3DbFree(p->db,
7b40: 20 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20   pCx->pData);.  
7b50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
7b60: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63   all cursors exc
7b70: 65 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72  ept for VTab cur
7b80: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75  sors that are cu
7b90: 72 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73  rrently.** in us
7ba0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7bb0: 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72  d closeAllCursor
7bc0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
7bd0: 62 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  bs(Vdbe *p){.  i
7be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
7bf0: 70 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pCsr==0 ) return
7c00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
7c10: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
7c20: 0a 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20  .    VdbeCursor 
7c30: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
7c40: 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26  ];.    if( pC &&
7c50: 20 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68   (!p->inVtabMeth
7c60: 6f 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62  od || !pC->pVtab
7c70: 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
7c80: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
7c90: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20  Cursor(p, pC);. 
7ca0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
7cb0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
7cc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
7cd0: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65  p the VM after e
7ce0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  xecution..**.** 
7cf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
7d00: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
7d10: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72  close any cursor
7d20: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72  s, lists, and/or
7d30: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74  .** sorters that
7d40: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e   were left open.
7d50: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65    It also delete
7d60: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a  s the values of.
7d70: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20  ** variables in 
7d80: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79  the aVar[] array
7d90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7da0: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70   Cleanup(Vdbe *p
7db0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
7dc0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
7dd0: 62 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a  b;.  Mem *pMem;.
7de0: 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72    closeAllCursor
7df0: 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61  sExceptActiveVta
7e00: 62 73 28 70 29 3b 0a 20 20 66 6f 72 28 70 4d 65  bs(p);.  for(pMe
7e10: 6d 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 69  m=&p->aMem[1], i
7e20: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
7e30: 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
7e40: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7e50: 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29  s & MEM_RowSet )
7e60: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
7e70: 6f 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d  owSetClear(pMem-
7e80: 3e 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20  >u.pRowSet);.   
7e90: 20 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70   }.    MemSetTyp
7ea0: 65 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f  eFlag(pMem, MEM_
7eb0: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
7ec0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
7ed0: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
7ee0: 6d 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  m);.  if( p->con
7ef0: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
7f00: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7f10: 62 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  b, p->contextSta
7f20: 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f  ck);.  }.  p->co
7f30: 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a  ntextStack = 0;.
7f40: 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63    p->contextStac
7f50: 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d  kDepth = 0;.  p-
7f60: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
7f70: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
7f80: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
7f90: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
7fa0: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
7fb0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
7fc0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
7fd0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
7fe0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
7ff0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
8000: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
8010: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
8020: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
8030: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
8040: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
8050: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
8060: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
8070: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
8080: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
8090: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
80a0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
80b0: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
80c0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
80d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
80e0: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
80f0: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
8100: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
8110: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
8120: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
8130: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
8140: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
8150: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
8160: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
8170: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8180: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
8190: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
81a0: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
81b0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43  esColumn = nResC
81c0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
81d0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
81e0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
81f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
8200: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
8210: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
8220: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
8230: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
8240: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
8250: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
8260: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
8270: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
8280: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
8290: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
82a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
82b0: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
82c0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
82d0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
82e0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
82f0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
8300: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
8310: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
8320: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
8330: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
8340: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
8350: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
8360: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
8370: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
8380: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
8390: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
83a0: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
83b0: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
83c0: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
83d0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
83e0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
83f0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
8400: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
8410: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
8420: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
8430: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
8440: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8450: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
8460: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
8490: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
84a0: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
84d0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
84e0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
84f0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
8500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8510: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
8520: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
8530: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8540: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
8550: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8560: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
8570: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
8580: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
8590: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
85a0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
85b0: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
85c0: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
85d0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
85e0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
85f0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
8600: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
8610: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
8620: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
8630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8640: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
8650: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
8660: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
8670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
8680: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
8690: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
86a0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
86b0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
86c0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
86d0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
86e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
86f0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
8700: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
8710: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
8720: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
8730: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
8740: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
8750: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
8760: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8770: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
8780: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
8790: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
87a0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
87b0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
87c0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
87d0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
87e0: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
87f0: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
8800: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
8810: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
8820: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
8830: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
8840: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
8850: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8860: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
8870: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
8880: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
8890: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
88a0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
88b0: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
88c0: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
88d0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
88e0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
88f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
8900: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8910: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
8920: 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f  ..  /* Before do
8930: 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
8940: 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e  e, call the xSyn
8950: 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  c() callback for
8960: 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61   any.  ** virtua
8970: 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20  l module tables 
8980: 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20  written in this 
8990: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
89a0: 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65  s has to.  ** be
89b0: 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74   done before det
89c0: 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72  ermining whether
89d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
89e0: 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20  l file is .  ** 
89f0: 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20  required, as an 
8a00: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b  xSync() callback
8a10: 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61   may add an atta
8a20: 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20  ched database.  
8a30: 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  ** to the transa
8a40: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
8a50: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79   = sqlite3VtabSy
8a60: 6e 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d  nc(db, &p->zErrM
8a70: 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
8a80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8a90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
8aa0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
8ab0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66  etermines (a) if
8ac0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b   the commit hook
8ad0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b   should be invok
8ae0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20  ed and.  ** (b) 
8af0: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73  how many databas
8b00: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65  e files have ope
8b10: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
8b20: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20  ions, not .  ** 
8b30: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  including the te
8b40: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29  mp database. (b)
8b50: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65   is important be
8b60: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68  cause if more th
8b70: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74  an .  ** one dat
8b80: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61  abase file has a
8b90: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
8ba0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74  nsaction, a mast
8bb0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  er journal.  ** 
8bc0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64  file is required
8bd0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63   for an atomic c
8be0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66  ommit..  */ .  f
8bf0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8c00: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
8c10: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
8c20: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
8c30: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8c40: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
8c50: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
8c60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  it = 1;.      if
8c70: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b  ( i!=1 ) nTrans+
8c80: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
8c90: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8ca0: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
8cb0: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
8cc0: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
8cd0: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
8ce0: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
8cf0: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
8d00: 6b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  k ){.    assert(
8d10: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
8d20: 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 29  LITE_CommitBusy)
8d30: 3d 3d 30 20 29 3b 0a 20 20 20 20 64 62 2d 3e 66  ==0 );.    db->f
8d40: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43  lags |= SQLITE_C
8d50: 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20 28  ommitBusy;.    (
8d60: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
8d70: 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72  tyOff(db);.    r
8d80: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
8d90: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
8da0: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f  mitArg);.    (vo
8db0: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
8dc0: 4f 6e 28 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  On(db);.    db->
8dd0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
8de0: 5f 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20  _CommitBusy;.   
8df0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
8e00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8e10: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d  ONSTRAINT;.    }
8e20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73  .  }..  /* The s
8e30: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20  imple case - no 
8e40: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
8e50: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
8e60: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20   counting the.  
8e70: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  ** TEMP database
8e80: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74  ) has a transact
8e90: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68  ion active.   Th
8ea0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66  ere is no need f
8eb0: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74  or the.  ** mast
8ec0: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  er-journal..  **
8ed0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74  .  ** If the ret
8ee0: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c  urn value of sql
8ef0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
8f00: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f  name() is a zero
8f10: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72   length.  ** str
8f20: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ing, it means th
8f30: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
8f40: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61  is :memory: or a
8f50: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20   temp file.  In 
8f60: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20  .  ** that case 
8f70: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  we do not suppor
8f80: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66  t atomic multi-f
8f90: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20  ile commits, so 
8fa0: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69  use the .  ** si
8fb0: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74  mple case then t
8fc0: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30  oo..  */.  if( 0
8fd0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
8fe0: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  0(sqlite3BtreeGe
8ff0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
9000: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c  b[0].pBt)).   ||
9010: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a   nTrans<=1.  ){.
9020: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
9030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
9040: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
9050: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9060: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9070: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
9080: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9090: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
90a0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
90b0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
90c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
90d0: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
90e0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
90f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
9100: 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
9110: 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
9120: 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
9130: 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
9140: 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
9150: 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
9160: 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
9170: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
9180: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
9190: 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
91a0: 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
91b0: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
91c0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
91d0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
91e0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
91f0: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
9200: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
9210: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
9220: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
9230: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
9240: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
9250: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
9260: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
9270: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
9280: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
9290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
92a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
92b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
92c0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
92d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
92e0: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
92f0: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
9300: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
9310: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
9320: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
9330: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
9340: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
9350: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
9360: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
9370: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
9380: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
9390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
93a0: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
93b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
93c0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
93d0: 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
93e0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
93f0: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
9400: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
9410: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9420: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
9430: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
9440: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
9450: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
9460: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
9470: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
9480: 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
9490: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
94a0: 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20  nt res;..    /* 
94b0: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
94c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
94d0: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
94e0: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
94f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
9500: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
9510: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9520: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
9530: 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52  of(iRandom), &iR
9540: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d  andom);.      zM
9550: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
9560: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
9570: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c  j%08X", zMainFil
9580: 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66  e, iRandom&0x7ff
9590: 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66  fffff);.      if
95a0: 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  ( !zMaster ){.  
95b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
95c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
95d0: 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
95e0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
95f0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
9600: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
9610: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77  S, &res);.    }w
9620: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
9630: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20  _OK && res );.  
9640: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9650: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
9660: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
9670: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20  journal. */.    
9680: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9690: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c  OpenMalloc(pVfs,
96a0: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74   zMaster, &pMast
96b0: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  er, .          S
96c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
96d0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
96e0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20  _CREATE|.       
96f0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
9700: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
9710: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
9720: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  NAL, 0.      );.
9730: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9740: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9760: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
9770: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
9780: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a  ;.    }. .    /*
9790: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20   Write the name 
97a0: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65  of each database
97b0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61   file in the tra
97c0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68  nsaction into th
97d0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73  e new.    ** mas
97e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
97f0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
9800: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69  curs at this poi
9810: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  nt close.    ** 
9820: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d  and delete the m
9830: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9840: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69  le. All the indi
9850: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
9860: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c  iles.    ** stil
9870: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73  l have 'null' as
9880: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9890: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20  nal pointer, so 
98a0: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20  they will roll. 
98b0: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70     ** back indep
98c0: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61  endently if a fa
98d0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20  ilure occurs..  
98e0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
98f0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
9900: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
9910: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
9920: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
9930: 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b  i==1 ) continue;
9940: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65     /* Ignore the
9950: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a   TEMP database *
9960: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
9970: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
9980: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
9990: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46    char const *zF
99a0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
99b0: 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65  eeGetJournalname
99c0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
99d0: 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29  f( zFile[0]==0 )
99e0: 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49   continue;  /* I
99f0: 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64  gnore :memory: d
9a00: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
9a10: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e      if( !needSyn
9a20: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72  c && !sqlite3Btr
9a30: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70  eeSyncDisabled(p
9a40: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
9a50: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
9a60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9a70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
9a80: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46  rite(pMaster, zF
9a90: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ile, sqlite3Strl
9aa0: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f  en30(zFile)+1, o
9ab0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
9ac0: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65  offset += sqlite
9ad0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
9ae0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
9af0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9b00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9b10: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
9b20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
9b30: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
9b40: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9b50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
9b60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9b70: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
9b80: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
9b90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ba0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9bb0: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20  Sync the master 
9bc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
9bd0: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
9be0: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20  NTIAL device.   
9bf0: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20   ** flag is set 
9c00: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  this is not requ
9c10: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9c20: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20   if( needSync . 
9c30: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74      && 0==(sqlit
9c40: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
9c50: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
9c60: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
9c70: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
9c80: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
9c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
9ca0: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
9cb0: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
9cc0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
9cd0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
9ce0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
9cf0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9d00: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
9d10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9d20: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
9d30: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
9d40: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9d50: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
9d60: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
9d70: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
9d80: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
9d90: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
9da0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
9db0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
9dc0: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
9dd0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
9de0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
9df0: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
9e00: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
9e10: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
9e20: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
9e30: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
9e40: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
9e50: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
9e60: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
9e70: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
9e80: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
9e90: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
9ea0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
9eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
9ec0: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
9ed0: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
9ee0: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
9ef0: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
9f00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
9f10: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
9f20: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
9f30: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
9f40: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
9f50: 63 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cured..    */.  
9f60: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
9f70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
9f80: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
9f90: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9fa0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9fb0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
9fc0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
9fd0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9fe0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
9ff0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
a000: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
a010: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
a020: 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
a030: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
a050: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
a060: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a070: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
a080: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
a090: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a0a0: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
a0b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
a0c0: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
a0d0: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
a0e0: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
a0f0: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
a100: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
a110: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
a120: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
a130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
a140: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
a150: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
a160: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
a170: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
a180: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
a190: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
a1a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a1b0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
a1c0: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
a1d0: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
a1e0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
a1f0: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
a200: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
a210: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
a220: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
a230: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
a240: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
a250: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
a260: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
a270: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
a280: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
a290: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
a2a0: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
a2b0: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
a2c0: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
a2d0: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
a2e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
a2f0: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
a300: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
a310: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
a320: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
a330: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
a340: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
a350: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
a360: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
a370: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
a380: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
a390: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
a3a0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
a3b0: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
a3c0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
a3d0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
a3e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
a3f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
a400: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
a410: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
a420: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b  itPhaseTwo(pBt);
a430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a440: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
a450: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
a460: 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
a470: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
a480: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
a490: 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
a4a0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
a4b0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
a4c0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
a4d0: 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
a4e0: 65 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74  e3.activeVdbeCnt
a4f0: 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
a500: 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
a510: 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
a520: 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
a530: 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
a540: 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
a550: 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
a560: 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
a570: 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
a580: 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
a590: 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
a5a0: 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
a5b0: 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
a5c0: 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
a5d0: 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
a5e0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
a5f0: 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
a600: 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
a610: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
a620: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
a630: 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
a640: 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
a650: 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
a660: 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
a670: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
a680: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
a690: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
a6a0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
a6b0: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d  C_RUN && p->pc>=
a6c0: 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  0 ){.      cnt++
a6d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
a6e0: 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
a6f0: 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ite++;.    }.   
a700: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
a710: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
a720: 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ==db->activeVdbe
a730: 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Cnt );.  assert(
a740: 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69   nWrite==db->wri
a750: 74 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23  teVdbeCnt );.}.#
a760: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
a770: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
a780: 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
a790: 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65   For every Btree
a7a0: 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73   that in databas
a7b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
a7c0: 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65  which .** has be
a7d0: 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72  en modified, "tr
a7e0: 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74  ip" or invalidat
a7f0: 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e  e each cursor in
a800: 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d  .** that Btree m
a810: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d  ight have been m
a820: 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20  odified so that 
a830: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61  the cursor.** ca
a840: 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  n never be used 
a850: 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70  again.  This hap
a860: 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c  pens when a roll
a870: 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e  back.*** occurs.
a880: 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69    We have to tri
a890: 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  p all the other 
a8a0: 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a  cursors, even.**
a8b0: 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68   cursor from oth
a8c0: 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72  er VMs in differ
a8d0: 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ent database con
a8e0: 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20  nections,.** so 
a8f0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
a900: 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65  m try to use the
a910: 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74   data at which t
a920: 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e  hey.** were poin
a930: 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e  ting and which n
a940: 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ow may have been
a950: 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20   changed due.** 
a960: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  to the rollback.
a970: 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  .**.** Remember 
a980: 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20  that a rollback 
a990: 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65  can delete table
a9a0: 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a  s complete and.*
a9b0: 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61  * reorder rootpa
a9c0: 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e  ges.  So it is n
a9d0: 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75  ot sufficient ju
a9e0: 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68  st to save.** th
a9f0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
aa00: 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20  ursor.  We have 
aa10: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68  to invalidate th
aa20: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74  e cursor.** so t
aa30: 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20  hat it is never 
aa40: 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73  used again..*/.s
aa50: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
aa60: 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f  idateCursorsOnMo
aa70: 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c  difiedBtrees(sql
aa80: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
aa90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
aaa0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
aab0: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
aac0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
aad0: 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69     if( p && sqli
aae0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
aaf0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71  s(p) ){.      sq
ab00: 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
ab10: 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49  lCursors(p, SQLI
ab20: 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d  TE_ABORT);.    }
ab30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
ab40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ab50: 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
ab60: 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
ab70: 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
ab80: 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
ab90: 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
aba0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
abb0: 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
abc0: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
abd0: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
abe0: 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
abf0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
ac00: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ac10: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
ac20: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
ac30: 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
ac40: 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
ac50: 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
ac60: 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
ac70: 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
ac80: 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
ac90: 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
aca0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
acb0: 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
acc0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
acd0: 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
ace0: 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
acf0: 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
ad00: 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
ad10: 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
ad20: 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
ad30: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
ad40: 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
ad50: 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
ad60: 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
ad70: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
ad80: 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
ad90: 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
ada0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
adb0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
adc0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a   int i;.  int (*
add0: 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42  xFunc)(Btree *pB
ade0: 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63  t) = 0;  /* Func
adf0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20  tion to call on 
ae00: 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65  each btree backe
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70  nd */.  int isSp
ae20: 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20  ecialError;     
ae30: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
ae40: 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   true if SQLITE_
ae50: 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a  NOMEM or IOERR *
ae60: 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e  /..  /* This fun
ae70: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ction contains t
ae80: 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65  he logic that de
ae90: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
aea0: 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20  atement or.  ** 
aeb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
aec0: 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
aed0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
aee0: 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a  a result of the.
aef0: 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f    ** execution o
af00: 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d  f this virtual m
af10: 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20  achine. .  **.  
af20: 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  ** If any of the
af30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
af40: 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20  s occur:.  **.  
af50: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f  **     SQLITE_NO
af60: 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  MEM.  **     SQL
af70: 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20  ITE_IOERR.  **  
af80: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20     SQLITE_FULL. 
af90: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
afa0: 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20  NTERRUPT.  **.  
afb0: 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65  ** Then the inte
afc0: 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74  rnal cache might
afd0: 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20   have been left 
afe0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
aff0: 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  nt.  ** state.  
b000: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62  We need to rollb
b010: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
b020: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  t transaction, i
b030: 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  f there is.  ** 
b040: 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70  one, or the comp
b050: 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  lete transaction
b060: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
b070: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
b080: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69  ction..  */..  i
b090: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
b0a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d  Failed ){.    p-
b0b0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  >rc = SQLITE_NOM
b0c0: 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  EM;.  }.  closeA
b0d0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
b0e0: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
b0f0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
b100: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
b110: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b120: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
b130: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
b140: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
b150: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
b160: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
b170: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
b180: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  rted */.  if( p-
b190: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  >pc>=0 ){.    in
b1a0: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
b1b0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
b1c0: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20  rom p->rc */..  
b1d0: 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
b1e0: 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
b1f0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
b200: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
b210: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70  texArrayEnter(&p
b220: 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->aMutex);..    
b230: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
b240: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
b250: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
b260: 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
b270: 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45  ;.    isSpecialE
b280: 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49  rror = mrc==SQLI
b290: 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
b2a0: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54     || mrc==SQLIT
b2d0: 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d  E_INTERRUPT || m
b2e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  rc==SQLITE_FULL;
b2f0: 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69  .    if( isSpeci
b300: 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  alError ){.     
b310: 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79   /* If the query
b320: 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20   was read-only, 
b330: 77 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f  we need do no ro
b340: 6c 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f  llback at all. O
b350: 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20  therwise,.      
b360: 2a 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  ** proceed with 
b370: 74 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64  the special hand
b380: 6c 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ling..      */. 
b390: 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
b3a0: 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
b3b0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
b3c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
b3d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc==SQLITE_IOER
b3e0: 52 5f 42 4c 4f 43 4b 45 44 20 26 26 20 70 2d 3e  R_BLOCKED && p->
b3f0: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
b400: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  ){.          xFu
b410: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
b420: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
b430: 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
b440: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
b450: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b460: 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  (mrc==SQLITE_NOM
b470: 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
b480: 45 5f 46 55 4c 4c 29 0a 20 20 20 20 20 20 20 20  E_FULL).        
b490: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d             && p-
b4a0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
b4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46   ){.          xF
b4c0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  unc = sqlite3Btr
b4d0: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a  eeRollbackStmt;.
b4e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61           /* We a
b500: 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c  re forced to rol
b510: 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76  l back the activ
b520: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42  e transaction. B
b530: 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20  efore doing.    
b540: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f        ** so, abo
b550: 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61  rt any other sta
b560: 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e  tements this han
b570: 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61  dle currently ha
b580: 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20  s active..      
b590: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
b5a0: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
b5b0: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
b5c0: 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
b5d0: 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
b5e0: 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  kAll(db);.      
b5f0: 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
b600: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
b610: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
b620: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
b630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b640: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
b650: 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
b660: 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
b670: 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
b680: 6e 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c  nly active vdbe,
b690: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   then.    ** we 
b6a0: 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
b6b0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
b6c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
b6d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
b6e0: 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
b6f0: 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
b700: 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
b710: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
b720: 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
b730: 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
b740: 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
b750: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
b760: 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
b770: 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
b780: 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
b790: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d  ->writeVdbeCnt==
b7a0: 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
b7b0: 20 0a 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66   .     && (db->f
b7c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f  lags & SQLITE_Co
b7d0: 6d 6d 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20  mmitBusy)==0.   
b7e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
b7f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
b800: 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
b810: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
b820: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
b830: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
b840: 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
b850: 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74  g is true, and t
b860: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
b870: 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  was .        ** 
b880: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69  successful or hi
b890: 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63  t an 'OR FAIL' c
b8a0: 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20  onstraint. This 
b8b0: 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
b8c0: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
b8d0: 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20  quired..        
b8e0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
b8f0: 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
b900: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69  b, p);.        i
b910: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
b920: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SY ){.          
b930: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
b940: 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e  xArrayLeave(&p->
b950: 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  aMutex);.       
b960: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b970: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d  _BUSY;.        }
b980: 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c  else if( rc!=SQL
b990: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b9a0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
b9b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b9c0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b9d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b9e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b9f0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
ba00: 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
ba10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ba20: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
ba30: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ba40: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
ba50: 7d 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63  }else if( !xFunc
ba60: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
ba70: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
ba80: 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  | p->errorAction
ba90: 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20  ==OE_Fail ){.   
baa0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e       if( p->open
bab0: 65 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  edStatement ){. 
bac0: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d           xFunc =
bad0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
bae0: 6d 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20  mitStmt;.       
baf0: 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   } .      }else 
bb00: 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
bb10: 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
bb20: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
bb30: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
bb40: 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20  backStmt;.      
bb50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
bb60: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
bb70: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
bb80: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
bb90: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
bba0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
bbb0: 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
bbc0: 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
bbd0: 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
bbe0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
bbf0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
bc00: 20 78 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55   xFunc is not NU
bc10: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f  LL, then it is o
bc20: 6e 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ne of sqlite3Btr
bc30: 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f  eeRollbackStmt o
bc40: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
bc50: 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e  BtreeCommitStmt.
bc60: 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e   Call it once on
bc70: 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49   each backend. I
bc80: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
bc90: 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  s.    ** and the
bca0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
bcb0: 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c  still SQLITE_OK,
bcc0: 20 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20   set the return 
bcd0: 63 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a  code to the new.
bce0: 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c      ** error val
bcf0: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ue..    */.    a
bd00: 73 73 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a  ssert(!xFunc ||.
bd10: 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c        xFunc==sql
bd20: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53  ite3BtreeCommitS
bd30: 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75  tmt ||.      xFu
bd40: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
bd50: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20  RollbackStmt.   
bd60: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
bd70: 20 78 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e   xFunc && i<db->
bd80: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
bd90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
bda0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
bdb0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
bdc0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63        rc = xFunc
bde0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69  (pBt);.        i
bdf0: 66 28 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d  f( rc && (p->rc=
be00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
be10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  >rc==SQLITE_CONS
be20: 54 52 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20  TRAINT) ){.     
be30: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
be40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
be50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
be60: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
be70: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
be80: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
be90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
bea0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
beb0: 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
bec0: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
bed0: 64 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  d the statement 
bee0: 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a  was committed, .
bef0: 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63      ** set the c
bf00: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a  hange counter. .
bf10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bf20: 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26  ->changeCntOn &&
bf30: 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
bf40: 20 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c     if( !xFunc ||
bf50: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
bf60: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29  treeCommitStmt )
bf70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bf80: 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
bf90: 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
bfa0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
bfb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bfc0: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
bfd0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
bfe0: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
bff0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
c000: 2a 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f  * Rollback or co
c010: 6d 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20  mmit any schema 
c020: 63 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63  changes that occ
c030: 75 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  urred. */.    if
c040: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
c050: 4f 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26  OK && db->flags&
c060: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
c070: 6e 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71  nges ){.      sq
c080: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
c090: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
c0a0: 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  .      db->flags
c0b0: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20   = (db->flags | 
c0c0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
c0d0: 6e 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  nges);.    }..  
c0e0: 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
c0f0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
c100: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
c110: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
c120: 75 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  utex);.  }..  /*
c130: 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73   We have success
c140: 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64  fully halted and
c150: 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20   closed the VM. 
c160: 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63   Record this fac
c170: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  t. */.  if( p->p
c180: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  c>=0 ){.    db->
c190: 61 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b  activeVdbeCnt--;
c1a0: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
c1b0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64  dOnly ){.      d
c1c0: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d  b->writeVdbeCnt-
c1d0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  -;.    }.    ass
c1e0: 65 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56  ert( db->activeV
c1f0: 64 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74  dbeCnt>=db->writ
c200: 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a  eVdbeCnt );.  }.
c210: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
c220: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20  E_MAGIC_HALT;.  
c230: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
c240: 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d  nt(db);.  if( p-
c250: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c260: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
c270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
c280: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
c290: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
c2a0: 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
c2b0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
c2c0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
c2d0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
c2e0: 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
c2f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
c300: 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
c310: 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
c320: 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
c330: 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
c340: 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
c350: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
c360: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
c370: 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66  ean up a VDBE af
c380: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75  ter execution bu
c390: 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  t do not delete 
c3a0: 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65  the VDBE just ye
c3b0: 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20  t..** Write any 
c3c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
c3d0: 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20  nto *pzErrMsg.  
c3e0: 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
c3f0: 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66  t code..**.** Af
c400: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
c410: 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42   is run, the VDB
c420: 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64  E should be read
c430: 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64  y to be executed
c440: 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a  .** again..**.**
c450: 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61   To look at it a
c460: 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73  nother way, this
c470: 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20   routine resets 
c480: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
c490: 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68  .** virtual mach
c4a0: 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  ine from VDBE_MA
c4b0: 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f  GIC_RUN or VDBE_
c4c0: 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20  MAGIC_HALT back 
c4d0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
c4e0: 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _INIT..*/.int sq
c4f0: 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56  lite3VdbeReset(V
c500: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
c510: 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70  e3 *db;.  db = p
c520: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ->db;..  /* If t
c530: 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75  he VM did not ru
c540: 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20  n to completion 
c550: 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74  or if it encount
c560: 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72  ered an.  ** err
c570: 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  or, then it migh
c580: 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  t not have been 
c590: 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e  halted properly.
c5a0: 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69    So halt.  ** i
c5b0: 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76  t now..  */.  (v
c5c0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
c5d0: 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  yOn(db);.  sqlit
c5e0: 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20  e3VdbeHalt(p);. 
c5f0: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
c600: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20  fetyOff(db);..  
c610: 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
c620: 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
c630: 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
c640: 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
c650: 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
c660: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
c670: 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
c680: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
c690: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
c6a0: 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
c6b0: 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
c6c0: 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
c6d0: 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
c6e0: 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
c6f0: 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
c700: 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
c710: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
c720: 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
c730: 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
c740: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
c750: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72  {.    if( p->zEr
c760: 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71  rMsg ){.      sq
c770: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
c780: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
c790: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
c7a0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
c7b0: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
c7c0: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
c7d0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73  NSIENT);.      s
c7e0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
c7f0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64  alloc();.      d
c800: 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e  b->errCode = p->
c810: 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  rc;.      sqlite
c820: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
c830: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70  ErrMsg);.      p
c840: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
c850: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
c860: 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
c870: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e  te3Error(db, p->
c880: 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, 0);.    }els
c890: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
c8a0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
c8b0: 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  _OK, 0);.    }. 
c8c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
c8d0: 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
c8e0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
c8f0: 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
c900: 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
c910: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
c920: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
c930: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
c940: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
c950: 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
c960: 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
c970: 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
c980: 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
c990: 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
c9a0: 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
c9b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
c9c0: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20   p->rc, 0);.    
c9d0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
c9e0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c  tr(db->pErr, -1,
c9f0: 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c   p->zErrMsg, SQL
ca00: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
ca10: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
ca20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ca30: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
ca40: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
ca50: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
ca60: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
ca70: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
ca80: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
ca90: 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
caa0: 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
cab0: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
cac0: 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
cad0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
cae0: 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
caf0: 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
cb00: 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
cb10: 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
cb20: 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
cb30: 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
cb40: 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
cb50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cb60: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
cb70: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
cb80: 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
cb90: 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
cba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
cbb0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
cbc0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cbd0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
cbe0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
cbf0: 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64  out, "%6d %10lld
cc00: 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20   %8lld ",.      
cc10: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
cc20: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
cc30: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
cc40: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
cc50: 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
cc60: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
cc70: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
cc80: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
cc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
cca0: 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
ccb0: 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
ccc0: 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
ccd0: 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
cce0: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67  .#endif.  p->mag
ccf0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
cd00: 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70  INIT;.  return p
cd10: 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61  ->rc & db->errMa
cd20: 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c  sk;.}. ./*.** Cl
cd30: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74  ean up and delet
cd40: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  e a VDBE after e
cd50: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72  xecution.  Retur
cd60: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  n an integer whi
cd70: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73  ch is.** the res
cd80: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65  ult code.  Write
cd90: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
cda0: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a  ge text into *pz
cdb0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
cdc0: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69  qlite3VdbeFinali
cdd0: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ze(Vdbe *p){.  i
cde0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
cdf0: 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  K;.  if( p->magi
ce00: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
ce10: 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  N || p->magic==V
ce20: 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29  DBE_MAGIC_HALT )
ce30: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
ce40: 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a  e3VdbeReset(p);.
ce50: 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20      assert( (rc 
ce60: 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b  & p->db->errMask
ce70: 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65  )==rc );.  }else
ce80: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
ce90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
cea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
ceb0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
cec0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
ced0: 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
cee0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61   rc;.}../*.** Ca
cef0: 6c 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ll the destructo
cf00: 72 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61  r for each auxda
cf10: 74 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62  ta entry in pVdb
cf20: 65 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a  eFunc for which.
cf30: 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ** the correspon
cf40: 64 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b  ding bit in mask
cf50: 20 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64   is clear.  Auxd
cf60: 61 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f  ata entries beyo
cf70: 6e 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77  nd 31.** are alw
cf80: 61 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20  ays destroyed.  
cf90: 54 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61  To destroy all a
cfa0: 75 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20  uxdata entries, 
cfb0: 63 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  call this.** rou
cfc0: 74 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d  tine with mask==
cfd0: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
cfe0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
cff0: 61 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56  ata(VdbeFunc *pV
d000: 64 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73  dbeFunc, int mas
d010: 6b 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  k){.  int i;.  f
d020: 6f 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46  or(i=0; i<pVdbeF
d030: 75 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b  unc->nAux; i++){
d040: 0a 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44  .    struct AuxD
d050: 61 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64  ata *pAux = &pVd
d060: 62 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d  beFunc->apAux[i]
d070: 3b 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20  ;.    if( (i>31 
d080: 7c 7c 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29  || !(mask&(1<<i)
d090: 29 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78  )) && pAux->pAux
d0a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41   ){.      if( pA
d0b0: 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20  ux->xDelete ){. 
d0c0: 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65         pAux->xDe
d0d0: 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29  lete(pAux->pAux)
d0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d0f0: 70 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a  pAux->pAux = 0;.
d100: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
d110: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
d120: 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
d130: 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
d140: 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
d150: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
d160: 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d   *db;..  if( p==
d170: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  0 ) return;.  db
d180: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
d190: 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
d1a0: 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
d1b0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
d1c0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
d1d0: 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
d1e0: 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
d1f0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
d200: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
d210: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
d220: 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
d230: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
d240: 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  p ){.    Op *pOp
d250: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66   = p->aOp;.    f
d260: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
d270: 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i++, pOp++){. 
d280: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
d290: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
d2a0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
d2b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
d2c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
d2d0: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
d2e0: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
d2f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
d300: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d310: 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  aOp);.  }.  rele
d320: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d330: 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
d340: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d350: 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  b, p->aLabel);. 
d360: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
d370: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
d380: 65 28 64 62 2c 20 26 70 2d 3e 61 4d 65 6d 5b 31  e(db, &p->aMem[1
d390: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
d3a0: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
d3b0: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
d3c0: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
d3d0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
d3e0: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
d3f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d400: 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
d410: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
d420: 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20  BE_MAGIC_DEAD;. 
d430: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d440: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
d450: 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
d460: 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
d470: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
d480: 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
d490: 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
d4a0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
d4b0: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20  or code.  If no 
d4c0: 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e  MoveTo is pendin
d4d0: 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  g, this.** routi
d4e0: 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20  ne does nothing 
d4f0: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
d500: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
d510: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
d520: 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
d530: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
d540: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
d550: 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
d560: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d570: 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
d580: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
d590: 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
d5a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d5b0: 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
d5c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
d5d0: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
d5e0: 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
d5f0: 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
d600: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
d610: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d620: 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
d630: 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e  d = keyToInt(p->
d640: 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20  movetoTarget);. 
d650: 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c     p->rowidIsVal
d660: 69 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31 3a 30  id = res==0 ?1:0
d670: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20  ;.    if( res<0 
d680: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
d690: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
d6a0: 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29  ->pCursor, &res)
d6b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
d6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d6d0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
d6e0: 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33  TEST.    sqlite3
d6f0: 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b  _search_count++;
d700: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64  .#endif.    p->d
d710: 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
d720: 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53  0;.    p->cacheS
d730: 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
d740: 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ALE;.  }else if(
d750: 20 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20   p->pCursor ){. 
d760: 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b     int hasMoved;
d770: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
d780: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
d790: 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
d7a0: 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b  sor, &hasMoved);
d7b0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
d7c0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28  turn rc;.    if(
d7d0: 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20   hasMoved ){.   
d7e0: 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75     p->cacheStatu
d7f0: 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
d800: 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f  .      p->nullRo
d810: 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  w = 1;.    }.  }
d820: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d830: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
d840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
d850: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
d860: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d870: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
d880: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d890: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d8a0: 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20  eSerialLen().** 
d8b0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
d8c0: 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lPut().** sqlite
d8d0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
d8e0: 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61  .**.** encapsula
d8f0: 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  te the code that
d900: 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75   serializes valu
d910: 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69  es for storage i
d920: 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61  n SQLite.** data
d930: 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72   and index recor
d940: 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69  ds. Each seriali
d950: 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73  zed value consis
d960: 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69  ts of a.** 'seri
d970: 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62  al-type' and a b
d980: 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65  lob of data. The
d990: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
d9a0: 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e  an 8-byte unsign
d9b0: 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  ed.** integer, s
d9c0: 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e  tored as a varin
d9d0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53  t..**.** In an S
d9e0: 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f  QLite index reco
d9f0: 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74  rd, the serial t
da00: 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69  ype is stored di
da10: 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a  rectly before.**
da20: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74   the blob of dat
da30: 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73  a that it corres
da40: 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74  ponds to. In a t
da50: 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c  able record, all
da60: 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73   serial.** types
da70: 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74   are stored at t
da80: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
da90: 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20  record, and the 
daa0: 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74  blobs of data at
dab0: 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e  .** the end. Hen
dac0: 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f  ce these functio
dad0: 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c  ns allow the cal
dae0: 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ler to handle th
daf0: 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65  e.** serial-type
db00: 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73   and data blob s
db10: 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  eperately..**.**
db20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
db30: 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74  able describes t
db40: 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61  he various stora
db50: 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64  ge classes for d
db60: 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72  ata:.**.**   ser
db70: 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20  ial type        
db80: 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20  bytes of data   
db90: 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d     type.**   ---
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
dbc0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
dbd0: 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20  --.**      0    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55   0            NU
dc00: 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20  LL.**      1    
dc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc20: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69   1            si
dc30: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
dc40: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
dc50: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
dc60: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
dc70: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33  nteger.**      3
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc90: 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
dca0: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
dcb0: 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20  .**      4      
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34                 4
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
dce0: 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
dcf0: 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20     5            
dd00: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
dd10: 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
dd20: 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20  eger.**      6  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
dd50: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
dd60: 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20  *      7        
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
dd80: 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66            IEEE f
dd90: 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20  loat.**      8  
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
ddc0: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
ddd0: 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20   0.**      9    
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
de00: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31  teger constant 1
de10: 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20  .**     10,11   
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
de40: 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69  rved for expansi
de50: 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61  on.**    N>=12 a
de60: 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e  nd even       (N
de70: 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c  -12)/2        BL
de80: 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61  OB.**    N>=13 a
de90: 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e  nd odd        (N
dea0: 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65  -13)/2        te
deb0: 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61  xt.**.** The 8 a
dec0: 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20  nd 9 types were 
ded0: 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20  added in 3.3.0, 
dee0: 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20  file format 4.  
def0: 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a  Prior versions.*
df00: 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c  * of SQLite will
df10: 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20   not understand 
df20: 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70  those serial typ
df30: 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  es..*/../*.** Re
df40: 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d  turn the serial-
df50: 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c  type for the val
df60: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
df70: 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65  m..*/.u32 sqlite
df80: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28  3VdbeSerialType(
df90: 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66  Mem *pMem, int f
dfa0: 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69  ile_format){.  i
dfb0: 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
dfc0: 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b  >flags;.  int n;
dfd0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  ..  if( flags&ME
dfe0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
dff0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
e000: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
e010: 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
e020: 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
e030: 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
e040: 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
e050: 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
e060: 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
e070: 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
e080: 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
e090: 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
e0a0: 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f  .    if( file_fo
e0b0: 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29  rmat>=4 && (i&1)
e0c0: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==i ){.      ret
e0d0: 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20  urn 8+(u32)i;.  
e0e0: 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20    }.    u = i<0 
e0f0: 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
e100: 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
e110: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
e120: 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
e130: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
e140: 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
e150: 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
e160: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
e170: 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
e180: 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
e190: 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
e1a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
e1b0: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
e1c0: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
e1d0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
e1e0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e1f0: 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
e200: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
e210: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
e220: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
e230: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
e240: 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
e250: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
e260: 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
e270: 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
e280: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
e290: 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
e2a0: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
e2b0: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
e2c0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
e2d0: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
e2e0: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
e2f0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
e300: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
e310: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
e320: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
e330: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
e340: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
e350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
e360: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
e370: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
e380: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
e390: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
e3a0: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
e3b0: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
e3c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
e3d0: 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
e3e0: 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
e3f0: 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
e400: 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
e410: 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
e420: 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
e430: 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
e440: 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
e450: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
e460: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
e470: 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
e480: 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
e490: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
e4a0: 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
e4b0: 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
e4c0: 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
e4d0: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
e4e0: 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
e4f0: 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
e500: 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
e510: 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
e520: 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
e530: 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
e540: 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
e550: 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
e560: 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
e570: 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
e580: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
e590: 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
e5a0: 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
e5b0: 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
e5c0: 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
e5d0: 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
e5e0: 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
e5f0: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
e600: 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
e610: 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
e620: 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
e630: 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
e640: 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
e650: 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
e660: 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
e670: 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
e680: 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
e690: 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
e6a0: 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
e6b0: 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
e6c0: 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
e6d0: 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
e6e0: 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
e6f0: 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
e700: 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
e710: 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
e720: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
e730: 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
e740: 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
e750: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
e760: 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
e770: 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
e780: 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
e790: 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
e7a0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
e7b0: 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
e7c0: 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
e7d0: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
e7e0: 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
e7f0: 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
e800: 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
e810: 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
e820: 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
e830: 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
e840: 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
e850: 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
e860: 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
e870: 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
e880: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
e890: 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
e8a0: 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
e8b0: 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
e8c0: 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
e8d0: 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
e8e0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
e8f0: 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
e900: 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
e910: 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
e920: 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
e930: 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
e940: 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
e950: 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
e960: 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
e970: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
e980: 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
e990: 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
e9a0: 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
e9b0: 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
e9c0: 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
e9d0: 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
e9e0: 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
e9f0: 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
ea00: 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
ea10: 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
ea20: 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
ea30: 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
ea40: 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
ea50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
ea60: 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
ea70: 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
ea80: 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
ea90: 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
eaa0: 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
eab0: 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
eac0: 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
ead0: 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
eae0: 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
eaf0: 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
eb00: 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
eb10: 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
eb20: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
eb30: 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
eb40: 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
eb50: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
eb60: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
eb70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
eb80: 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
eb90: 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
eba0: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
ebb0: 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
ebc0: 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
ebd0: 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
ebe0: 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
ebf0: 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
ec00: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
ec10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
ec20: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
ec30: 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
ec40: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
ec50: 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
ec60: 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
ec70: 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
ec80: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
ec90: 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
eca0: 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
ecb0: 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
ecc0: 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
ecd0: 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
ece0: 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
ecf0: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
ed00: 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
ed10: 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
ed20: 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
ed30: 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
ed40: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
ed50: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
ed60: 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
ed70: 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
ed80: 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
ed90: 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
eda0: 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
edb0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
edc0: 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
edd0: 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
ede0: 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
edf0: 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
ee00: 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
ee10: 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
ee20: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
ee30: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
ee40: 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
ee50: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
ee60: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
ee70: 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
ee80: 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
ee90: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
eea0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
eeb0: 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
eec0: 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
eed0: 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20   buf[]..*/ .int 
eee0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
eef0: 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
ef00: 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
ef10: 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
ef20: 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
ef30: 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
ef40: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
ef50: 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
ef60: 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  );.  int len;.. 
ef70: 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
ef80: 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
ef90: 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
efa0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
efb0: 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
efc0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73  int i;.    if( s
efd0: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
efe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
eff0: 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
f000: 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
f010: 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
f020: 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
f030: 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
f040: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
f050: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f060: 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
f070: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
f080: 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
f090: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f0a0: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
f0b0: 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e    assert( len<=n
f0c0: 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
f0d0: 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
f0e0: 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30  uf[i] = (u8)(v&0
f0f0: 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
f100: 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 8;.    }.    r
f110: 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
f120: 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
f130: 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
f140: 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
f150: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
f160: 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
f170: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
f180: 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
f190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
f1a0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
f1b0: 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
f1c0: 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73  _type) );.    as
f1d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e  sert( pMem->n<=n
f1e0: 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  Buf );.    len =
f1f0: 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
f200: 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
f210: 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28  z, len);.    if(
f220: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
f230: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20  EM_Zero ){.     
f240: 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e   len += pMem->u.
f250: 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 69 66 28  nZero;.      if(
f260: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
f270: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
f280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
f290: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
f2a0: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
f2b0: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
f2c0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
f2d0: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
f2e0: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
f2f0: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
f300: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
f310: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
f320: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
f330: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
f340: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
f350: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
f360: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
f370: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
f380: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
f390: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
f3a0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
f3b0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f3c0: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
f3d0: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
f3e0: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
f3f0: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
f400: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f410: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
f420: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
f430: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
f440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f450: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
f460: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
f470: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
f480: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
f490: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
f4a0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
f4b0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
f4c0: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
f4d0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
f4e0: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
f4f0: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
f500: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
f510: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
f520: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
f530: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f540: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
f550: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
f560: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
f570: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
f580: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
f590: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f5a0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f5b0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
f5c0: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
f5d0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f5e0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
f5f0: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
f600: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f610: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f620: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f630: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f640: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
f650: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
f660: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
f670: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f680: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
f690: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f6a0: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
f6b0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
f6c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f6d0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f6e0: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
f6f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
f700: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
f710: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f720: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f730: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
f740: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
f750: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
f760: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f770: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
f790: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
f7a0: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
f7b0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f7c0: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
f7d0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f7e0: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
f7f0: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
f800: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
f810: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
f820: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
f830: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
f840: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
f850: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
f860: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
f870: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f880: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f890: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
f8a0: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
f8b0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f8c0: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
f8d0: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
f8e0: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
f8f0: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
f900: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
f910: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
f920: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f930: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
f940: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
f950: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
f960: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
f970: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
f980: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
f990: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
f9a0: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
f9b0: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
f9c0: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
f9d0: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
f9e0: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
f9f0: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
fa00: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
fa10: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
fa20: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
fa30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
fa40: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
fa50: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
fa60: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
fa70: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
fa80: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
fa90: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
faa0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
fab0: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
fac0: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
fad0: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
fae0: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
faf0: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
fb00: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
fb10: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
fb20: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
fb30: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
fb40: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
fb50: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
fb60: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
fb70: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
fb80: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
fb90: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
fba0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
fbb0: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
fbc0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
fbd0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
fbe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
fbf0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
fc00: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
fc10: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
fc20: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
fc30: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
fc40: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
fc50: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
fc60: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
fc70: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
fc80: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
fc90: 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
fca0: 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
fcb0: 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
fcc0: 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
fcd0: 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
fce0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
fcf0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
fd00: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
fd10: 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
fd20: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
fd30: 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
fd40: 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
fd50: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
fd60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
fd70: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
fd80: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
fd90: 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
fda0: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
fdb0: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
fdc0: 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
fdd0: 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
fde0: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
fdf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
fe00: 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
fe10: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
fe20: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
fe30: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
fe40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fe50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
fe60: 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
fe70: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
fe80: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
fe90: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fea0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69   0;.}.../*.** Gi
feb0: 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
fec0: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
fed0: 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
fee0: 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72  , parse the.** r
fef0: 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70  ecord into a Unp
ff00: 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
ff10: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61  cture.  Return a
ff20: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
ff30: 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  hat structure..*
ff40: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
ff50: 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20   function might 
ff60: 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20  provide szSpace 
ff70: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
ff80: 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61  ** space at pSpa
ff90: 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20  ce.  This space 
ffa0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68  can be used to h
ffb0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
ffc0: 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65  .** VDbeParsedRe
ffd0: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
ffe0: 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
fff0: 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a  ough.  If it is.
10000 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67  ** not big enoug
10010 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61  h, space is obta
10020 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
10030 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3_malloc()..**.*
10040 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73  * The returned s
10050 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
10060 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63  be closed by a c
10070 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
10080 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
10090 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20  kedRecord()..*/ 
100a0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
100b0 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  *sqlite3VdbeReco
100c0 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
100d0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
100e0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
100f0 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
10100 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
10110 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
10120 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10130 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
10140 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
10150 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
10160 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
10170 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
10180 64 52 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c  dRecord *pSpace,
10190 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62  /* Space availab
101a0 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c  le to hold resul
101b0 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ting object */. 
101c0 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
101d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
101e0 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
101f0 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
10200 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
10210 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
10220 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
10230 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
10240 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74  Record *p;.  int
10250 20 6e 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32   nByte, d;.  u32
10260 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20   idx;.  u16 u;  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10280 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
10290 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
102a0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
102b0 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  Mem;.  .  assert
102c0 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69  ( sizeof(Mem)>si
102d0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42  zeof(*p) );.  nB
102e0 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d  yte = sizeof(Mem
102f0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
10300 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42  eld+2);.  if( nB
10310 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
10320 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
10330 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
10340 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
10350 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
10360 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
10370 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
10380 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
10390 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
103a0 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
103b0 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20   p = pSpace;.   
103c0 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41   p->flags = UNPA
103d0 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
103e0 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  Y;.  }.  p->pKey
103f0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
10400 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
10410 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
10420 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  + 1;.  p->aMem =
10430 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29   pMem = &((Mem*)
10440 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67  p)[1];.  idx = g
10450 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
10460 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
10470 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
10480 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
10490 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
104a0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
104b0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
104c0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
104d0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
104e0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
104f0 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71  f( d>=nKey && sq
10500 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10510 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
10520 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  pe)>0 ) break;. 
10530 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
10540 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
10550 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
10560 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70  yInfo->db;.    p
10570 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a  Mem->flags = 0;.
10580 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
10590 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
105a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
105b0 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
105c0 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
105d0 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
105e0 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73     u++;.  }.  as
105f0 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
10600 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
10610 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
10620 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
10630 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  *)p;.}../*.** Th
10640 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72  is routine destr
10650 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65  oys a UnpackedRe
10660 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  cord object.*/.v
10670 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
10680 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
10690 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  ord(UnpackedReco
106a0 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
106b0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  ){.    if( p->fl
106c0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e  ags & UNPACKED_N
106d0 45 45 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20  EED_DESTROY ){. 
106e0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
106f0 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20    Mem *pMem;.   
10700 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d     for(i=0, pMem
10710 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
10720 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
10730 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10740 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
10750 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10760 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
10770 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  e(pMem);.       
10780 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
10790 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
107a0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
107b0 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20  D_FREE ){.      
107c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
107d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
107e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
107f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10800 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
10810 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
10820 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
10830 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
10840 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
10850 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
10860 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
10870 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
10880 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
10890 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
108a0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
108b0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
108c0 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
108d0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
108e0 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
108f0 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
10900 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
10910 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
10920 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
10930 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
10940 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
10950 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
10960 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
10970 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
10980 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
10990 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
109a0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
109b0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
109c0 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
109d0 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
109e0 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
109f0 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
10a00 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
10a10 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
10a20 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
10a30 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
10a40 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
10a50 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
10a60 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
10a70 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
10a80 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
10a90 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
10aa0 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
10ab0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
10ac0 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
10ad0 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
10ae0 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
10af0 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
10b00 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
10b10 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
10b20 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
10b30 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
10b40 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
10b50 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
10b60 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
10b70 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
10b80 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
10b90 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
10ba0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
10bb0 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
10bc0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
10bd0 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
10be0 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
10bf0 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
10c00 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
10c10 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
10c20 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
10c30 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
10c40 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
10c50 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
10c60 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
10c70 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
10c80 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
10c90 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
10ca0 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
10cb0 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
10cc0 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
10cd0 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
10ce0 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
10cf0 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
10d00 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
10d10 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
10d20 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
10d30 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
10d40 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10d50 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
10d60 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
10d70 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
10d80 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
10d90 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
10da0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
10db0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
10dc0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
10dd0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
10de0 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
10df0 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
10e00 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
10e10 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
10e20 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
10e30 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
10e40 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
10e50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10e60 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
10e70 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
10e80 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
10e90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
10ea0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10eb0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
10ec0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10ed0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
10ee0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
10ef0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
10f00 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
10f10 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
10f20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
10f30 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
10f40 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
10f50 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73  db;.  mem1.flags
10f60 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61   = 0;.  mem1.zMa
10f70 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69  lloc = 0;.  .  i
10f80 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
10f90 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
10fa0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
10fb0 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
10fc0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
10fd0 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a  IGNORE_ROWID ){.
10fe0 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20      szHdr1--;.  
10ff0 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  }.  nField = pKe
11000 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
11010 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
11020 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
11030 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
11040 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
11050 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
11060 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
11070 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
11080 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
11090 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
110a0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
110b0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
110c0 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
110d0 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
110e0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
110f0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
11100 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
11110 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
11120 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
11130 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
11140 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
11150 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
11160 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
11170 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
11180 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
11190 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
111a0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
111b0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
111c0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
111d0 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
11200 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
11210 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
11220 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
11230 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
11240 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  ++;.  }.  if( me
11250 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m1.zMalloc ) sql
11260 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11270 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66  se(&mem1);..  if
11280 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ( rc==0 ){.    /
11290 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
112a0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
112b0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
112c0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
112d0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
112e0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
112f0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
11300 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
11310 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20  _INCRKEY.    ** 
11320 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
11330 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
11340 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
11350 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20   as larger..    
11360 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45  ** If the UPACKE
11370 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66  D_PREFIX_MATCH f
11380 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
11390 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f   keys with commo
113a0 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a  n prefixes.    *
113b0 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
113c0 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
113d0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
113e0 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
113f0 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20  .    ** larger. 
11400 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20   As it happens, 
11410 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20  the pPKey2 will 
11420 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f  always be the lo
11430 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74  nger.    ** if t
11440 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
11450 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ence..    */.   
11460 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
11470 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
11480 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72  CRKEY ){.      r
11490 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
114a0 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c  e if( pPKey2->fl
114b0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
114c0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20  REFIX_MATCH ){. 
114d0 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
114e0 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ==0 */.    }else
114f0 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31   if( idx1<szHdr1
11500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31   ){.      rc = 1
11510 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
11520 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
11530 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
11540 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20  eyInfo->nField. 
11550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
11560 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
11570 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
11580 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
11590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
115a0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
115b0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
115c0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
115d0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
115e0 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
115f0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
11600 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
11610 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
11620 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
11630 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
11640 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
11650 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
11660 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
11670 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
11680 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
11690 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
116a0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
116b0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
116c0 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
116d0 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
116e0 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
116f0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
11700 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
11710 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
11720 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42 74  3VdbeIdxRowid(Bt
11730 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
11740 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34  4 *rowid){.  i64
11750 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
11760 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73   int rc;.  u32 s
11770 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  zHdr;        /* 
11780 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  Size of the head
11790 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65  er */.  u32 type
117a0 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72  Rowid;    /* Ser
117b0 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20  ial type of the 
117c0 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c  rowid */.  u32 l
117d0 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20  enRowid;     /* 
117e0 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69  Size of the rowi
117f0 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b  d */.  Mem m, v;
11800 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73  ..  /* Get the s
11810 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ize of the index
11820 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e   entry.  Only in
11830 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66  dices entries of
11840 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20   less.  ** than 
11850 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74  2GiB are support
11860 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67   - anything larg
11870 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61  e must be databa
11880 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
11890 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  .  sqlite3BtreeK
118a0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
118b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 75  ellKey);.  if( u
118c0 6e 6c 69 6b 65 6c 79 28 6e 43 65 6c 6c 4b 65 79  nlikely(nCellKey
118d0 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e  <=0 || nCellKey>
118e0 30 78 37 66 66 66 66 66 66 66 29 20 29 7b 0a 20  0x7fffffff) ){. 
118f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11900 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11910 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e   }..  /* Read in
11920 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f   the complete co
11930 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64  ntent of the ind
11940 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 6d 2e  ex entry */.  m.
11950 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64  flags = 0;.  m.d
11960 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  b = 0;.  m.zMall
11970 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
11980 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
11990 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
119a0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (int)nCellKey, 1
119b0 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
119c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
119d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
119e0 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74  index entry must
119f0 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65   begin with a he
11a00 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28  ader size */.  (
11a10 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
11a20 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72  ((u8*)m.z, szHdr
11a30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
11a40 7a 48 64 72 3d 3d 32 20 29 3b 0a 20 20 74 65 73  zHdr==2 );.  tes
11a50 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e  tcase( szHdr==m.
11a60 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  n );.  if( unlik
11a70 65 6c 79 28 73 7a 48 64 72 3c 32 20 7c 7c 20 28  ely(szHdr<2 || (
11a80 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29  int)szHdr>m.n) )
11a90 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
11aa0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
11ab0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
11ac0 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ast field of the
11ad0 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65   index should be
11ae0 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68   an integer - th
11af0 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65  e ROWID..  ** Ve
11b00 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61  rify that the la
11b10 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20  st entry really 
11b20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a  is an integer. *
11b30 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
11b40 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b  int32((u8*)&m.z[
11b50 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
11b60 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
11b70 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29  ( typeRowid==1 )
11b80 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
11b90 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20  peRowid==2 );.  
11ba0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
11bb0 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  wid==3 );.  test
11bc0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
11bd0 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =4 );.  testcase
11be0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29  ( typeRowid==5 )
11bf0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
11c00 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20  peRowid==6 );.  
11c10 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
11c20 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74  wid==8 );.  test
11c30 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
11c40 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  =9 );.  if( unli
11c50 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31  kely(typeRowid<1
11c60 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20   || typeRowid>9 
11c70 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29  || typeRowid==7)
11c80 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
11c90 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
11ca0 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69  n;.  }.  lenRowi
11cb0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53  d = sqlite3VdbeS
11cc0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70  erialTypeLen(typ
11cd0 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
11ce0 61 73 65 28 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  ase( m.n-lenRowi
11cf0 64 3d 3d 73 7a 48 64 72 20 29 3b 0a 20 20 69 66  d==szHdr );.  if
11d00 28 20 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e 2d 6c  ( unlikely(m.n-l
11d10 65 6e 52 6f 77 69 64 3c 73 7a 48 64 72 29 20 29  enRowid<szHdr) )
11d20 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
11d30 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
11d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68  .  }..  /* Fetch
11d50 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66   the integer off
11d60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11d70 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
11d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
11d90 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a  ialGet((u8*)&m.z
11da0 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20  [m.n-lenRowid], 
11db0 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a  typeRowid, &v);.
11dc0 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69    *rowid = v.u.i
11dd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
11de0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
11df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11e00 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
11e10 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63  re if database c
11e20 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74  orruption is det
11e30 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61  ected after m ha
11e40 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f  s been.  ** allo
11e50 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65  cated.  Free the
11e60 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65   m object and re
11e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11e80 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69  UPT. */.idx_rowi
11e90 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20  d_corruption:.  
11ea0 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c  testcase( m.zMal
11eb0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
11ec0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
11ed0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
11ee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11ef0 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
11f00 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
11f10 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
11f20 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
11f30 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67 61 69  is point to agai
11f40 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
11f50 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f  tring in pKey (o
11f60 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20  f length nKey). 
11f70 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
11f80 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
11f90 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
11fa0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
11fb0 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
11fc0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
11fd0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
11fe0 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75 72 6e  an pKey.  Return
11ff0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
12000 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65  ccess..**.** pKe
12010 79 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  y is either crea
12020 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
12030 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
12040 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
12050 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
12060 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
12070 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
12080 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
12090 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
120a0 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
120b0 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
120c0 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
120d0 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
120e0 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
120f0 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
12100 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
12110 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  entire key..**.*
12120 2a 20 70 55 6e 70 61 63 6b 65 64 20 6d 61 79 20  * pUnpacked may 
12130 62 65 20 61 6e 20 75 6e 70 61 63 6b 65 64 20 76  be an unpacked v
12140 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 2c 6e  ersion of pKey,n
12150 4b 65 79 2e 20 20 49 66 20 70 55 6e 70 61 63 6b  Key.  If pUnpack
12160 65 64 20 69 73 0a 2a 2a 20 73 75 70 70 6c 69 65  ed is.** supplie
12170 64 20 69 74 20 69 73 20 75 73 65 64 20 69 6e 20  d it is used in 
12180 70 6c 61 63 65 20 6f 66 20 70 4b 65 79 2c 6e 4b  place of pKey,nK
12190 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
121a0 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
121b0 61 72 65 28 0a 20 20 56 64 62 65 43 75 72 73 6f  are(.  VdbeCurso
121c0 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20  r *pC,          
121d0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
121e0 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69   to compare agai
121f0 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  nst */.  Unpacke
12200 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b  dRecord *pUnpack
12210 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  ed,  /* Unpacked
12220 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79   version of pKey
12230 20 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20 20 69   and nKey */.  i
12240 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20  nt *res         
12250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12260 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73  ite the comparis
12270 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  on result here *
12280 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  /.){.  i64 nCell
12290 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
122a0 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  c;.  BtCursor *p
122b0 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f  Cur = pC->pCurso
122c0 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73  r;.  Mem m;..  s
122d0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
122e0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
122f0 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
12300 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
12310 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
12320 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
12330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12340 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20  _OK;.  }.  m.db 
12350 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d  = 0;.  m.flags =
12360 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20   0;.  m.zMalloc 
12370 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
12380 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
12390 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
123a0 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65   0, (int)nCellKe
123b0 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
123c0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
123d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
123e0 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66  rt( pUnpacked->f
123f0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
12400 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a  IGNORE_ROWID );.
12410 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
12420 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
12430 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
12440 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
12450 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
12460 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
12470 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
12490 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
124a0 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
124b0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
124c0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
124d0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
124e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
124f0 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
12500 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
12510 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
12520 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
12530 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12540 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
12550 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
12560 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
12570 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
12580 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
12590 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
125a0 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
125b0 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
125c0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
125d0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
125e0 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
125f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
12600 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
12610 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
12620 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
12630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
12640 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
12650 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
12660 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
12670 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
12680 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
12690 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
126a0 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
126b0 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
126c0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
126d0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
126e0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
126f0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
12700 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
12710 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
12720 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
12730 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
12740 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
12750 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
12760 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
12770 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
12780 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
12790 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
127a0 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
127b0 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
127c0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
127d0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
127e0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
127f0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
12800 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
12810 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
12820 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
12830 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
12840 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
12850 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
12860 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
12870 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
12880 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
12890 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
128a0 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
128b0 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.