/ Hex Artifact Content
Login

Artifact 250296ad13b368b9e1076c7b002b3435154ed31f:


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 32 31 20 32  eaux.c,v 1.421 2
02c0: 30 30 38 2f 31 31 2f 32 31 20 31 36 3a 35 38 3a  008/11/21 16:58:
02d0: 30 33 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  03 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 69 66 28  IC_INIT );.  if(
0dc0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20   p->nOpAlloc<=i 
0dd0: 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f  ){.    if( growO
0de0: 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20  pArray(p) ){.   
0df0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
0e00: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b   }.  }.  p->nOp+
0e10: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
0e20: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
0e30: 63 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70  code = op;.  pOp
0e40: 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p5 = 0;.  pOp-
0e50: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
0e60: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
0e70: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
0e80: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
0e90: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
0ea0: 54 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69  TUSED;.  p->expi
0eb0: 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  red = 0;.#ifdef 
0ec0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
0ed0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  Op->zComment = 0
0ee0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56  ;.  if( sqlite3V
0ef0: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20  dbeAddopTrace ) 
0f00: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
0f10: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  Op(0, i, &p->aOp
0f20: 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  [i]);.#endif.#if
0f30: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
0f40: 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d  .  pOp->cycles =
0f50: 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d   0;.  pOp->cnt =
0f60: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
0f70: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
0f80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
0f90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
0fa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0fb0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
0fc0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
0fd0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0fe0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
0ff0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
1000: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1010: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1020: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1030: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1040: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1050: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1060: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1070: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1080: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1090: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
10a0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
10b0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
10c0: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
10d0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
10e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
10f0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1100: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1110: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1120: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1140: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1150: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1160: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1170: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1180: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1190: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
11a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
11c0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
11d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11e0: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
11f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1200: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1210: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1220: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1230: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1240: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1250: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1260: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1270: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1280: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1290: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
12a0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12b0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
12c0: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
12d0: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
12e0: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
12f0: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
1300: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
1310: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
1320: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
1330: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
1340: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
1350: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
1360: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
1370: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
1380: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
1390: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
13a0: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
13b0: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
13c0: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
13d0: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
13e0: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
13f0: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
1400: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
1410: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
1420: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
1430: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
1440: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
1450: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
1460: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
1470: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
1480: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
1490: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
14a0: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
14b0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
14c0: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
14d0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
14e0: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
14f0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
1500: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
1510: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1520: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1530: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
1540: 69 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62  i;.  i = p->nLab
1550: 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20  el++;.  assert( 
1560: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
1570: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
1580: 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41  f( i>=p->nLabelA
1590: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
15a0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e  LabelAlloc = p->
15b0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20  nLabelAlloc*2 + 
15c0: 31 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65  10;.    p->aLabe
15d0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
15e0: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
15f0: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20  , p->aLabel,.   
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a   p->nLabelAlloc*
1630: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
1640: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
1650: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
1660: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
1670: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
1680: 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n -1-i;.}../*.**
1690: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
16a0: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
16b0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
16c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
16d0: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
16e0: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
16f0: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
1700: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
1710: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
1720: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
1730: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
1740: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1750: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
1760: 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e  *p, int x){.  in
1770: 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73  t j = -1-x;.  as
1780: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
1790: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
17a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d  );.  assert( j>=
17b0: 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  0 && j<p->nLabel
17c0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61   );.  if( p->aLa
17d0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
17e0: 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70  abel[j] = p->nOp
17f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  ;.  }.}../*.** L
1800: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
1810: 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20  program looking 
1820: 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68  for P2 values th
1830: 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a  at are negative.
1840: 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72  ** on jump instr
1850: 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73  uctions.  Each s
1860: 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c  uch value is a l
1870: 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74  abel.  Resolve t
1880: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73  he.** label by s
1890: 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61  etting the P2 va
18a0: 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65  lue to its corre
18b0: 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ct non-zero valu
18c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
18d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
18e0: 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f  once after all o
18f0: 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e  pcodes have been
1900: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a   inserted..**.**
1910: 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46   Variable *pMaxF
1920: 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74  uncArgs is set t
1930: 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  o the maximum va
1940: 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72  lue of any P2 ar
1950: 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e  gument .** to an
1960: 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50   OP_Function, OP
1970: 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56  _AggStep or OP_V
1980: 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54  Filter opcode. T
1990: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a  his is used by .
19a0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  ** sqlite3VdbeMa
19b0: 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a  keReady() to siz
19c0: 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  e the Vdbe.apArg
19d0: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  [] array..**.** 
19e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
19f0: 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f  o does the follo
1a00: 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f  wing optimizatio
1a10: 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72  n:  It scans for
1a20: 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  .** instructions
1a30: 20 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73   that might caus
1a40: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  e a statement ro
1a50: 6c 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e  llback.  Such in
1a60: 73 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72  structions.** ar
1a70: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  e:.**.**   *  OP
1a80: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
1a90: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
1aa0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
1ab0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74  .**   *  OP_Dest
1ac0: 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56  roy.**   *  OP_V
1ad0: 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f  Update.**   *  O
1ae0: 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  P_VRename.**.** 
1af0: 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72  If no such instr
1b00: 75 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  uction is found,
1b10: 20 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74   then every Stat
1b20: 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  ement instructio
1b30: 6e 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64  n .** is changed
1b40: 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20   to a Noop.  In 
1b50: 74 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f  this way, we avo
1b60: 69 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  id creating the 
1b70: 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f  statement .** jo
1b80: 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63  urnal file unnec
1b90: 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61  essarily..*/.sta
1ba0: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
1bb0: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
1bc0: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
1bd0: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
1be0: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
1bf0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
1c00: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d  int *aLabel = p-
1c10: 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64  >aLabel;.  int d
1c20: 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c  oesStatementRoll
1c30: 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  back = 0;.  int 
1c40: 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69  hasStatementBegi
1c50: 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 61 64  n = 0;.  p->read
1c60: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 75  Only = 1;.  p->u
1c70: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d  sesStmtJournal =
1c80: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
1c90: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
1ca0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
1cb0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
1cc0: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
1cd0: 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  ;..    if( opcod
1ce0: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 7c  e==OP_Function |
1cf0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67 67  | opcode==OP_Agg
1d00: 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20 69 66  Step ){.      if
1d10: 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72  ( pOp->p5>nMaxAr
1d20: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
1d30: 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64 65 66  pOp->p5;.#ifndef
1d40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1d50: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
1d60: 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d  lse if( opcode==
1d70: 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20  OP_VUpdate ){.  
1d80: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
1d90: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
1da0: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23  rgs = pOp->p2;.#
1db0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1dc0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  if( opcode==OP_H
1dd0: 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  alt ){.      if(
1de0: 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45   pOp->p1==SQLITE
1df0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
1e00: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
1e10: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73   ){.        does
1e20: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1e30: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
1e40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1e50: 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e  ode==OP_Statemen
1e60: 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74  t ){.      hasSt
1e70: 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31  atementBegin = 1
1e80: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 73 65 73 53  ;.      p->usesS
1e90: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  tmtJournal = 1;.
1ea0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1eb0: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
1ec0: 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74   ){.      doesSt
1ed0: 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20  atementRollback 
1ee0: 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 1;.    }else i
1ef0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72  f( opcode==OP_Tr
1f00: 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70  ansaction && pOp
1f10: 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20 20 20 20  ->p2!=0 ){.     
1f20: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
1f30: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1f40: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1f50: 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  LE.    }else if(
1f60: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
1f70: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
1f80: 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20  P_VRename ){.   
1f90: 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74     doesStatement
1fa0: 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
1fb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1fc0: 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29  de==OP_VFilter )
1fd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  {.      int n;. 
1fe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1ff0: 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a  nOp - i >= 3 );.
2000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
2010: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
2020: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
2030: 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    n = pOp[-1].p1
2040: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d  ;.      if( n>nM
2050: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
2060: 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  s = n;.#endif.  
2070: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
2080: 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48 61  ite3VdbeOpcodeHa
2090: 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64 65  sProperty(opcode
20a0: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26 26  , OPFLG_JUMP) &&
20b0: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
20c0: 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d 70      assert( -1-p
20d0: 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c  Op->p2<p->nLabel
20e0: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
20f0: 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f  2 = aLabel[-1-pO
2100: 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20  p->p2];.    }.  
2110: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
2120: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
2130: 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c  el);.  p->aLabel
2140: 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75   = 0;..  *pMaxFu
2150: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
2160: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 6e  s;..  /* If we n
2170: 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 20  ever rollback a 
2180: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
2190: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74 61 74  ction, then stat
21a0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73  ement.  ** trans
21b0: 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
21c0: 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68 61 6e  needed.  So chan
21d0: 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74 61 74  ge every OP_Stat
21e0: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63 6f 64  ement.  ** opcod
21f0: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  e into an OP_Noo
2200: 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64 20 61  p.  This avoid a
2210: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2220: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
2230: 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63 61 6e  ).  ** which can
2240: 20 62 65 20 65 78 70 65 6e 73 69 76 65 20 6f 6e   be expensive on
2250: 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d 73 2e   some platforms.
2260: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 53  .  */.  if( hasS
2270: 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 26 26  tatementBegin &&
2280: 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52   !doesStatementR
2290: 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70  ollback ){.    p
22a0: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
22b0: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
22c0: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
22d0: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
22e0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
22f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2300: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
2310: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2320: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2330: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2340: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2350: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2360: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2370: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
2380: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
2390: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
23a0: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
23b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
23c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
23d0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
23e0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
23f0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
2400: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
2410: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2420: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2430: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2440: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2450: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
2460: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
2470: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
2480: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
2490: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
24a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
24b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
24c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
24d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
24e0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
24f0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
2500: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65  ray(p) ){.    re
2510: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64  turn 0;.  }.  ad
2520: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  dr = p->nOp;.  i
2530: 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20  f( nOp>0 ){.    
2540: 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f  int i;.    VdbeO
2550: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e  pList const *pIn
2560: 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28   = aOp;.    for(
2570: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
2580: 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69   pIn++){.      i
2590: 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b  nt p2 = pIn->p2;
25a0: 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
25b0: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b  Out = &p->aOp[i+
25c0: 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75  addr];.      pOu
25d0: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d  t->opcode = pIn-
25e0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70  >opcode;.      p
25f0: 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70  Out->p1 = pIn->p
2600: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c  1;.      if( p2<
2610: 30 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65  0 && sqlite3Vdbe
2620: 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74  OpcodeHasPropert
2630: 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20  y(pOut->opcode, 
2640: 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20  OPFLG_JUMP) ){. 
2650: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2660: 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32  = addr + ADDR(p2
2670: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2680: 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32          pOut->p2
2690: 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20   = p2;.      }. 
26a0: 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20       pOut->p3 = 
26b0: 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70  pIn->p3;.      p
26c0: 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  Out->p4type = P4
26d0: 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20  _NOTUSED;.      
26e0: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a  pOut->p4.p = 0;.
26f0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d        pOut->p5 =
2700: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
2710: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f  E_DEBUG.      pO
2720: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
2730: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2740: 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63  te3VdbeAddopTrac
2750: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
2760: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
2770: 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61  0, i+addr, &p->a
2780: 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20  Op[i+addr]);.   
2790: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
27a0: 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20  }.    p->nOp += 
27b0: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nOp;.  }.  retur
27c0: 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n addr;.}../*.**
27d0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
27e0: 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72  e of the P1 oper
27f0: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66  and for a specif
2800: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
2810: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2820: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
2830: 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69   large program i
2840: 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a  s loaded from a.
2850: 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20  ** static array 
2860: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62  using sqlite3Vdb
2870: 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77  eAddOpList but w
2880: 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61  e want to make a
2890: 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68  .** few minor ch
28a0: 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f  anges to the pro
28b0: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
28c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
28d0: 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  1(Vdbe *p, int a
28e0: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
28f0: 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
2900: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
2910: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2920: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30  if( p && addr>=0
2930: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20   && p->nOp>addr 
2940: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
2950: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31   p->aOp[addr].p1
2960: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
2970: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2980: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20  value of the P2 
2990: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
29a0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
29b0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
29c0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f  ine is useful fo
29d0: 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70  r setting a jump
29e0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f   destination..*/
29f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2a00: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
2a10: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2a20: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2a30: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2a40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2a50: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2a60: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2a70: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2a80: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2a90: 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a  addr].p2 = val;.
2aa0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2ab0: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2ac0: 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   the P3 operand 
2ad0: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
2ae0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
2af0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
2b00: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
2b10: 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76   int addr, int v
2b20: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2b30: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2b40: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2b50: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61   );.  if( p && a
2b60: 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70  ddr>=0 && p->nOp
2b70: 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20  >addr && p->aOp 
2b80: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64  ){.    p->aOp[ad
2b90: 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20  dr].p3 = val;.  
2ba0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
2bb0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
2bc0: 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f  he P5 operand fo
2bd0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
2be0: 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65  tly.** added ope
2bf0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
2c00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2c10: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
2c20: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
2c30: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
2c40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2c50: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
2c60: 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->aOp ){.    as
2c70: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
2c80: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e  ;.    p->aOp[p->
2c90: 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b  nOp-1].p5 = val;
2ca0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
2cb0: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
2cc0: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
2cd0: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
2ce0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
2cf0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2d00: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2d10: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
2d20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d30: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
2d40: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
2d50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
2d60: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
2d70: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
2d80: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
2d90: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
2da0: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
2db0: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
2dc0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
2dd0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
2de0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
2df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
2e00: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
2e10: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
2e20: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
2e30: 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65 66 20  ef){.  if( pDef 
2e40: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20  && (pDef->flags 
2e50: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
2e60: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
2e70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2e80: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   pDef);.  }.}../
2e90: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2ea0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2eb0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2ec0: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
2ed0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
2ee0: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
2ef0: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73   if( p4 ){.    s
2f00: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
2f10: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
2f20: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
2f30: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
2f40: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
2f50: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
2f60: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
2f70: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
2f80: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
2f90: 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73  ARRAY:.      cas
2fa0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P4_KEYINFO_HAN
2fb0: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
2fc0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2fd0: 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  , p4);.        b
2fe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ff0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45      case P4_VDBE
3000: 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20  FUNC: {.        
3010: 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46  VdbeFunc *pVdbeF
3020: 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20  unc = (VdbeFunc 
3030: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72  *)p4;.        fr
3040: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
3050: 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e  ion(db, pVdbeFun
3060: 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  c->pFunc);.     
3070: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
3080: 6c 65 74 65 41 75 78 44 61 74 61 28 70 56 64 62  leteAuxData(pVdb
3090: 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  eFunc, 0);.     
30a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
30b0: 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 29 3b  (db, pVdbeFunc);
30c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
30d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
30e0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
30f0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
3100: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
3110: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
3120: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3130: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3140: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
3150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
3160: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
3170: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
3180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3190: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
31a0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20  ./*.** Change N 
31b0: 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67  opcodes starting
31c0: 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f   at addr to No-o
31d0: 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ps..*/.void sqli
31e0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
31f0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
3200: 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20   addr, int N){. 
3210: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70   if( p && p->aOp
3220: 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a   ){.    VdbeOp *
3230: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
3240: 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr];.    sqlite3
3250: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
3260: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
3270: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
3280: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
3290: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20 20  p->p4.p);.      
32a0: 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73  memset(pOp, 0, s
32b0: 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a  izeof(pOp[0]));.
32c0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
32d0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
32e0: 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a     pOp++;.    }.
32f0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
3300: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
3310: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3320: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
3330: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
3340: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
3350: 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72  seful when a lar
3360: 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f  ge program is lo
3370: 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73  aded from a.** s
3380: 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e  tatic array usin
3390: 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  g sqlite3VdbeAdd
33a0: 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61  OpList but we wa
33b0: 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20  nt to make a.** 
33c0: 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65  few minor change
33d0: 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d  s to the program
33e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20  ..**.** If n>=0 
33f0: 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72  then the P4 oper
3400: 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20  and is dynamic, 
3410: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63  meaning that a c
3420: 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74  opy of.** the st
3430: 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74  ring is made int
3440: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3450: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
3460: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61  alloc()..** A va
3470: 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e  lue of n==0 mean
3480: 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20  s copy bytes of 
3490: 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e  zP4 up to and in
34a0: 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  cluding the.** f
34b0: 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20  irst null byte. 
34c0: 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70   If n>0 then cop
34d0: 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a  y n+1 bytes of z
34e0: 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d  P4..**.** If n==
34f0: 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d 65  P4_KEYINFO it me
3500: 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73 20  ans that zP4 is 
3510: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  a pointer to a K
3520: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
3530: 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20 6d  ..** A copy is m
3540: 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49 6e  ade of the KeyIn
3550: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e 74  fo structure int
3560: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
3570: 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
3580: 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65 20  3_malloc, to be 
3590: 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 56  freed when the V
35a0: 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  dbe is finalized
35b0: 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e  ..** n==P4_KEYIN
35c0: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69 63  FO_HANDOFF indic
35d0: 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70 6f  ates that zP4 po
35e0: 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e 66  ints to a KeyInf
35f0: 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 73  o structure.** s
3600: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
3610: 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
3620: 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  has obtained fro
3630: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
3640: 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  . The .** caller
3650: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65 65   should not free
3660: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c   the allocation,
3670: 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
3680: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
3690: 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 2e  is.** finalized.
36a0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
36b0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
36c0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
36d0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
36e0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
36f0: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
3700: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
3710: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3720: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
3730: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
3740: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
3750: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
3760: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
3770: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
3780: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
3790: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
37a0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
37b0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
37c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
37d0: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
37e0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
37f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
3800: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
3810: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
3820: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
3830: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
3840: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
3850: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
3860: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
3870: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
3880: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
3890: 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50 34 5f      if (n != P4_
38a0: 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20 20 20  KEYINFO) {.     
38b0: 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28   freeP4(db, n, (
38c0: 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26  void*)*(char**)&
38d0: 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zP4);.    }.    
38e0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
38f0: 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f  sert( addr<p->nO
3900: 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c  p );.  if( addr<
3910: 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20  0 ){.    addr = 
3920: 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20  p->nOp - 1;.    
3930: 69 66 28 20 61 64 64 72 3c 30 20 29 20 72 65 74  if( addr<0 ) ret
3940: 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d  urn;.  }.  pOp =
3950: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
3960: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
3970: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
3980: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
3990: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
39a0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
39b0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
39c0: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
39d0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
39e0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
39f0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
3a00: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
3a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
3a20: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
3a30: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
3a40: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
3a50: 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20  p->p4type = n;. 
3a60: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
3a70: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
3a80: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
3a90: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
3aa0: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
3ab0: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
3ac0: 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  ){.    KeyInfo *
3ad0: 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e  pKeyInfo;.    in
3ae0: 74 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b  t nField, nByte;
3af0: 0a 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28  ..    nField = (
3b00: 28 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e  (KeyInfo*)zP4)->
3b10: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74  nField;.    nByt
3b20: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  e = sizeof(*pKey
3b30: 49 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d  Info) + (nField-
3b40: 31 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e  1)*sizeof(pKeyIn
3b50: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20  fo->aColl[0]) + 
3b60: 6e 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79  nField;.    pKey
3b70: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61  Info = sqlite3Ma
3b80: 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20  lloc( nByte );. 
3b90: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49     pOp->p4.pKeyI
3ba0: 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
3bb0: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
3bc0: 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53   ){.      u8 *aS
3bd0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20  ortOrder;.      
3be0: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c  memcpy(pKeyInfo,
3bf0: 20 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20   zP4, nByte);.  
3c00: 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d      aSortOrder =
3c10: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
3c20: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28  Order;.      if(
3c30: 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20   aSortOrder ){. 
3c40: 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d         pKeyInfo-
3c50: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
3c60: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70  nsigned char*)&p
3c70: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e  KeyInfo->aColl[n
3c80: 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20  Field];.        
3c90: 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d  memcpy(pKeyInfo-
3ca0: 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f  >aSortOrder, aSo
3cb0: 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29  rtOrder, nField)
3cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3cd0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3ce0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65  _KEYINFO;.    }e
3cf0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62  lse{.      p->db
3d00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
3d10: 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   1;.      pOp->p
3d20: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
3d30: 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ED;.    }.  }els
3d40: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49  e if( n==P4_KEYI
3d50: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20  NFO_HANDOFF ){. 
3d60: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
3d70: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
3d80: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3d90: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
3da0: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
3db0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
3dc0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
3dd0: 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d  >p4type = n;.  }
3de0: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d  else{.    if( n=
3df0: 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28  =0 ) n = strlen(
3e00: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
3e10: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
3e20: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
3e30: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
3e40: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
3e50: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  MIC;.  }.}..#ifn
3e60: 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
3e70: 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d   Change the comm
3e80: 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d  ent on the the m
3e90: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
3ea0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
3eb0: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
3ec0: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
3ed0: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
3ee0: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
3ef0: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
3f00: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
3f10: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
3f20: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
3f30: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
3f40: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
3f50: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76  tion build..*/.v
3f60: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3f70: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
3f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
3f90: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
3fa0: 6c 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72  list ap;.  asser
3fb0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
3fc0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
3fd0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
3fe0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
3ff0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
4000: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
4010: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
4020: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68  p->nOp ){.    ch
4030: 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f  ar **pz = &p->aO
4040: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
4050: 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61  ment;.    va_sta
4060: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
4070: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4080: 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a  ee(p->db, *pz);.
4090: 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65      *pz = sqlite
40a0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
40b0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
40c0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
40d0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
40e0: 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74  3VdbeNoopComment
40f0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
4100: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
4110: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4120: 70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  p;.  sqlite3Vdbe
4130: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
4140: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
4150: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70  >nOp>0 || p->aOp
4160: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
4170: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d   p->aOp==0 || p-
4180: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
4190: 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d  Comment==0 || p-
41a0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
41b0: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f  d );.  if( p->nO
41c0: 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a  p ){.    char **
41d0: 70 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  pz = &p->aOp[p->
41e0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b  nOp-1].zComment;
41f0: 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
4200: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20  , zFormat);.    
4210: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4220: 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a  >db, *pz);.    *
4230: 70 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  pz = sqlite3VMPr
4240: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
4250: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61  mat, ap);.    va
4260: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a  _end(ap);.  }.}.
4270: 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55  #endif  /* NDEBU
4280: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  G */../*.** Retu
4290: 72 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f  rn the opcode fo
42a0: 72 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73  r a given addres
42b0: 73 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  s..*/.VdbeOp *sq
42c0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
42d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
42e0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
42f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4300: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
4310: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
4320: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
4330: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4340: 6c 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  led );.  return 
4350: 28 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64  ((addr>=0 && add
4360: 72 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61  r<p->nOp)?(&p->a
4370: 4f 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a  Op[addr]):0);.}.
4380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4390: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
43a0: 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e  N) || !defined(N
43b0: 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c  DEBUG) \.     ||
43c0: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
43d0: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
43e0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
43f0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
4400: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
4410: 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72  ribes the P4 par
4420: 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70  ameter for an op
4430: 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65  code..** Use zTe
4440: 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69  mp for any requi
4450: 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75  red temporary bu
4460: 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  ffer space..*/.s
4470: 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70  tatic char *disp
4480: 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63  layP4(Op *pOp, c
4490: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20  har *zTemp, int 
44a0: 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a  nTemp){.  char *
44b0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61  zP4 = zTemp;.  a
44c0: 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30  ssert( nTemp>=20
44d0: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f   );.  switch( pO
44e0: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
44f0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
4500: 5f 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73  _STATIC:.    cas
4510: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
4520: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
4530: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
4540: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
4550: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
4560: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4570: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4580: 20 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70   "keyinfo(%d", p
4590: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
45a0: 3b 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c  ;.      i = strl
45b0: 65 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  en(zTemp);.     
45c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79   for(j=0; j<pKey
45d0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b  Info->nField; j+
45e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
45f0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65  Seq *pColl = pKe
4600: 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b  yInfo->aColl[j];
4610: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f  .        if( pCo
4620: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
4630: 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70  int n = strlen(p
4640: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Coll->zName);.  
4650: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
4660: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
4670: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a         memcpy(&z
4680: 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34  Temp[i],",...",4
4690: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
46a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
46b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d  }.          zTem
46c0: 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20  p[i++] = ',';.  
46d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
46e0: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
46f0: 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53   && pKeyInfo->aS
4700: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20  ortOrder[j] ){. 
4710: 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70             zTemp
4720: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
4730: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
4740: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
4750: 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  [i], pColl->zNam
4760: 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  e,n+1);.        
4770: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
4780: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c    }else if( i+4<
4790: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
47a0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
47b0: 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b  mp[i],",nil",4);
47c0: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
47d0: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
47e0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
47f0: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [i++] = ')';.   
4800: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b     zTemp[i] = 0;
4810: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
4820: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20  <nTemp );.      
4830: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4840: 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51   case P4_COLLSEQ
4850: 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  : {.      CollSe
4860: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e  q *pColl = pOp->
4870: 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  p4.pColl;.      
4880: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4890: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
48a0: 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c  collseq(%.20s)",
48b0: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
48c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
48d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
48e0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
48f0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
4900: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
4910: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4920: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4930: 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  mp, "%s(%d)", pD
4940: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
4950: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
4960: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4970: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
4980: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4990: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
49a0: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  emp, "%lld", *pO
49b0: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
49c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
49d0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
49e0: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
49f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
4a00: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20  p, zTemp, "%d", 
4a10: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
4a20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4a30: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
4a40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4a50: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4a60: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
4a70: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
4a80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4a90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4aa0: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
4ab0: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
4ac0: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73  4.pMem;.      as
4ad0: 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61  sert( (pMem->fla
4ae0: 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d  gs & MEM_Null)==
4af0: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
4b00: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4b10: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
4b20: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
4b30: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
4b40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
4b50: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
4b60: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4b70: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4b80: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
4b90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
4ba0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
4bb0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
4bc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4bd0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4be0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65  mp, "%.16g", pMe
4bf0: 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  m->r);.      }. 
4c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4c10: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
4c20: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4c30: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
4c40: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
4c50: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
4c60: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
4c70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4c80: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4c90: 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a  zTemp, "vtab:%p:
4ca0: 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61  %p", pVtab, pVta
4cb0: 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20  b->pModule);.   
4cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4cd0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
4ce0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
4cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4d00: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
4d10: 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b  mp, "intarray");
4d20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4d30: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4d40: 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70   {.      zP4 = p
4d50: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
4d60: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
4d70: 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d        zP4 = zTem
4d80: 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  p;.        zTemp
4d90: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [0] = 0;.      }
4da0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
4db0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
4dc0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
4dd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  endif../*.** Dec
4de0: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
4df0: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
4e00: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
4e10: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
4e20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e30: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
4e40: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
4e50: 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73   int mask;.  ass
4e60: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
4e70: 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  ->db->nDb );.  a
4e80: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
4e90: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
4ea0: 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20 3d  k)*8 );.  mask =
4eb0: 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d   1<<i;.  if( (p-
4ec0: 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61 73  >btreeMask & mas
4ed0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  k)==0 ){.    p->
4ee0: 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73  btreeMask |= mas
4ef0: 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  k;.    sqlite3Bt
4f00: 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e 73  reeMutexArrayIns
4f10: 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20  ert(&p->aMutex, 
4f20: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
4f30: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20  t);.  }.}...#if 
4f40: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
4f50: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
4f60: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
4f70: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
4f80: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
4f90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4fa0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
4fb0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
4fc0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4fd0: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
4fe0: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
4ff0: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
5000: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73  ar zPtr[50];.  s
5010: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
5020: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34   *zFormat1 = "%4
5030: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20  d %-13s %4d %4d 
5040: 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73  %4d %-4s %.2X %s
5050: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
5060: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
5070: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
5080: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
5090: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
50a0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
50b0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
50c0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
50d0: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
50e0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
50f0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
5100: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69  zP4, pOp->p5,.#i
5110: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5120: 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f  G.      pOp->zCo
5130: 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f  mment ? pOp->zCo
5140: 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65  mment : "".#else
5150: 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66  .      "".#endif
5160: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
5170: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
5180: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
5190: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
51a0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
51b0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
51c0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
51d0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
51e0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
51f0: 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74  *pEnd;.    sqlit
5200: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
5210: 20 20 20 20 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66      int malloc_f
5220: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
5230: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f  ocFailed;.    fo
5240: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
5250: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
5260: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
5270: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
5280: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
5290: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
52a0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
52b0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
52c0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
52d0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
52e0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
52f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
5300: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
5310: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
5320: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
5330: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
5340: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
5350: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
5360: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
5370: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
5380: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
5390: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
53a0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
53b0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
53c0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
53d0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
53e0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
53f0: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
5400: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
5410: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
5420: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
5430: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
5440: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
5450: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
5460: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
5470: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
5480: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
5490: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
54a0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
54b0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
54c0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
54d0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
54e0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
54f0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
5500: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
5510: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
5520: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
5530: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
5540: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
5550: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
5560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5570: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
5580: 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a  Agg|MEM_Dyn) ){.
5590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
55a0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
55b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
55c0: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
55d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
55e0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
55f0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
5600: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
5610: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
5620: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
5630: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
5640: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5650: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
5660: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
5670: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
5680: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74  Y_MANAGEMENT.int
5690: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
56a0: 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65 20  aseBuffers(Vdbe 
56b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  *p){.  int ii;. 
56c0: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a   int nFree = 0;.
56d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
56e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
56f0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5700: 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d  for(ii=1; ii<=p-
5710: 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nMem; ii++){.  
5720: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
5730: 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20  ->aMem[ii];.    
5740: 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70  if( pMem->z && p
5750: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
5760: 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  yn ){.      asse
5770: 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20  rt( !pMem->xDel 
5780: 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b  );.      nFree +
5790: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
57a0: 63 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20  cSize(pMem->db, 
57b0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
57c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
57d0: 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20  lease(pMem);.   
57e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
57f0: 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  nFree;.}.#endif.
5800: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5810: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a  OMIT_EXPLAIN./*.
5820: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e  ** Give a listin
5830: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  g of the program
5840: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20   in the virtual 
5850: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  machine..**.** T
5860: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  he interface is 
5870: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
5880: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
5890: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  But instead of.*
58a0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f  * running the co
58b0: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74  de, it invokes t
58c0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65  he callback once
58d0: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75   for each instru
58e0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66  ction..** This f
58f0: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74  eature is used t
5900: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50  o implement "EXP
5910: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LAIN"..**.** Whe
5920: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c  n p->explain==1,
5930: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f   each instructio
5940: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68  n is listed.  Wh
5950: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e  en.** p->explain
5960: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70  ==2, only OP_Exp
5970: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  lain instruction
5980: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64  s are listed and
5990: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68   these.** are sh
59a0: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65  own in a differe
59b0: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65  nt format.  p->e
59c0: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65  xplain==2 is use
59d0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
59e0: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  * EXPLAIN QUERY 
59f0: 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  PLAN..*/.int sql
5a00: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
5a10: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
5a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5a30: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71   VDBE */.){.  sq
5a40: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5a50: 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
5a60: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5a70: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  ;.  Mem *pMem = 
5a80: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
5a90: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20  &p->aMem[1];..  
5aa0: 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61  assert( p->expla
5ab0: 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  in );.  if( p->m
5ac0: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43  agic!=VDBE_MAGIC
5ad0: 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51  _RUN ) return SQ
5ae0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61  LITE_MISUSE;.  a
5af0: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63  ssert( db->magic
5b00: 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  ==SQLITE_MAGIC_B
5b10: 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  USY );.  assert(
5b20: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5b30: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
5b40: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
5b50: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
5b60: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
5b70: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
5b80: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
5b90: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
5ba0: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
5bb0: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
5bc0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
5bd0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
5be0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
5bf0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
5c00: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
5c10: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
5c20: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
5c30: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
5c40: 72 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d  rray(pMem, p->nM
5c50: 65 6d 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  em);..  if( p->r
5c60: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
5c70: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
5c80: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
5c90: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
5ca0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
5cb0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
5cc0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
5cd0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
5ce0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
5cf0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
5d00: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
5d10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
5d20: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20  ..  do{.    i = 
5d30: 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c  p->pc++;.  }whil
5d40: 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70  e( i<p->nOp && p
5d50: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20  ->explain==2 && 
5d60: 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
5d70: 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a  !=OP_Explain );.
5d80: 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20    if( i>=p->nOp 
5d90: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
5da0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
5db0: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
5dc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e    }else if( db->
5dd0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
5de0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
5df0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
5e00: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
5e10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
5e20: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70  ite3SetString(&p
5e30: 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22  ->zErrMsg, db, "
5e40: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
5e50: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65  tr(p->rc));.  }e
5e60: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
5e70: 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20  ;.    Op *pOp = 
5e80: 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  &p->aOp[i];.    
5e90: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  if( p->explain==
5ea0: 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 ){.      pMem-
5eb0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
5ec0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  ;.      pMem->ty
5ed0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
5ee0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  GER;.      pMem-
5ef0: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
5f20: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
5f30: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
5f40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5f50: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
5f60: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
5f70: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
5f80: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
5f90: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
5fa0: 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f  pcode);  /* Opco
5fb0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  de */.      asse
5fc0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5fd0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5fe0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5ff0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74  );.      pMem->t
6000: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58  ype = SQLITE_TEX
6010: 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  T;.      pMem->e
6020: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
6030: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
6040: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
6050: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
6060: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
6070: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
60a0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
60b0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20  LITE_INTEGER;.  
60c0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
60d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
60e0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
60f0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
6120: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
6130: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
6140: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
6150: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
6160: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
6170: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
6180: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
6190: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
61c0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79  /.      pMem->ty
61d0: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  pe = SQLITE_INTE
61e0: 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  GER;.      pMem+
61f0: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
6200: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
6210: 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30  Grow(pMem, 32, 0
6220: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
6230: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70  /* P4 */.      p
6240: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
6250: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
6260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6270: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65  M;.    }.    pMe
6280: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44  m->flags = MEM_D
6290: 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  yn|MEM_Str|MEM_T
62a0: 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73  erm;.    z = dis
62b0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d  playP4(pOp, pMem
62c0: 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66  ->z, 32);.    if
62d0: 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  ( z!=pMem->z ){.
62e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
62f0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
6300: 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55   z, -1, SQLITE_U
6310: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  TF8, 0);.    }el
6320: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
6330: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a  ( pMem->z!=0 );.
6340: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
6350: 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a 29 3b  strlen(pMem->z);
6360: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
6370: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
6380: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
6390: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
63a0: 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  XT;.    pMem++;.
63b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
63c0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
63d0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
63e0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20  emGrow(pMem, 4, 
63f0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  0) ){.        p-
6400: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6410: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  d = 1;.        r
6420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6430: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
6440: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
6450: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c  MEM_Dyn|MEM_Str|
6460: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20  MEM_Term;.      
6470: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20  pMem->n = 2;.   
6480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6490: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  ntf(3, pMem->z, 
64a0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29  "%.2x", pOp->p5)
64b0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20  ;   /* P5 */.   
64c0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
64d0: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20  SQLITE_TEXT;.   
64e0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
64f0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
6500: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66    pMem++;.  .#if
6510: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
6520: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
6530: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
6540: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
6550: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
6560: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  rm;.        pMem
6570: 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  ->z = pOp->zComm
6580: 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70 4d 65  ent;.        pMe
6590: 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d  m->n = strlen(pM
65a0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
65b0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
65c0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
65d0: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
65e0: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
65f0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6600: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
6610: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
6620: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
6630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
6640: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
6650: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
6660: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
6670: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
6680: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
6690: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
66a0: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
66b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
66c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
66d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
66e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
66f0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6700: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
6710: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6720: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
6730: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
6740: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
6750: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
6760: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
6770: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
6780: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
6790: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
67a0: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
67b0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
67c0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
67d0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
67e0: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
67f0: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
6800: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
6810: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
6820: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
6830: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
6840: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
6850: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
6860: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
6870: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6880: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
6890: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
68a0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
68b0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
68c0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
68d0: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
68e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
68f0: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
6900: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6910: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6920: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6930: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6940: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6950: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6960: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
6970: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
6980: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
6990: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
69a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
69b0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
69c0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
69d0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
69e0: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
69f0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
6a00: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6a10: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6a20: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6a30: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6a40: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6a50: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6a60: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
6a70: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
6a80: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
6a90: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
6aa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6ab0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6ac0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
6ad0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6ae0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
6af0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
6b00: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6b10: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6b20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6b30: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6b40: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6b50: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6b60: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
6b70: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
6b80: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
6b90: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
6ba0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
6bb0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
6bc0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
6bd0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
6be0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
6bf0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
6c00: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6c10: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6c20: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6c30: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6c40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6c50: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6c60: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
6c70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6c80: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
6c90: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
6ca0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
6cb0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
6ce0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6d10: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6d20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6d30: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d60: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
6d70: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
6d80: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6da0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
6db0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
6dc0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
6df0: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
6e00: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6e10: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6e20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6e30: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6e40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6e50: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6e60: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
6e70: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
6e80: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
6e90: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
6ea0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
6eb0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
6ec0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
6ed0: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
6ee0: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
6ef0: 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63  r. */.  p->magic
6f00: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55   = VDBE_MAGIC_RU
6f10: 4e 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63  N;..  /* For eac
6f20: 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65  h cursor require
6f30: 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65  d, also allocate
6f40: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
6f50: 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c  Memory.  ** cell
6f60: 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f  s (nMem+1-nCurso
6f70: 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73  r)..nMem, inclus
6f80: 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20  ive, will never 
6f90: 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20  be used by.  ** 
6fa0: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
6fb0: 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61  . Instead they a
6fc0: 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63  re used to alloc
6fd0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20  ate space for.  
6fe0: 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74  ** VdbeCursor/Bt
6ff0: 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65  Cursor structure
7000: 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d  s. The blob of m
7010: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
7020: 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73   with .  ** curs
7030: 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69  or 0 is stored i
7040: 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d  n memory cell nM
7050: 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20  em. Memory cell 
7060: 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74  (nMem-1).  ** st
7070: 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66  ores the blob of
7080: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
7090: 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31  ed with cursor 1
70a0: 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  , etc..  **.  **
70b0: 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63   See also: alloc
70c0: 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a  ateCursor()..  *
70d0: 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72  /.  nMem += nCur
70e0: 73 6f 72 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  sor;..  /*.  ** 
70f0: 41 6c 6c 6f 63 61 74 69 6f 6e 20 73 70 61 63 65  Allocation space
7100: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2e 0a   for registers..
7110: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 61 4d    */.  if( p->aM
7120: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  em==0 ){.    int
7130: 20 6e 41 72 67 3b 20 20 20 20 20 20 20 2f 2a 20   nArg;       /* 
7140: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
7150: 66 20 61 72 67 73 20 70 61 73 73 65 64 20 74 6f  f args passed to
7160: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
7170: 2e 20 2a 2f 0a 20 20 20 20 72 65 73 6f 6c 76 65  . */.    resolve
7180: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
7190: 67 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  g);.    assert( 
71a0: 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nVar>=0 );.    i
71b0: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20  f( isExplain && 
71c0: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20  nMem<10 ){.     
71d0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20   nMem = 10;.    
71e0: 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  }.    p->aMem = 
71f0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
7200: 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20 20 20  ero(db,.        
7210: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7230: 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20  * aMem */.      
7240: 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  + nVar*sizeof(Me
7250: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
7260: 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20 20 20   /* aVar */.    
7270: 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28    + nArg*sizeof(
7280: 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20 20 20  Mem*)           
7290: 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f 0a 20     /* apArg */. 
72a0: 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65       + nVar*size
72b0: 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20 20 20  of(char*)       
72c0: 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72 20 2a        /* azVar *
72d0: 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72 73 6f  /.      + nCurso
72e0: 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72  r*sizeof(VdbeCur
72f0: 73 6f 72 2a 29 2b 31 20 20 2f 2a 20 61 70 43 73  sor*)+1  /* apCs
7300: 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20  r */.    );.    
7310: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
7320: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 70  ailed ){.      p
7330: 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20  ->aMem--;       
7340: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
7350: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
7360: 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  m */.      p->nM
7370: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
7380: 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66    /*       not f
7390: 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f  rom 0..nMem-1 */
73a0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  .      p->aVar =
73b0: 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d 2b 31   &p->aMem[nMem+1
73c0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72  ];.      p->nVar
73d0: 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 70   = nVar;.      p
73e0: 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20 20 20  ->okVar = 0;.   
73f0: 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d     p->apArg = (M
7400: 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b 6e 56  em**)&p->aVar[nV
7410: 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 7a  ar];.      p->az
7420: 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29 26 70  Var = (char**)&p
7430: 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b 0a 20  ->apArg[nArg];. 
7440: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20       p->apCsr = 
7450: 28 56 64 62 65 43 75 72 73 6f 72 2a 2a 29 26 70  (VdbeCursor**)&p
7460: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
7470: 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20       p->nCursor 
7480: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = nCursor;.     
7490: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
74a0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
74b0: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
74c0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
74d0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
74e0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
74f0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
7500: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
7510: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
7520: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
7530: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
7540: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
7550: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7560: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7570: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
7580: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
7590: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
75a0: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
75b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
75c0: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
75d0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
75e0: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
75f0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
7600: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
7610: 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  t;.  p->explain 
7620: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
7630: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
7640: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
7650: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
7660: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
7670: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
7680: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
7690: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
76a0: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
76b0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
76c0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
76d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
76e0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
76f0: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
7700: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
7710: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
7720: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
7730: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
7740: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
7750: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
7760: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
7770: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
7780: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
7790: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
77a0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
77b0: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43  , VdbeCursor *pC
77c0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
77d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
77e0: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
77f0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Bt ){.    sqlite
7800: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d  3BtreeClose(pCx-
7810: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68  >pBt);.    /* Th
7820: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77  e pCx->pCursor w
7830: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74  ill be close aut
7840: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69  omatically, if i
7850: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20  t exists, by.   
7860: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
7870: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69  ve. */.  }else i
7880: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  f( pCx->pCursor 
7890: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
78a0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70  reeCloseCursor(p
78b0: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20  Cx->pCursor);.  
78c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
78d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
78e0: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56  LE.  if( pCx->pV
78f0: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20  tabCursor ){.   
7900: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75   sqlite3_vtab_cu
7910: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f  rsor *pVtabCurso
7920: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75  r = pCx->pVtabCu
7930: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  rsor;.    const 
7940: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
7950: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70  pModule = pCx->p
7960: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
7970: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
7980: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
7990: 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64  e3SafetyOff(p->d
79a0: 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d  b);.    pModule-
79b0: 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72  >xClose(pVtabCur
79c0: 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29  sor);.    (void)
79d0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
79e0: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69  p->db);.    p->i
79f0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b  nVtabMethod = 0;
7a00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
7a10: 28 20 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65  ( !pCx->ephemPse
7a20: 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  udoTable ){.    
7a30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
7a40: 3e 64 62 2c 20 70 43 78 2d 3e 70 44 61 74 61 29  >db, pCx->pData)
7a50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
7a60: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
7a70: 20 65 78 63 65 70 74 20 66 6f 72 20 56 54 61 62   except for VTab
7a80: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
7a90: 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 69  e currently.** i
7aa0: 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
7ab0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
7ac0: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
7ad0: 65 56 74 61 62 73 28 56 64 62 65 20 2a 70 29 7b  eVtabs(Vdbe *p){
7ae0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
7af0: 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20 72 65  p->apCsr==0 ) re
7b00: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
7b10: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
7b20: 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65 43 75 72  ++){.    VdbeCur
7b30: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
7b40: 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  sr[i];.    if( p
7b50: 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74 61 62  C && (!p->inVtab
7b60: 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d 3e 70  Method || !pC->p
7b70: 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b 0a 20  VtabCursor) ){. 
7b80: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7b90: 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43  FreeCursor(p, pC
7ba0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  );.      p->apCs
7bb0: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  r[i] = 0;.    }.
7bc0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65    }.}../*.** Cle
7bd0: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
7be0: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a  er execution..**
7bf0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7c00: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
7c10: 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75  lly close any cu
7c20: 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e  rsors, lists, an
7c30: 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20  d/or.** sorters 
7c40: 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f  that were left o
7c50: 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65  pen.  It also de
7c60: 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73  letes the values
7c70: 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73   of.** variables
7c80: 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61   in the aVar[] a
7c90: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
7ca0: 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62  void Cleanup(Vdb
7cb0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
7cc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7cd0: 70 2d 3e 64 62 3b 0a 20 20 63 6c 6f 73 65 41 6c  p->db;.  closeAl
7ce0: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
7cf0: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
7d00: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
7d10: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Mem; i++){.    M
7d20: 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26 70  emSetTypeFlag(&p
7d30: 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e  ->aMem[i], MEM_N
7d40: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ull);.  }.  rele
7d50: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
7d60: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
7d70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
7d80: 46 69 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46  FifoClear(&p->sF
7d90: 69 66 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63  ifo);.  if( p->c
7da0: 6f 6e 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20  ontextStack ){. 
7db0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
7dc0: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70  >contextStackTop
7dd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
7de0: 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65  lite3VdbeFifoCle
7df0: 61 72 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ar(&p->contextSt
7e00: 61 63 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20  ack[i].sFifo);. 
7e10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7e20: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f  DbFree(db, p->co
7e30: 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d  ntextStack);.  }
7e40: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
7e50: 63 6b 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e  ck = 0;.  p->con
7e60: 74 65 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d  textStackDepth =
7e70: 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74   0;.  p->context
7e80: 53 74 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20  StackTop = 0;.  
7e90: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7ea0: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
7eb0: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7ec0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7ed0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7ee0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7ef0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
7f00: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
7f10: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
7f20: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
7f30: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
7f40: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
7f50: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
7f60: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7f70: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7f80: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7f90: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7fa0: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7fb0: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7fc0: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
7fd0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
7fe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7ff0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
8000: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
8010: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
8020: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
8030: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8040: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
8050: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
8060: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
8070: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
8080: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
8090: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
80a0: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
80b0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
80c0: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
80d0: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20   = nResColumn;. 
80e0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
80f0: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
8100: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
8110: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
8120: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
8130: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
8140: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
8150: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
8160: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
8170: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
8180: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
8190: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
81a0: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
81b0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
81c0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
81d0: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
81e0: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
81f0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
8200: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
8210: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
8220: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
8230: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
8240: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
8250: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
8260: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
8270: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
8280: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
8290: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
82a0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
82b0: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
82c0: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
82d0: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
82e0: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
82f0: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
8300: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
8310: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
8320: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
8330: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
8340: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
8350: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
8360: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
8370: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
8380: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
8390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
83a0: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
83b0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
83c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
83d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
83e0: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
83f0: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
8400: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
8430: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
8440: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
8450: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
8460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
8470: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
8480: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
8490: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
84a0: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
84b0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
84c0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
84d0: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
84e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
84f0: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
8500: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
8510: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
8520: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
8530: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
8540: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
8550: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
8560: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
8570: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
8580: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
8590: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
85a0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  }.  assert( p->a
85b0: 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ColName!=0 );.  
85c0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e  pColName = &(p->
85d0: 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72  aColName[idx+var
85e0: 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29  *p->nResColumn])
85f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8600: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43  VdbeMemSetStr(pC
8610: 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d  olName, zName, -
8620: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8630: 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28  xDel);.  assert(
8640: 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65   rc!=0 || !zName
8650: 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66   || (pColName->f
8660: 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d  lags&MEM_Term)!=
8670: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
8680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61  ;.}../*.** A rea
8690: 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
86a0: 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61  action may or ma
86b0: 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20  y not be active 
86c0: 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  on database hand
86d0: 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74  le.** db. If a t
86e0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
86f0: 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e  tive, commit it.
8700: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a   If there is a.*
8710: 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  * write-transact
8720: 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72  ion spanning mor
8730: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8740: 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72  ase file, this r
8750: 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20  outine.** takes 
8760: 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74  care of the mast
8770: 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b  er journal trick
8780: 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ery..*/.static i
8790: 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71  nt vdbeCommit(sq
87a0: 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
87b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
87c0: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20  int nTrans = 0; 
87d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61   /* Number of da
87e0: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20  tabases with an 
87f0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61  active write-tra
8800: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nsaction */.  in
8810: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8820: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d  ;.  int needXcom
8830: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42  mit = 0;..  /* B
8840: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
8850: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
8860: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
8870: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
8880: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
8890: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
88a0: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
88b0: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
88c0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
88d0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
88e0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
88f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8900: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
8910: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
8920: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
8930: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
8940: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
8950: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
8960: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
8970: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26  e3VtabSync(db, &
8980: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  p->zErrMsg);.  i
8990: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
89a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
89b0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69  c;.  }..  /* Thi
89c0: 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
89d0: 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
89e0: 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
89f0: 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
8a00: 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
8a10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
8a20: 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
8a30: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
8a40: 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
8a50: 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
8a60: 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
8a70: 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
8a80: 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
8a90: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
8aa0: 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
8ab0: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
8ac0: 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
8ad0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
8ae0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
8af0: 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
8b00: 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
8b10: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
8b20: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
8b30: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8b40: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
8b50: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8b60: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
8b70: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
8b80: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
8b90: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d   nTrans++;.    }
8ba0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
8bb0: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
8bc0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
8bd0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
8be0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
8bf0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
8c00: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
8c10: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
8c20: 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61   (void)sqlite3Sa
8c30: 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20 20  fetyOff(db);.   
8c40: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
8c50: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
8c60: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 28  ommitArg);.    (
8c70: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
8c80: 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69 66  tyOn(db);.    if
8c90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
8cb0: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20  TRAINT;.    }.  
8cc0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
8cd0: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
8ce0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
8cf0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
8d00: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
8d10: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
8d20: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
8d30: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
8d40: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
8d50: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
8d60: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
8d70: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
8d80: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
8d90: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
8da0: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
8db0: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
8dc0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
8dd0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
8de0: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
8df0: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
8e00: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
8e10: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
8e20: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
8e30: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
8e40: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
8e50: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
8e60: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
8e70: 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74 72  trlen(sqlite3Btr
8e80: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62  eeGetFilename(db
8e90: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c  ->aDb[0].pBt)) |
8ea0: 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20  | nTrans<=1 ){. 
8eb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
8ec0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
8ed0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8ee0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
8ef0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
8f00: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
8f10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8f20: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
8f30: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
8f40: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
8f50: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65  }..    /* Do the
8f60: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20   commit only if 
8f70: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75  all databases su
8f80: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c  ccessfully compl
8f90: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20  ete phase 1. .  
8fa0: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74    ** If one of t
8fb0: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  he BtreeCommitPh
8fc0: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66  aseOne() calls f
8fd0: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63  ails, this indic
8fe0: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49  ates an.    ** I
8ff0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65  O error while de
9000: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61  leting or trunca
9010: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66  ting a journal f
9020: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b  ile. It is unlik
9030: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20  ely,.    ** but 
9040: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e  could happen. In
9050: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64   this case aband
9060: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
9070: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  d return the err
9080: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  or..    */.    f
9090: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
90a0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
90b0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
90c0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
90d0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
90e0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
90f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9100: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
9110: 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20  seTwo(pBt);.    
9120: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
9130: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9140: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9150: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
9160: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
9170: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
9180: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
9190: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
91a0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
91b0: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
91c0: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
91d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
91e0: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
91f0: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
9200: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
9210: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
9220: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
9230: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
9240: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
9250: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
9260: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
9270: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
9280: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
9290: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
92a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
92b0: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
92c0: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
92d0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
92e0: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
92f0: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
9300: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
9310: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
9320: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
9330: 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53  t res;..    /* S
9340: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
9350: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
9360: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
9370: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20     u32 random;. 
9380: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9390: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
93a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
93b0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
93c0: 28 72 61 6e 64 6f 6d 29 2c 20 26 72 61 6e 64 6f  (random), &rando
93d0: 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 65  m);.      zMaste
93e0: 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  r = sqlite3MPrin
93f0: 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 38  tf(db, "%s-mj%08
9400: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72  X", zMainFile, r
9410: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66  andom&0x7fffffff
9420: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d  );.      if( !zM
9430: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  aster ){.       
9440: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9450: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
9460: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9470: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
9480: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
9490: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
94a0: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
94b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
94c0: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
94d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
94e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
94f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9500: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
9510: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
9520: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
9530: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
9540: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
9550: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
9560: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
9570: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
9580: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
9590: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
95a0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
95b0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
95c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
95d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
95e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
95f0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
9600: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
9610: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
9620: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
9630: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
9640: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
9650: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
9660: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
9670: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
9680: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
9690: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
96a0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
96b0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
96c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
96d0: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
96e0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
96f0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
9700: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
9710: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9720: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
9730: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
9740: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
9750: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
9760: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
9770: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
9780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
9790: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
97a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
97b0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
97c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 2f 2a  ) continue;   /*
97d0: 20 49 67 6e 6f 72 65 20 74 68 65 20 54 45 4d 50   Ignore the TEMP
97e0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
97f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
9800: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
9810: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
9820: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
9830: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
9840: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
9850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
9860: 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74  ile[0]==0 ) cont
9870: 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65  inue;  /* Ignore
9880: 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
9890: 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ses */.        i
98a0: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
98b0: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
98c0: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
98d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
98e0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
98f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
9900: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9910: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
9920: 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 2c  strlen(zFile)+1,
9930: 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
9940: 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 74 72 6c    offset += strl
9950: 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  en(zFile)+1;.   
9960: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
9970: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9980: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9990: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
99a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
99b0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
99c0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
99d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
99e0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
99f0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
9a00: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
9a10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9a20: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
9a30: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9a40: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
9a50: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
9a60: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
9a70: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
9a80: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
9a90: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46     */.    zMainF
9aa0: 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ile = sqlite3Btr
9ab0: 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d  eeGetDirname(db-
9ac0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
9ad0: 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20    if( (needSync 
9ae0: 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71  .     && (0==(sq
9af0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
9b00: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61  racteristics(pMa
9b10: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43  ster)&SQLITE_IOC
9b20: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a  AP_SEQUENTIAL)).
9b30: 20 20 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69       && (rc=sqli
9b40: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
9b50: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
9b60: 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f  ORMAL))!=SQLITE_
9b70: 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OK) ){.      sql
9b80: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
9b90: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
9ba0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9bb0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
9bc0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9bd0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
9be0: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
9bf0: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
9c00: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
9c10: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
9c20: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
9c30: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
9c40: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
9c50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9c60: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
9c70: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
9c80: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
9c90: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9ca0: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
9cb0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
9cd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
9ce0: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
9cf0: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
9d00: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
9d10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9d20: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
9d30: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
9d40: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
9d50: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
9d60: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
9d70: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
9d80: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
9d90: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
9da0: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
9db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
9dc0: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
9dd0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
9de0: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
9df0: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
9e00: 75 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ured..    */.   
9e10: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
9e20: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
9e30: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
9e40: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
9e50: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
9e60: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
9e70: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
9e80: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9e90: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d  PhaseOne(pBt, zM
9ea0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  aster);.      }.
9eb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9ec0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
9ed0: 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ster);.    if( r
9ee0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9f00: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
9f10: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9f20: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9f30: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
9f40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
9f50: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
9f60: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
9f70: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
9f80: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
9f90: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
9fa0: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
9fb0: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
9fc0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
9fd0: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
9fe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
9ff0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a000: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
a010: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
a020: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
a030: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
a040: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
a050: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a060: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
a070: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
a080: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
a090: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
a0a0: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
a0b0: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
a0c0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
a0d0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
a0e0: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
a0f0: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
a100: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
a110: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
a120: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
a130: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
a140: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
a150: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
a160: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
a170: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
a180: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
a190: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
a1a0: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
a1b0: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
a1c0: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
a1d0: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
a1e0: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
a1f0: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
a200: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
a210: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
a220: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
a230: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
a240: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
a250: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
a260: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
a270: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
a280: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
a290: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
a2a0: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
a2b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
a2c0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
a2d0: 74 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a  tPhaseTwo(pBt);.
a2e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a2f0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
a300: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
a310: 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
a320: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
a330: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
a340: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
a350: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
a360: 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
a370: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a380: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
a390: 33 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  3.activeVdbeCnt 
a3a0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
a3b0: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
a3c0: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
a3d0: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
a3e0: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
a3f0: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
a400: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
a410: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
a420: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
a430: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
a440: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
a450: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
a460: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
a470: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
a480: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
a490: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
a4a0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
a4b0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
a4c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
a4d0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
a4e0: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
a4f0: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
a500: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
a510: 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
a520: 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
a530: 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
a540: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d   ){.    if( p->m
a550: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
a560: 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30  _RUN && p->pc>=0
a570: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
a580: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
a590: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
a5a0: 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  te++;.    }.    
a5b0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
a5c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
a5d0: 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  =db->activeVdbeC
a5e0: 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
a5f0: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74  nWrite==db->writ
a600: 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65  eVdbeCnt );.}.#e
a610: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
a620: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
a630: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
a640: 46 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20  For every Btree 
a650: 74 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65  that in database
a660: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77   connection db w
a670: 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65  hich .** has bee
a680: 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69  n modified, "tri
a690: 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65  p" or invalidate
a6a0: 20 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a   each cursor in.
a6b0: 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69  ** that Btree mi
a6c0: 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  ght have been mo
a6d0: 64 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74  dified so that t
a6e0: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
a6f0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
a700: 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70  gain.  This happ
a710: 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62  ens when a rollb
a720: 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20  ack.*** occurs. 
a730: 20 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70   We have to trip
a740: 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
a750: 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20  ursors, even.** 
a760: 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65  cursor from othe
a770: 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65  r VMs in differe
a780: 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  nt database conn
a790: 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74  ections,.** so t
a7a0: 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d  hat none of them
a7b0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
a7c0: 64 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68  data at which th
a7d0: 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74  ey.** were point
a7e0: 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f  ing and which no
a7f0: 77 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  w may have been 
a800: 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74  changed due.** t
a810: 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
a820: 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74  **.** Remember t
a830: 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63  hat a rollback c
a840: 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73  an delete tables
a850: 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a   complete and.**
a860: 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67   reorder rootpag
a870: 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f  es.  So it is no
a880: 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73  t sufficient jus
a890: 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65  t to save.** the
a8a0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
a8b0: 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74  rsor.  We have t
a8c0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
a8d0: 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68   cursor.** so th
a8e0: 61 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75  at it is never u
a8f0: 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74  sed again..*/.st
a900: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
a910: 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64  dateCursorsOnMod
a920: 69 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69  ifiedBtrees(sqli
a930: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
a940: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
a950: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a960: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
a970: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
a980: 20 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74    if( p && sqlit
a990: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
a9a0: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  (p) ){.      sql
a9b0: 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
a9c0: 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54  Cursors(p, SQLIT
a9d0: 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a  E_ABORT);.    }.
a9e0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
a9f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
aa00: 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
aa10: 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
aa20: 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
aa30: 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
aa40: 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
aa50: 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
aa60: 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
aa70: 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
aa80: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
aa90: 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
aaa0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
aab0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
aac0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
aad0: 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
aae0: 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
aaf0: 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
ab00: 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
ab10: 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
ab20: 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
ab30: 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
ab40: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
ab50: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
ab60: 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
ab70: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
ab80: 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
ab90: 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
aba0: 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
abb0: 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
abc0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
abd0: 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
abe0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
abf0: 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
ac00: 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
ac10: 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
ac20: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
ac30: 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
ac40: 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
ac50: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
ac60: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
ac70: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78  int i;.  int (*x
ac80: 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74  Func)(Btree *pBt
ac90: 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74  ) = 0;  /* Funct
aca0: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65  ion to call on e
acb0: 61 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e  ach btree backen
acc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65  d */.  int isSpe
acd0: 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
ace0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
acf0: 74 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e  true if SQLITE_N
ad00: 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f  OMEM or IOERR */
ad10: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
ad20: 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
ad30: 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
ad40: 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
ad50: 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
ad60: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
ad70: 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
ad80: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
ad90: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
ada0: 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
adb0: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
adc0: 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
add0: 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
ade0: 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
adf0: 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
ae00: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
ae10: 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
ae20: 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
ae30: 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
ae40: 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
ae50: 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
ae60: 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
ae70: 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
ae80: 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
ae90: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
aea0: 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
aeb0: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
aec0: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
aed0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
aee0: 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
aef0: 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
af00: 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
af10: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
af20: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
af30: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
af40: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
af50: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
af60: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
af70: 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  M;.  }.  closeAl
af80: 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63  lCursorsExceptAc
af90: 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20  tiveVtabs(p);.  
afa0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
afb0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
afc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
afd0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
afe0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
aff0: 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
b000: 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
b010: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
b020: 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
b030: 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ted */.  if( p->
b040: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  pc>=0 ){.    int
b050: 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
b060: 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
b070: 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20  om p->rc */..   
b080: 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
b090: 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
b0a0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
b0b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
b0c0: 65 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d  exArrayEnter(&p-
b0d0: 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >aMutex);..    /
b0e0: 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
b0f0: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
b100: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
b110: 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
b120: 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
b130: 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
b140: 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
b150: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b170: 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
b180: 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
b190: 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
b1a0: 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
b1b0: 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
b1c0: 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
b1d0: 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77  was read-only, w
b1e0: 65 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c  e need do no rol
b1f0: 6c 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74  lback at all. Ot
b200: 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
b210: 2a 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74  * proceed with t
b220: 68 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c  he special handl
b230: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
b240: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
b250: 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c  Only || mrc!=SQL
b260: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b  ITE_INTERRUPT ){
b270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
b280: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
b290: 5f 42 4c 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75  _BLOCKED && p->u
b2a0: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
b2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
b2c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
b2d0: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
b2e0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
b2f0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
b300: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
b310: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
b320: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
b330: 5f 46 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20  _FULL).         
b340: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e            && p->
b350: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
b360: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75  ){.          xFu
b370: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
b380: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20  eRollbackStmt;. 
b390: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b3a0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
b3b0: 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
b3c0: 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
b3d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
b3e0: 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
b3f0: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
b400: 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
b410: 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
b420: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
b430: 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
b440: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
b450: 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72  invalidateCursor
b460: 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65  sOnModifiedBtree
b470: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
b480: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
b490: 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20  All(db);.       
b4a0: 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
b4b0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  t = 1;.        }
b4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b4d0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
b4e0: 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
b4f0: 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73   is set and this
b500: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
b510: 69 76 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20  ive vdbe, then. 
b520: 20 20 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68     ** we do eith
b530: 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
b540: 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
b550: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
b560: 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
b570: 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
b580: 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
b590: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
b5a0: 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
b5b0: 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
b5c0: 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
b5d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
b5e0: 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
b5f0: 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
b600: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
b610: 20 20 20 20 26 26 20 64 62 2d 3e 77 72 69 74 65      && db->write
b620: 56 64 62 65 43 6e 74 3d 3d 28 70 2d 3e 72 65 61  VdbeCnt==(p->rea
b630: 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
b640: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b660: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
b670: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
b680: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
b690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
b6a0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
b6b0: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
b6c0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
b6d0: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  s .        ** su
b6e0: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
b6f0: 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
b700: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
b710: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
b720: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
b730: 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ired..        */
b740: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
b750: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
b760: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   p);.        if(
b770: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
b780: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b790: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
b7a0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
b7b0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
b7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b7d0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
b7e0: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
b7f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b800: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
b810: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
b820: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
b830: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
b840: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b850: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
b860: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
b870: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
b880: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b890: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
b8a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
b8b0: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
b8c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
b8d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
b8e0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
b8f0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
b900: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
b910: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
b920: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b930: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
b940: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
b950: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
b960: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
b970: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
b980: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
b990: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b9a0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
b9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
b9c0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
b9d0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
b9e0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
b9f0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
ba00: 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
ba10: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
ba20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ba30: 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e 63  .    /* If xFunc
ba40: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
ba50: 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20  en it is one of 
ba60: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
ba70: 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20 20  backStmt or.    
ba80: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
ba90: 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20  ommitStmt. Call 
baa0: 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20  it once on each 
bab0: 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20 65  backend. If an e
bac0: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20 20  rror occurs.    
bad0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75 72  ** and the retur
bae0: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 20  n code is still 
baf0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 74  SQLITE_OK, set t
bb00: 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
bb10: 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a  o the new.    **
bb20: 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20   error value..  
bb30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
bb40: 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20 20  !xFunc ||.      
bb50: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
bb60: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c 7c  reeCommitStmt ||
bb70: 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73 71  .      xFunc==sq
bb80: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
bb90: 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20  ckStmt.    );.  
bba0: 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63    for(i=0; xFunc
bbb0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
bbc0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20  ++){ .      int 
bbd0: 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  rc;.      Btree 
bbe0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
bbf0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
bc00: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
bc10: 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29 3b  rc = xFunc(pBt);
bc20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
bc30: 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  && (p->rc==SQLIT
bc40: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  E_OK || p->rc==S
bc50: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bc60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
bc70: 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
bc80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
bc90: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
bca0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
bcb0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
bcc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bcd0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
bce0: 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49  If this was an I
bcf0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72  NSERT, UPDATE or
bd00: 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20   DELETE and the 
bd10: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 63 6f  statement was co
bd20: 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20 2a 2a  mmitted, .    **
bd30: 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 20   set the change 
bd40: 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
bd50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
bd60: 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e 70 63  geCntOn && p->pc
bd70: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  >=0 ){.      if(
bd80: 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 6e 63   !xFunc || xFunc
bd90: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  ==sqlite3BtreeCo
bda0: 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 20 20  mmitStmt ){.    
bdb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
bdc0: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
bdd0: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
bde0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bdf0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
be00: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
be10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
be20: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
be30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c  }.  .    /* Roll
be40: 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 61  back or commit a
be50: 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ny schema change
be60: 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 2e  s that occurred.
be70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
be80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
be90: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
bea0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 29  _InternChanges )
beb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
bec0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
bed0: 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  ma(db, 0);.     
bee0: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 64 62   db->flags = (db
bef0: 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45  ->flags | SQLITE
bf00: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 3b  _InternChanges);
bf10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
bf20: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73  elease the locks
bf30: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
bf40: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65  treeMutexArrayLe
bf50: 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b  ave(&p->aMutex);
bf60: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
bf70: 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
bf80: 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
bf90: 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
bfa0: 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
bfb0: 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
bfc0: 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65  {.    db->active
bfd0: 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69  VdbeCnt--;.    i
bfe0: 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
bff0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69  ){.      db->wri
c000: 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20  teVdbeCnt--;.   
c010: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 64   }.    assert( d
c020: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
c030: 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43  >=db->writeVdbeC
c040: 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  nt );.  }.  p->m
c050: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
c060: 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
c070: 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
c080: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
c090: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
c0a0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
c0b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
c0c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c0d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
c0e0: 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
c0f0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
c100: 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
c110: 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
c120: 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
c130: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
c140: 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
c150: 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
c160: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
c170: 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
c180: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
c190: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
c1a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
c1b0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
c1c0: 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e  ecution but do n
c1d0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44  ot delete the VD
c1e0: 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20  BE just yet..** 
c1f0: 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
c200: 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70  messages into *p
c210: 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e  zErrMsg.  Return
c220: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
c230: 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ..**.** After th
c240: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75  is routine is ru
c250: 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75  n, the VDBE shou
c260: 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62  ld be ready to b
c270: 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67  e executed.** ag
c280: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f  ain..**.** To lo
c290: 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72  ok at it another
c2a0: 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69   way, this routi
c2b0: 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74  ne resets the st
c2c0: 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69  ate of the.** vi
c2d0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72  rtual machine fr
c2e0: 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  om VDBE_MAGIC_RU
c2f0: 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f  N or VDBE_MAGIC_
c300: 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20  HALT back to.** 
c310: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e  VDBE_MAGIC_INIT.
c320: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c330: 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70  dbeReset(Vdbe *p
c340: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
c350: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
c360: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20  .  /* If the VM 
c370: 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63  did not run to c
c380: 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20  ompletion or if 
c390: 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61  it encountered a
c3a0: 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68  n.  ** error, th
c3b0: 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20  en it might not 
c3c0: 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64  have been halted
c3d0: 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68   properly.  So h
c3e0: 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e  alt.  ** it now.
c3f0: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
c400: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 64 62  lite3SafetyOn(db
c410: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
c420: 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f 69 64  Halt(p);.  (void
c430: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
c440: 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f(db);..  /* If 
c450: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
c460: 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
c470: 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
c480: 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
c490: 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
c4a0: 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
c4b0: 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
c4c0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
c4d0: 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
c4e0: 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
c4f0: 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
c500: 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
c510: 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
c520: 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
c530: 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
c540: 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
c550: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
c560: 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
c570: 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
c580: 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
c590: 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
c5a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
c5b0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
c5c0: 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
c5d0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c5e0: 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
c5f0: 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
c600: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
c610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c620: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
c630: 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65 72 72  );.      db->err
c640: 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  Code = p->rc;.  
c650: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c660: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
c670: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a 45 72 72  );.      p->zErr
c680: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Msg = 0;.    }el
c690: 73 65 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a  se if( p->rc ){.
c6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
c6b0: 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29  or(db, p->rc, 0)
c6c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c6d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
c6e0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
c6f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
c700: 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
c710: 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
c720: 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
c730: 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
c740: 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
c750: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
c760: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
c770: 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
c780: 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
c790: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
c7a0: 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
c7b0: 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
c7c0: 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
c7d0: 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
c7e0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
c7f0: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
c800: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
c810: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c820: 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45  >pErr, -1, p->zE
c830: 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54  rrMsg, SQLITE_UT
c840: 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  F8, SQLITE_TRANS
c850: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
c860: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
c870: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
c880: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
c890: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
c8a0: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
c8b0: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
c8c0: 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a  .  Cleanup(p);..
c8d0: 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c    /* Save profil
c8e0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
c8f0: 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72  from this VDBE r
c900: 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  un..  */.#ifdef 
c910: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
c920: 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  .    FILE *out =
c930: 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f   fopen("vdbe_pro
c940: 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b  file.out", "a");
c950: 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  .    if( out ){.
c960: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
c970: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
c980: 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  "---- ");.      
c990: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
c9a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
c9b0: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25   fprintf(out, "%
c9c0: 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e  02x", p->aOp[i].
c9d0: 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d  opcode);.      }
c9e0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
c9f0: 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
ca00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
ca10: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
ca20: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
ca30: 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64  %6d %10lld %8lld
ca40: 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
ca50: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
ca60: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
ca70: 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
ca80: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
ca90: 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
caa0: 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
cab0: 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
cac0: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71     );.        sq
cad0: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
cae0: 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
caf0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
cb00: 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
cb10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
cb20: 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  f.  p->magic = V
cb30: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
cb40: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
cb50: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
cb60: 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
cb70: 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
cb80: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
cb90: 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
cba0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
cbb0: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
cbc0: 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
cbd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
cbe0: 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
cbf0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cc00: 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
cc10: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
cc20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
cc30: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
cc40: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
cc50: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
cc60: 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
cc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
cc80: 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
cc90: 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
cca0: 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
ccb0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
ccc0: 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
ccd0: 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20  GIC_INIT ){.    
cce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
ccf0: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
cd00: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
cd10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cd20: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ../*.** Call the
cd30: 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20   destructor for 
cd40: 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e 74  each auxdata ent
cd50: 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20  ry in pVdbeFunc 
cd60: 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65  for which.** the
cd70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
cd80: 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c  it in mask is cl
cd90: 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e  ear.  Auxdata en
cda0: 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a  tries beyond 31.
cdb0: 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 65  ** are always de
cdc0: 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73  stroyed.  To des
cdd0: 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61  troy all auxdata
cde0: 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74   entries, call t
cdf0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77  his.** routine w
ce00: 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a  ith mask==0..*/.
ce10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ce20: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 64  DeleteAuxData(Vd
ce30: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e  beFunc *pVdbeFun
ce40: 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  c, int mask){.  
ce50: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
ce60: 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e  ; i<pVdbeFunc->n
ce70: 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Aux; i++){.    s
ce80: 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a 70  truct AuxData *p
ce90: 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63  Aux = &pVdbeFunc
cea0: 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20  ->apAux[i];.    
ceb0: 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d  if( (i>31 || !(m
cec0: 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20  ask&(1<<i))) && 
ced0: 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20  pAux->pAux ){.  
cee0: 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44      if( pAux->xD
cef0: 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
cf00: 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70   pAux->xDelete(p
cf10: 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Aux->pAux);.    
cf20: 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e    }.      pAux->
cf30: 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pAux = 0;.    }.
cf40: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
cf50: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
cf60: 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
cf70: 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
cf80: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
cf90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
cfa0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
cfb0: 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
cfc0: 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  db;.  if( p->pPr
cfd0: 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
cfe0: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
cff0: 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
d000: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
d010: 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
d020: 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
d030: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
d040: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
d050: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
d060: 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
d070: 20 69 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20   if( p->aOp ){. 
d080: 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e     Op *pOp = p->
d090: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
d0a0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c  ; i<p->nOp; i++,
d0b0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
d0c0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
d0d0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
d0e0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
d0f0: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c  _DEBUG.      sql
d100: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d110: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23  Op->zComment);.#
d120: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d  endif     .    }
d130: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d140: 65 65 28 64 62 2c 20 70 2d 3e 61 4f 70 29 3b 0a  ee(db, p->aOp);.
d150: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
d160: 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
d170: 2d 3e 6e 56 61 72 29 3b 0a 20 20 73 71 6c 69 74  ->nVar);.  sqlit
d180: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d190: 61 4c 61 62 65 6c 29 3b 0a 20 20 69 66 28 20 70  aLabel);.  if( p
d1a0: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71  ->aMem ){.    sq
d1b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
d1c0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a 20 20  &p->aMem[1]);.  
d1d0: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
d1e0: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
d1f0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
d200: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
d210: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
d220: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
d230: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d240: 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e   p->zSql);.  p->
d250: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
d260: 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74  IC_DEAD;.  sqlit
d270: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
d280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d  .}../*.** If a M
d290: 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
d2a0: 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
d2b0: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
d2c0: 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
d2d0: 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74  MoveTo now.  Ret
d2e0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
d2f0: 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f  e.  If no MoveTo
d300: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69   is pending, thi
d310: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65  s.** routine doe
d320: 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65  s nothing and re
d330: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
d340: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d350: 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
d360: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
d370: 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
d380: 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
d390: 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
d3a0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
d3b0: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
d3c0: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
d3d0: 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
d3e0: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
d3f0: 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
d400: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
d410: 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
d420: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
d430: 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
d440: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
d450: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
d460: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65  ->lastRowid = ke
d470: 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f  yToInt(p->moveto
d480: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e  Target);.    p->
d490: 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 72  rowidIsValid = r
d4a0: 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66 28 20 72  es==0;.    if( r
d4b0: 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  es<0 ){.      rc
d4c0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
d4d0: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ext(p->pCursor, 
d4e0: 26 72 65 73 29 3b 0a 20 20 20 20 20 20 69 66 28  &res);.      if(
d4f0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
d500: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
d510: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 71  LITE_TEST.    sq
d520: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
d530: 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nt++;.#endif.   
d540: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
d550: 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63  to = 0;.    p->c
d560: 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
d570: 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73  HE_STALE;.  }els
d580: 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f 72  e if( p->pCursor
d590: 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 4d   ){.    int hasM
d5a0: 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63  oved;.    int rc
d5b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
d5c0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
d5d0: 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f  >pCursor, &hasMo
d5e0: 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ved);.    if( rc
d5f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
d600: 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 29    if( hasMoved )
d610: 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 65  {.      p->cache
d620: 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
d630: 54 41 4c 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  TALE;.      p->n
d640: 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ullRow = 1;.    
d650: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
d660: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
d670: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d680: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
d690: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
d6a0: 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
d6b0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d6c0: 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
d6d0: 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
d6e0: 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
d6f0: 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
d700: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
d710: 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
d720: 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
d730: 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
d740: 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
d750: 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
d760: 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
d770: 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
d780: 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
d790: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
d7a0: 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
d7b0: 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
d7c0: 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
d7d0: 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
d7e0: 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
d7f0: 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
d800: 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
d810: 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
d820: 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
d830: 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
d840: 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
d850: 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
d860: 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
d870: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
d880: 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
d890: 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
d8a0: 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
d8b0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d8c0: 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
d8d0: 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
d8e0: 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
d8f0: 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
d900: 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
d910: 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
d920: 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
d930: 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
d940: 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a  lob seperately..
d950: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
d960: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
d970: 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
d980: 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
d990: 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
d9a0: 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
d9b0: 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
d9c0: 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
d9d0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
d9e0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
d9f0: 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
da00: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
da10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
da20: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
da30: 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
da40: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
da50: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
da60: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
da70: 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
daa0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
dab0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
dac0: 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
dad0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
dae0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
daf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db00: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
db10: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
db20: 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
db40: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
db50: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
db60: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
db70: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
db80: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
db90: 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
dbc0: 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
dbd0: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
dbe0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
dbf0: 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
dc00: 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
dc10: 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
dc20: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
dc30: 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
dc40: 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
dc50: 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
dc80: 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
dc90: 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
dca0: 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
dcb0: 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
dcc0: 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
dcd0: 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
dce0: 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
dcf0: 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
dd00: 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
dd10: 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
dd20: 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
dd30: 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
dd40: 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
dd50: 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
dd60: 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
dd70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
dd80: 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
dd90: 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
dda0: 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
ddb0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ddc0: 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
ddd0: 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
dde0: 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
ddf0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69  pMem->flags;.  i
de00: 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  nt n;..  if( fla
de10: 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
de20: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
de30: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
de40: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
de50: 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
de60: 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
de70: 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
de80: 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
de90: 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
dea0: 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
deb0: 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
dec0: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
ded0: 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69  64 u;.    if( fi
dee0: 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20  le_format>=4 && 
def0: 28 69 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20  (i&1)==i ){.    
df00: 20 20 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20    return 8+i;.  
df10: 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20    }.    u = i<0 
df20: 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66  ? -i : i;.    if
df30: 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72  ( u<=127 ) retur
df40: 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 1;.    if( u<=
df50: 33 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32  32767 ) return 2
df60: 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  ;.    if( u<=838
df70: 38 36 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b  8607 ) return 3;
df80: 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37  .    if( u<=2147
df90: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20  483647 ) return 
dfa0: 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41  4;.    if( u<=MA
dfb0: 58 5f 36 42 59 54 45 20 29 20 72 65 74 75 72 6e  X_6BYTE ) return
dfc0: 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36   5;.    return 6
dfd0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
dfe0: 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  s&MEM_Real ){.  
dff0: 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
e000: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
e010: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e020: 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
e030: 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
e040: 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20    n = pMem->n;. 
e050: 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
e060: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
e070: 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 7d  = pMem->u.i;.  }
e080: 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20  .  assert( n>=0 
e090: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a  );.  return ((n*
e0a0: 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67  2) + 12 + ((flag
e0b0: 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b  s&MEM_Str)!=0));
e0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
e0d0: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
e0e0: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f  he data correspo
e0f0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  nding to the sup
e100: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70  plied serial-typ
e110: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
e120: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
e130: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  en(u32 serial_ty
e140: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61  pe){.  if( seria
e150: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
e160: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
e170: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
e180: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63  else{.    static
e190: 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b   const u8 aSize[
e1a0: 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33  ] = { 0, 1, 2, 3
e1b0: 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c  , 4, 6, 8, 8, 0,
e1c0: 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20   0, 0, 0 };.    
e1d0: 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72  return aSize[ser
e1e0: 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d  ial_type];.  }.}
e1f0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
e200: 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
e210: 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
e220: 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
e230: 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
e240: 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
e250: 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
e260: 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
e270: 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
e280: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
e290: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
e2a0: 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
e2b0: 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
e2c0: 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
e2d0: 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
e2e0: 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
e2f0: 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
e300: 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
e310: 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
e320: 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
e330: 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
e340: 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
e350: 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
e360: 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
e370: 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
e380: 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
e390: 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
e3a0: 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
e3b0: 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
e3c0: 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
e3d0: 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
e3e0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
e3f0: 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
e400: 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
e410: 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
e420: 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
e430: 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
e440: 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
e450: 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
e460: 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
e470: 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
e480: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
e490: 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
e4a0: 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
e4b0: 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
e4c0: 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
e4d0: 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
e4e0: 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
e4f0: 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
e500: 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
e510: 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
e520: 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
e530: 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
e540: 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
e550: 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
e560: 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
e570: 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
e580: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
e590: 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
e5a0: 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
e5b0: 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
e5c0: 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
e5d0: 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
e5e0: 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
e5f0: 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
e600: 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
e610: 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
e620: 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
e630: 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
e640: 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
e650: 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
e660: 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
e670: 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
e680: 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
e690: 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
e6a0: 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
e6b0: 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
e6c0: 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
e6d0: 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
e6e0: 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
e6f0: 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
e700: 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
e710: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
e720: 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
e730: 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
e740: 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
e750: 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
e760: 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
e770: 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
e780: 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
e790: 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
e7a0: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
e7b0: 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
e7c0: 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
e7d0: 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
e7e0: 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
e7f0: 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
e800: 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
e810: 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
e820: 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
e830: 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
e840: 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
e850: 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
e860: 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
e870: 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
e880: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
e890: 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
e8a0: 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
e8b0: 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
e8c0: 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
e8d0: 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
e8e0: 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
e8f0: 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
e900: 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
e910: 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
e920: 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
e930: 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
e940: 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
e950: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
e960: 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
e970: 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
e980: 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
e990: 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
e9a0: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
e9b0: 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
e9c0: 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
e9d0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
e9e0: 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
e9f0: 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
ea00: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
ea10: 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
ea20: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
ea30: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
ea40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
ea50: 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
ea60: 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
ea70: 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
ea80: 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d  n buf[].  nBuf m
ea90: 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a  ust always be.**
eaa0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
eab0: 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65   hold the entire
eac0: 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c   field.  Except,
ead0: 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73   if the field is
eae0: 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20  .** a blob with 
eaf0: 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  a zero-filled ta
eb00: 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d  il, then buf[] m
eb10: 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65  ight be just the
eb20: 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74   right.** size t
eb30: 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e  o hold everythin
eb40: 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  g except for the
eb50: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
eb60: 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20  l.  If buf[].** 
eb70: 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75  is only big enou
eb80: 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  gh to hold the n
eb90: 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20  on-zero prefix, 
eba0: 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20  then only write 
ebb0: 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69  that.** prefix i
ebc0: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20  nto buf[].  But 
ebd0: 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67  if buf[] is larg
ebe0: 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  e enough to hold
ebf0: 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65   both the.** pre
ec00: 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c  fix and the tail
ec10: 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
ec20: 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74  prefix and set t
ec30: 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a  he tail to all.*
ec40: 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52  * zeros..**.** R
ec50: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
ec60: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
ec70: 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
ec80: 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
ec90: 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
eca0: 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
ecb0: 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
ecc0: 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
ecd0: 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
ece0: 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
ecf0: 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
ed00: 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69  []..*/ .int sqli
ed10: 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
ed20: 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42  (u8 *buf, int nB
ed30: 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  uf, Mem *pMem, i
ed40: 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b  nt file_format){
ed50: 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
ed60: 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pe = sqlite3Vdbe
ed70: 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c  SerialType(pMem,
ed80: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20   file_format);. 
ed90: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   int len;..  /* 
eda0: 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
edb0: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
edc0: 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
edd0: 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
ede0: 20 75 36 34 20 76 3b 0a 20 20 20 20 69 6e 74 20   u64 v;.    int 
edf0: 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
ee00: 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
ee10: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
ee20: 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
ee30: 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
ee40: 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
ee50: 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
ee60: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
ee70: 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
ee80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ee90: 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
eea0: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
eeb0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
eec0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
eed0: 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73  al_type);.    as
eee0: 73 65 72 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20  sert( len<=nBuf 
eef0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d  );.    while( i-
ef00: 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69  - ){.      buf[i
ef10: 5d 20 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20  ] = (v&0xFF);.  
ef20: 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20      v >>= 8;.   
ef30: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65   }.    return le
ef40: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
ef50: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
ef60: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
ef70: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
ef80: 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
ef90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
efa0: 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
efb0: 69 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  i:0).           
efc0: 20 20 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65    == sqlite3Vdbe
efd0: 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
efe0: 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
eff0: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
f000: 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c  n<=nBuf );.    l
f010: 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
f020: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d    memcpy(buf, pM
f030: 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
f040: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
f050: 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
f060: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d       len += pMem
f070: 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 69 66 28  ->u.i;.      if(
f080: 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20 20 20   len>nBuf ){.   
f090: 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75 66 3b       len = nBuf;
f0a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
f0b0: 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65 6d 2d  emset(&buf[pMem-
f0c0: 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d 65 6d  >n], 0, len-pMem
f0d0: 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ->n);.    }.    
f0e0: 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a  return len;.  }.
f0f0: 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f  .  /* NULL or co
f100: 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a  nstants 0 or 1 *
f110: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
f120: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
f130: 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
f140: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
f150: 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
f160: 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
f170: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
f180: 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
f190: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
f1a0: 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
f1b0: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
f1c0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
f1d0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
f1e0: 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
f1f0: 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
f200: 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
f210: 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
f220: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f230: 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
f240: 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
f250: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f270: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
f280: 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
f290: 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
f2a0: 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
f2b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
f2c0: 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
f2d0: 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
f2e0: 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
f2f0: 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
f300: 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
f310: 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
f320: 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ULL */.      pMe
f330: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
f340: 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
f350: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
f360: 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20   1: { /* 1-byte 
f370: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
f380: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
f390: 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  i = (signed char
f3a0: 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 70  )buf[0];.      p
f3b0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f3c0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f3d0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
f3e0: 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
f3f0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f400: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
f410: 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65  ->u.i = (((signe
f420: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f430: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f440: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f450: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f460: 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
f470: 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
f480: 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
f490: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f4a0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
f4b0: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f4c0: 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 31  ])<<16) | (buf[1
f4d0: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d 3b 0a  ]<<8) | buf[2];.
f4e0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f4f0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
f500: 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
f510: 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
f520: 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
f530: 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
f540: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28     pMem->u.i = (
f550: 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62  buf[0]<<24) | (b
f560: 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75  uf[1]<<16) | (bu
f570: 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33  f[2]<<8) | buf[3
f580: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
f590: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f5a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a        return 4;.
f5b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
f5c0: 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69  : { /* 6-byte si
f5d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f5e0: 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 28 28        u64 x = ((
f5f0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
f600: 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31  [0])<<8) | buf[1
f610: 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79 20 3d  ];.      u32 y =
f620: 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20 7c 20   (buf[2]<<24) | 
f630: 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c 20 28  (buf[3]<<16) | (
f640: 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[4]<<8) | buf
f650: 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  [5];.      x = (
f660: 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20  x<<32) | y;.    
f670: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28    pMem->u.i = *(
f680: 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 70  i64*)&x;.      p
f690: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
f6a0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
f6b0: 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
f6c0: 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
f6d0: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
f6e0: 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
f6f0: 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
f700: 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
f710: 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20 20 20      u64 x;.     
f720: 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64 65 66   u32 y;.#if !def
f730: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
f740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
f750: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
f760: 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20 56 65  INT).      /* Ve
f770: 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
f780: 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
f790: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
f7a0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 20   the same.      
f7b0: 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20  ** byte order.  
f7c0: 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49  Or, that if SQLI
f7d0: 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
f7e0: 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20  64BIT_FLOAT is. 
f7f0: 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20       ** defined 
f800: 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61  that 64-bit floa
f810: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
f820: 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78  s really are mix
f830: 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e 64 69  ed.      ** endi
f840: 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  an..      */.   
f850: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
f860: 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30  u64 t1 = ((u64)0
f870: 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a  x3ff00000)<<32;.
f880: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
f890: 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
f8a0: 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20 74 32  .0;.      u64 t2
f8b0: 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73 77 61   = t1;.      swa
f8c0: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
f8d0: 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61 73 73  t(t2);.      ass
f8e0: 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d  ert( sizeof(r1)=
f8f0: 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d  =sizeof(t2) && m
f900: 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20  emcmp(&r1, &t2, 
f910: 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29  sizeof(r1))==0 )
f920: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
f930: 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29  x = (buf[0]<<24)
f940: 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20   | (buf[1]<<16) 
f950: 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20  | (buf[2]<<8) | 
f960: 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 79 20  buf[3];.      y 
f970: 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29 20 7c  = (buf[4]<<24) |
f980: 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20 7c 20   (buf[5]<<16) | 
f990: 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20 62 75  (buf[6]<<8) | bu
f9a0: 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20 3d 20  f[7];.      x = 
f9b0: 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20  (x<<32) | y;.   
f9c0: 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
f9d0: 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20  pe==6 ){.       
f9e0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
f9f0: 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20  64*)&x;.        
fa00: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
fa10: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d 65 6c  M_Int;.      }el
fa20: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
fa30: 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
fa40: 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
fa50: 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  >r)==8 );.      
fa60: 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
fa70: 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20  nFloat(x);.     
fa80: 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
fa90: 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  >r, &x, sizeof(x
faa0: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  ));.        pMem
fab0: 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
fac0: 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20  3IsNaN(pMem->r) 
fad0: 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
fae0: 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  _Real;.      }. 
faf0: 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20       return 8;. 
fb00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a     }.    case 8:
fb10: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30      /* Integer 0
fb20: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20   */.    case 9: 
fb30: 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20  {  /* Integer 1 
fb40: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
fb50: 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65  .i = serial_type
fb60: 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  -8;.      pMem->
fb70: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
fb80: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
fb90: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
fba0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
fbb0: 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  len = (serial_ty
fbc0: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
fbd0: 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
fbe0: 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
fbf0: 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  m->n = len;.    
fc00: 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
fc10: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
fc20: 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a  al_type&0x01 ){.
fc30: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
fc40: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20  ags = MEM_Str | 
fc50: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20  MEM_Ephem;.     
fc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
fc70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
fc80: 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45 70 68  M_Blob | MEM_Eph
fc90: 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
fca0: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
fcb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
fcc0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69   0;.}.../*.** Gi
fcd0: 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
fce0: 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
fcf0: 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
fd00: 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a 20 72  , parse the.** r
fd10: 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55 6e 70  ecord into a Unp
fd20: 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
fd30: 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 61  cture.  Return a
fd40: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
fd50: 68 61 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  hat structure..*
fd60: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
fd70: 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68 74 20   function might 
fd80: 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63 65 20  provide szSpace 
fd90: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
fda0: 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53 70 61  ** space at pSpa
fdb0: 63 65 2e 20 20 54 68 69 73 20 73 70 61 63 65 20  ce.  This space 
fdc0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 68  can be used to h
fdd0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
fde0: 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64 52 65  .** VDbeParsedRe
fdf0: 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
fe00: 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e  f it is large en
fe10: 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69 73 0a  ough.  If it is.
fe20: 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f 75 67  ** not big enoug
fe30: 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62 74 61  h, space is obta
fe40: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
fe50: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3_malloc()..**.*
fe60: 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73  * The returned s
fe70: 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c 64 20  tructure should 
fe80: 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61 20 63  be closed by a c
fe90: 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  all to.** sqlite
fea0: 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
feb0: 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a 2f 20  kedRecord()..*/ 
fec0: 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
fed0: 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f  *sqlite3VdbeReco
fee0: 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
fef0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
ff00: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
ff10: 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
ff20: 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
ff30: 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
ff40: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
ff50: 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
ff60: 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
ff70: 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
ff80: 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
ff90: 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
ffa0: 64 52 65 63 6f 72 64 20 2a 70 53 70 61 63 65 2c  dRecord *pSpace,
ffb0: 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62  /* Space availab
ffc0: 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73 75 6c  le to hold resul
ffd0: 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ting object */. 
ffe0: 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20   int szSpace    
fff0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10000 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62  of pSpace[] in b
10010 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ytes */.){.  con
10020 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
10030 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
10040 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
10050 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64  pKey;.  Unpacked
10060 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69 6e 74  Record *p;.  int
10070 20 6e 42 79 74 65 2c 20 64 3b 0a 20 20 75 33 32   nByte, d;.  u32
10080 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b 20 20   idx;.  u16 u;  
10090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
100a0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
100b0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
100c0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
100d0 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  Mem;.  .  assert
100e0 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e 73 69  ( sizeof(Mem)>si
100f0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 6e 42  zeof(*p) );.  nB
10100 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d 65 6d  yte = sizeof(Mem
10110 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
10120 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20 6e 42  eld+2);.  if( nB
10130 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20  yte>szSpace ){. 
10140 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62     p = sqlite3Db
10150 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
10160 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
10170 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
10180 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e  eturn 0;.    p->
10190 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44  flags = UNPACKED
101a0 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50  _NEED_FREE | UNP
101b0 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52  ACKED_NEED_DESTR
101c0 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OY;.  }else{.   
101d0 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20   p = pSpace;.   
101e0 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41   p->flags = UNPA
101f0 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
10200 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  Y;.  }.  p->pKey
10210 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
10220 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
10230 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
10240 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  + 1;.  p->aMem =
10250 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a 29   pMem = &((Mem*)
10260 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20 67  p)[1];.  idx = g
10270 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c  etVarint32(aKey,
10280 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73   szHdr);.  d = s
10290 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20  zHdr;.  u = 0;. 
102a0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
102b0 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64  r && u<p->nField
102c0 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
102d0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
102e0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
102f0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
10300 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
10310 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71  f( d>=nKey && sq
10320 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10330 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
10340 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  pe)>0 ) break;. 
10350 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
10360 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
10370 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
10380 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70  yInfo->db;.    p
10390 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a  Mem->flags = 0;.
103a0 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
103b0 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
103c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
103d0 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
103e0 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
103f0 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
10400 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73     u++;.  }.  as
10410 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
10420 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
10430 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
10440 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
10450 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  *)p;.}../*.** Th
10460 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74 72  is routine destr
10470 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52 65  oys a UnpackedRe
10480 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76  cord object.*/.v
10490 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  oid sqlite3VdbeD
104a0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
104b0 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  ord(UnpackedReco
104c0 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
104d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  ){.    if( p->fl
104e0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e  ags & UNPACKED_N
104f0 45 45 44 5f 44 45 53 54 52 4f 59 20 29 7b 0a 20  EED_DESTROY ){. 
10500 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
10510 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20    Mem *pMem;.   
10520 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d     for(i=0, pMem
10530 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e  =p->aMem; i<p->n
10540 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d  Field; i++, pMem
10550 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10560 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29   pMem->zMalloc )
10570 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10580 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
10590 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  e(pMem);.       
105a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
105b0 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  .    if( p->flag
105c0 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45  s & UNPACKED_NEE
105d0 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 20 20  D_FREE ){.      
105e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
105f0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
10600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
10610 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10620 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
10630 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
10640 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
10650 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
10660 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
10670 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
10680 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
10690 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
106a0 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
106b0 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
106c0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
106d0 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
106e0 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
106f0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
10700 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
10710 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
10720 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
10730 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42  pcode of the VDB
10740 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a  E.  The pPKey2.*
10750 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  * key must be a 
10760 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20  parsed key such 
10770 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
10780 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50  .** sqlite3VdbeP
10790 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a  arseRecord..**.*
107a0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
107b0 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
107c0 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
107d0 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
107e0 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77 69 74  ..** The key wit
107f0 68 20 66 65 77 65 72 20 66 69 65 6c 64 73 20 69  h fewer fields i
10800 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70 61 72  s usually compar
10810 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  es less than the
10820 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65 79 2e   .** longer key.
10830 20 20 48 6f 77 65 76 65 72 20 69 66 20 74 68 65    However if the
10840 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45   UNPACKED_INCRKE
10850 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b 65 79  Y flags in pPKey
10860 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e 64 20  2 is set.** and 
10870 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69  the common prefi
10880 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74  xes are equal, t
10890 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65 73 73  hen key1 is less
108a0 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f   than key2..** O
108b0 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45  r if the UNPACKE
108c0 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58 20 66  D_MATCH_PREFIX f
108d0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
108e0 68 65 20 70 72 65 66 69 78 65 73 20 61 72 65 0a  he prefixes are.
108f0 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 74  ** equal, then t
10900 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f 6e 73  he keys are cons
10910 69 64 65 72 65 64 20 74 6f 20 62 65 20 65 71 75  idered to be equ
10920 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20 70 61  al and.** the pa
10930 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65 20 63  rts beyond the c
10940 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61 72 65  ommon prefix are
10950 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
10960 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f  If the UNPACKED_
10970 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66 6c 61  IGNORE_ROWID fla
10980 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  g is set, then t
10990 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 0a  he last byte of.
109a0 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
109b0 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f 72 65   pKey1 is ignore
109c0 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
109d0 64 20 74 68 61 74 20 70 4b 65 79 31 20 69 73 0a  d that pKey1 is.
109e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 2c  ** an index key,
109f0 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73 20 77   and thus ends w
10a00 69 74 68 20 61 20 72 6f 77 69 64 20 76 61 6c 75  ith a rowid valu
10a10 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62 79 74  e.  The last byt
10a20 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65 61 64  e.** of the head
10a30 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66 6f 72  er will therefor
10a40 65 20 62 65 20 74 68 65 20 73 65 72 69 61 6c 20  e be the serial 
10a50 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
10a60 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31 2c 20  d:.** one of 1, 
10a70 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c 20 38  2, 3, 4, 5, 6, 8
10a80 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69 6e 74  , or 9 - the int
10a90 65 67 65 72 20 73 65 72 69 61 6c 20 74 79 70 65  eger serial type
10aa0 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69 61 6c  s..** The serial
10ab0 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 69 6e   type of the fin
10ac0 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20 61 6c  al rowid will al
10ad0 77 61 79 73 20 62 65 20 61 20 73 69 6e 67 6c 65  ways be a single
10ae0 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69 67 6e   byte..** By ign
10af0 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73 74 20  oring this last 
10b00 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
10b10 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74 68 65  er, we force the
10b20 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 74   comparison.** t
10b30 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72 6f 77  o ignore the row
10b40 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
10b50 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71   key1..*/.int sq
10b60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
10b70 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
10b80 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
10b90 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20  *pKey1, /* Left 
10ba0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
10bb0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
10bc0 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20         /* Right 
10bd0 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  key */.){.  int 
10be0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
10bf0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
10c00 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
10c10 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
10c20 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
10c30 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
10c40 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
10c50 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
10c60 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
10c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10c80 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
10c90 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
10ca0 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64   0;.  int nField
10cb0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
10cc0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
10cd0 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
10ce0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
10cf0 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
10d00 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
10d10 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
10d20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
10d30 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
10d40 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
10d50 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
10d60 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
10d70 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73  db;.  mem1.flags
10d80 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61   = 0;.  mem1.zMa
10d90 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69  lloc = 0;.  .  i
10da0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
10db0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
10dc0 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
10dd0 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
10de0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
10df0 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a  IGNORE_ROWID ){.
10e00 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20      szHdr1--;.  
10e10 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  }.  nField = pKe
10e20 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
10e30 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
10e40 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
10e50 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
10e60 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
10e70 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
10e80 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
10e90 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
10ea0 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
10eb0 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
10ec0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
10ed0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
10ee0 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
10ef0 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
10f00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
10f10 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
10f20 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
10f30 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
10f40 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
10f50 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
10f60 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
10f70 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
10f80 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
10f90 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
10fa0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
10fb0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
10fc0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
10fd0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
10fe0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
10ff0 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11010 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
11020 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
11030 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
11040 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
11050 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
11060 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  ++;.  }.  if( me
11070 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m1.zMalloc ) sql
11080 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
11090 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 69 66  se(&mem1);..  if
110a0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ( rc==0 ){.    /
110b0 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61  * rc==0 here mea
110c0 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74  ns that one of t
110d0 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20  he keys ran out 
110e0 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20  of fields and.  
110f0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
11100 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
11110 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
11120 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44   If the UNPACKED
11130 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a 2a 20  _INCRKEY.    ** 
11140 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
11150 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69 65 20  n break the tie 
11160 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65 79 32  by treating key2
11170 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 20 20   as larger..    
11180 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 4b 45  ** If the UPACKE
11190 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 66  D_PREFIX_MATCH f
111a0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
111b0 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d 6d 6f   keys with commo
111c0 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20 20 2a  n prefixes.    *
111d0 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  * are considered
111e0 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f   to be equal.  O
111f0 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f  therwise, the lo
11200 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20  nger key is the 
11210 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20  .    ** larger. 
11220 20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20   As it happens, 
11230 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20  the pPKey2 will 
11240 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f  always be the lo
11250 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66 20 74  nger.    ** if t
11260 68 65 72 65 20 69 73 20 61 20 64 69 66 66 65 72  here is a differ
11270 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ence..    */.   
11280 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c 61   if( pPKey2->fla
11290 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 4e  gs & UNPACKED_IN
112a0 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20 20 72  CRKEY ){.      r
112b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  c = -1;.    }els
112c0 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66 6c  e if( pPKey2->fl
112d0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 50  ags & UNPACKED_P
112e0 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b 0a 20  REFIX_MATCH ){. 
112f0 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
11300 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ==0 */.    }else
11310 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64 72 31   if( idx1<szHdr1
11320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31   ){.      rc = 1
11330 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
11340 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
11350 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b  ortOrder && i<pK
11360 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20  eyInfo->nField. 
11370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
11380 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
11390 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
113a0 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20  rc = -rc;.  }.. 
113b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 0a   return rc;.}. .
113c0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
113d0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
113e0 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
113f0 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
11400 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
11410 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
11420 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
11430 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
11440 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
11450 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
11460 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
11470 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
11480 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
11490 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
114a0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
114b0 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
114c0 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
114d0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
114e0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
114f0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
11500 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11510 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
11520 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
11530 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
11540 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
11550 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
11560 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11570 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
11580 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69  em m, v;..  sqli
11590 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
115a0 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
115b0 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  ;.  if( nCellKey
115c0 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
115d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
115e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 2e 66  _BKPT;.  }.  m.f
115f0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e 64 62  lags = 0;.  m.db
11600 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f   = 0;.  m.zMallo
11610 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  c = 0;.  rc = sq
11620 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
11630 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e  Btree(pCur, 0, n
11640 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
11650 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11670 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
11680 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
11690 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67 65  Hdr);.  (void)ge
116a0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
116b0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
116c0 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c 65 6e 52  peRowid);.  lenR
116d0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64  owid = sqlite3Vd
116e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
116f0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 73 71  typeRowid);.  sq
11700 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11710 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
11720 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
11730 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
11740 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
11750 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
11760 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
11770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11780 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
11790 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69  the key of the i
117a0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20  ndex entry that 
117b0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69  cursor pC is poi
117c0 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  nt to against.**
117d0 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
117e0 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67  in pKey (of leng
117f0 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65  th nKey).  Write
11800 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
11810 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
11820 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
11830 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
11840 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
11850 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
11860 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65  greater than pKe
11870 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
11880 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
11890 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65  .**.** pKey is e
118a0 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
118b0 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
118c0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
118d0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
118e0 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
118f0 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
11900 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
11910 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
11920 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
11930 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
11940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
11950 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
11960 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
11970 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
11980 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
11990 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
119a0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70   key..**.** pUnp
119b0 61 63 6b 65 64 20 6d 61 79 20 62 65 20 61 6e 20  acked may be an 
119c0 75 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  unpacked version
119d0 20 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20   of pKey,nKey.  
119e0 49 66 20 70 55 6e 70 61 63 6b 65 64 20 69 73 0a  If pUnpacked is.
119f0 2a 2a 20 73 75 70 70 6c 69 65 64 20 69 74 20 69  ** supplied it i
11a00 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
11a10 6f 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 0a 2a 2f  of pKey,nKey..*/
11a20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11a30 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20  IdxKeyCompare(. 
11a40 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11a60 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
11a70 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
11a80 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
11a90 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f  d *pUnpacked,  /
11aa0 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69  * Unpacked versi
11ab0 6f 6e 20 6f 66 20 70 4b 65 79 20 61 6e 64 20 6e  on of pKey and n
11ac0 4b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  Key */.  int *re
11ad0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
11ae0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
11af0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
11b00 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
11b10 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
11b20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
11b30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
11b40 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
11b50 65 6d 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  em m;..  sqlite3
11b60 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
11b70 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
11b80 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
11b90 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
11ba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11bb0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e  ITE_OK;.  }.  m.
11bc0 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67  db = 0;.  m.flag
11bd0 73 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c  s = 0;.  m.zMall
11be0 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  oc = 0;.  rc = s
11bf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
11c00 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
11c10 6f 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c  or, 0, nCellKey,
11c20 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
11c30 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
11c40 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
11c50 28 20 70 55 6e 70 61 63 6b 65 64 2d 3e 66 6c 61  ( pUnpacked->fla
11c60 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 49 47  gs & UNPACKED_IG
11c70 4e 4f 52 45 5f 52 4f 57 49 44 20 29 3b 0a 20 20  NORE_ROWID );.  
11c80 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
11c90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
11ca0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
11cb0 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
11cc0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
11cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11ce0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
11d00 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
11d10 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
11d20 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
11d30 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
11d40 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
11d50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
11d60 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
11d70 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
11d80 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
11d90 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
11da0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11db0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
11dc0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
11dd0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
11de0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
11df0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
11e00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
11e10 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
11e20 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
11e30 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
11e40 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
11e50 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
11e60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
11e70 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
11e80 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
11e90 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
11ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
11eb0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
11ec0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
11ed0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
11ee0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
11ef0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
11f00 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
11f10 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
11f20 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
11f30 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
11f40 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
11f50 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
11f60 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
11f70 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
11f80 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
11f90 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
11fa0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
11fb0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
11fc0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
11fd0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
11fe0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
11ff0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
12000 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
12010 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
12020 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
12030 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
12040 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12050 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
12060 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
12070 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
12080 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
12090 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
120a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
120b0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
120c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
120d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
120e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
120f0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
12100 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
12110 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
12120 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a        turn v->db;.}.