/ Hex Artifact Content
Login

Artifact 433be5e2fff724d3a0e086d15d5597a8ef85bb29:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 33 38 35 20 32  eaux.c,v 1.385 2
02c0: 30 30 38 2f 30 36 2f 30 36 20 31 31 3a 31 31 3a  008/06/06 11:11:
02d0: 32 37 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  27 danielk1977 E
02e0: 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  xp $.*/.#include
02f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23   "sqliteInt.h".#
0300: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0310: 3e 0a 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65  >.#include "vdbe
0320: 49 6e 74 2e 68 22 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  Int.h"..../*.** 
0330: 57 68 65 6e 20 64 65 62 75 67 67 69 6e 67 20 74  When debugging t
0340: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
0350: 72 20 69 6e 20 61 20 73 79 6d 62 6f 6c 69 63 20  r in a symbolic 
0360: 64 65 62 75 67 67 65 72 2c 20 6f 6e 65 20 63 61  debugger, one ca
0370: 6e 0a 2a 2a 20 73 65 74 20 74 68 65 20 73 71 6c  n.** set the sql
0380: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0390: 63 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20  ce to 1 and all 
03a0: 6f 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20  opcodes will be 
03b0: 70 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68  printed.** as th
03c0: 65 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ey are added to 
03d0: 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
03e0: 73 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 64 65  stream..*/.#ifde
03f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69  f SQLITE_DEBUG.i
0400: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
0410: 64 6f 70 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  dopTrace = 0;.#e
0420: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ndif.../*.** Cre
0430: 61 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61  ate a new virtua
0440: 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
0450: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
0460: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 73 71  te3VdbeCreate(sq
0470: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
0480: 62 65 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  be *p;.  p = sql
0490: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
04a0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65  (db, sizeof(Vdbe
04b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
04c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d  ) return 0;.  p-
04d0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 28 20  >db = db;.  if( 
04e0: 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20  db->pVdbe ){.   
04f0: 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65   db->pVdbe->pPre
0500: 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  v = p;.  }.  p->
0510: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 64 62  pNext = db->pVdb
0520: 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 3d 20  e;.  p->pPrev = 
0530: 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  0;.  db->pVdbe =
0540: 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d   p;.  p->magic =
0550: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
0560: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
0570: 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20  ./*.** Remember 
0580: 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66  the SQL string f
0590: 6f 72 20 61 20 70 72 65 70 61 72 65 64 20 73 74  or a prepared st
05a0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
05b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 53   sqlite3VdbeSetS
05c0: 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  ql(Vdbe *p, cons
05d0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
05e0: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
05f0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
0600: 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a  ( p->zSql==0 );.
0610: 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69    p->zSql = sqli
0620: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e  te3DbStrNDup(p->
0630: 64 62 2c 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a  db, z, n);.}../*
0640: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53  .** Return the S
0650: 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  QL associated wi
0660: 74 68 20 61 20 70 72 65 70 61 72 65 64 20 73 74  th a prepared st
0670: 61 74 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74  atement.*/.const
0680: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73   char *sqlite3_s
0690: 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ql(sqlite3_stmt 
06a0: 2a 70 53 74 6d 74 29 7b 0a 20 20 72 65 74 75 72  *pStmt){.  retur
06b0: 6e 20 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74  n ((Vdbe *)pStmt
06c0: 29 2d 3e 7a 53 71 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  )->zSql;.}../*.*
06d0: 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65  * Swap all conte
06e0: 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56  nt between two V
06f0: 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a  DBE structures..
0700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0710: 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41  dbeSwap(Vdbe *pA
0720: 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56  , Vdbe *pB){.  V
0730: 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a  dbe tmp, *pTmp;.
0740: 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20    char *zTmp;.  
0750: 69 6e 74 20 6e 54 6d 70 3b 0a 20 20 74 6d 70 20  int nTmp;.  tmp 
0760: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0770: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0780: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
0790: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
07a0: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
07b0: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
07c0: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
07d0: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
07e0: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
07f0: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0800: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
0810: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
0820: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
0830: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
0840: 20 20 6e 54 6d 70 20 3d 20 70 41 2d 3e 6e 53 71    nTmp = pA->nSq
0850: 6c 3b 0a 20 20 70 41 2d 3e 6e 53 71 6c 20 3d 20  l;.  pA->nSql = 
0860: 70 42 2d 3e 6e 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->nSql;.  pB->
0870: 6e 53 71 6c 20 3d 20 6e 54 6d 70 3b 0a 7d 0a 0a  nSql = nTmp;.}..
0880: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
0890: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  BUG./*.** Turn t
08a0: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
08b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
08c0: 56 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a  VdbeTrace(Vdbe *
08d0: 70 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b  p, FILE *trace){
08e0: 0a 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72  .  p->trace = tr
08f0: 61 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ace;.}.#endif../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74 61 69  o that it contai
0930: 6e 73 20 61 74 20 6c 65 61 73 74 20 4e 0a 2a 2a  ns at least N.**
0940: 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   elements..**.**
0950: 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65   If an out-of-me
0960: 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63 75 72  mory error occur
0970: 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69 6e 67  s while resizing
0980: 20 74 68 65 20 61 72 72 61 79 2c 0a 2a 2a 20 56   the array,.** V
0990: 64 62 65 2e 61 4f 70 20 61 6e 64 20 56 64 62 65  dbe.aOp and Vdbe
09a0: 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e  .nOpAlloc remain
09b0: 20 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73   unchanged (this
09c0: 20 69 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61   is so that.** a
09d0: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
09e0: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
09f0: 20 62 65 20 63 6f 72 72 65 63 74 6c 79 20 64 65   be correctly de
0a00: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61 6c 6f  allocated.** alo
0a10: 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ng with the rest
0a20: 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a 2a   of the Vdbe)..*
0a30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
0a40: 73 69 7a 65 4f 70 41 72 72 61 79 28 56 64 62 65  sizeOpArray(Vdbe
0a50: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 56   *p, int N){.  V
0a60: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 70  dbeOp *pNew;.  p
0a70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
0a80: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
0a90: 3e 61 4f 70 2c 20 4e 2a 73 69 7a 65 6f 66 28 4f  >aOp, N*sizeof(O
0aa0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20  p));.  if( pNew 
0ab0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c  ){.    p->nOpAll
0ac0: 6f 63 20 3d 20 4e 3b 0a 20 20 20 20 70 2d 3e 61  oc = N;.    p->a
0ad0: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d  Op = pNew;.  }.}
0ae0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
0af0: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  w instruction to
0b00: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73   the list of ins
0b10: 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e  tructions curren
0b20: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  t in the.** VDBE
0b30: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  .  Return the ad
0b40: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77  dress of the new
0b50: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
0b60: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a  .** Parameters:.
0b70: 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20  **.**    p      
0b80: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
0b90: 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a   to the VDBE.**.
0ba0: 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20  **    op        
0bb0: 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65        The opcode
0bc0: 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75   for this instru
0bd0: 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70  ction.**.**    p
0be0: 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f  1, p2, p3      O
0bf0: 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73  perands.**.** Us
0c00: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
0c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20  eResolveLabel() 
0c20: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20  function to fix 
0c30: 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a  an address and.*
0c40: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
0c50: 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63  eChangeP4() func
0c60: 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74  tion to change t
0c70: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
0c80: 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a  P4.** operand..*
0c90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
0ca0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
0cb0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
0cc0: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
0cd0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0ce0: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
0cf0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
0d00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
0d10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
0d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f    if( p->nOpAllo
0d30: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 73 69  c<=i ){.    resi
0d40: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
0d50: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
0d60: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
0d70: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
0d80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
0d90: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
0da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
0db0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  }.  }.  p->nOp++
0dc0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
0dd0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
0de0: 6f 64 65 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d  ode = op;.  pOp-
0df0: 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  >p5 = 0;.  pOp->
0e00: 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e  p1 = p1;.  pOp->
0e10: 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e  p2 = p2;.  pOp->
0e20: 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e  p3 = p3;.  pOp->
0e30: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  p4.p = 0;.  pOp-
0e40: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
0e50: 55 53 45 44 3b 0a 20 20 70 2d 3e 65 78 70 69 72  USED;.  p->expir
0e60: 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ed = 0;.#ifdef S
0e70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 4f  QLITE_DEBUG.  pO
0e80: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  p->zComment = 0;
0e90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64  .  if( sqlite3Vd
0ea0: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 20 73  beAddopTrace ) s
0eb0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
0ec0: 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  p(0, i, &p->aOp[
0ed0: 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  i]);.#endif.#ifd
0ee0: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
0ef0: 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20    pOp->cycles = 
0f00: 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20  0;.  pOp->cnt = 
0f10: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
0f20: 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn i;.}.int sqli
0f30: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64  te3VdbeAddOp0(Vd
0f40: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a  be *p, int op){.
0f50: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0f60: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
0f70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e  , 0, 0, 0);.}.in
0f80: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
0f90: 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op1(Vdbe *p, int
0fa0: 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20   op, int p1){.  
0fb0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
0fc0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
0fd0: 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74  p1, 0, 0);.}.int
0fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0ff0: 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p2(Vdbe *p, int 
1000: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
1010: 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  p2){.  return sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1030: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30  p, op, p1, p2, 0
1040: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  );.}.../*.** Add
1050: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1060: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1070: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1080: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1090: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
10a0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
10b0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
10c0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
10e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10f0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
1100: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
1110: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
1120: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1130: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
1140: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
1150: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
1160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1170: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
1180: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1190: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
11a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
11b0: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
11c0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
11d0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
11e0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
11f0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1200: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
1210: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1220: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
1230: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
1240: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
1250: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
1260: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f  ymbolic label fo
1270: 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  r an instruction
1280: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
1290: 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54   be.** coded.  T
12a0: 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  he symbolic labe
12b0: 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  l is really just
12c0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
12d0: 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65  er.  The.** labe
12e0: 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  l can be used as
12f0: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66   the P2 value of
1300: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20   an operation.  
1310: 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74  Later, when.** t
1320: 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f  he label is reso
1330: 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66  lved to a specif
1340: 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20  ic address, the 
1350: 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a  VDBE will scan.*
1360: 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70  * through its op
1370: 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  eration list and
1380: 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75   change all valu
1390: 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d  es of P2 which m
13a0: 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65  atch.** the labe
13b0: 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c  l into the resol
13c0: 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ved address..**.
13d0: 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77  ** The VDBE know
13e0: 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75  s that a P2 valu
13f0: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63  e is a label bec
1400: 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a  ause labels are.
1410: 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69  ** always negati
1420: 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73  ve and P2 values
1430: 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20   are suppose to 
1440: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  be non-negative.
1450: 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67  .** Hence, a neg
1460: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69  ative P2 value i
1470: 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68  s a label that h
1480: 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73  as yet to be res
1490: 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  olved..**.** Zer
14a0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
14b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14c0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
14d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56  3VdbeMakeLabel(V
14e0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
14f0: 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  ;.  i = p->nLabe
1500: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l++;.  assert( p
1510: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1520: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
1530: 28 20 69 3e 3d 70 2d 3e 6e 4c 61 62 65 6c 41 6c  ( i>=p->nLabelAl
1540: 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c  loc ){.    p->nL
1550: 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  abelAlloc = p->n
1560: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 31  LabelAlloc*2 + 1
1570: 30 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  0;.    p->aLabel
1580: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
1590: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
15a0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20   p->aLabel,.    
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73  p->nLabelAlloc*s
15e0: 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b  izeof(p->aLabel[
15f0: 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0]));.  }.  if( 
1600: 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20  p->aLabel ){.   
1610: 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20   p->aLabel[i] = 
1620: 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  -1;.  }.  return
1630: 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   -1-i;.}../*.** 
1640: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
1650: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
1660: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
1670: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
1680: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
1690: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
16a0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
16b0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
16c0: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
16d0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
16e0: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
16f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
1700: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
1710: 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 6e 74  p, int x){.  int
1720: 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73   j = -1-x;.  ass
1730: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1740: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1750: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e 3d 30  ;.  assert( j>=0
1760: 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c 20   && j<p->nLabel 
1770: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62  );.  if( p->aLab
1780: 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61  el ){.    p->aLa
1790: 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e 4f 70 3b  bel[j] = p->nOp;
17a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  .  }.}../*.** Lo
17b0: 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  op through the p
17c0: 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66  rogram looking f
17d0: 6f 72 20 50 32 20 76 61 6c 75 65 73 20 74 68 61  or P2 values tha
17e0: 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 0a 2a  t are negative.*
17f0: 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75  * on jump instru
1800: 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 73 75  ctions.  Each su
1810: 63 68 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  ch value is a la
1820: 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 20 74 68  bel.  Resolve th
1830: 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 20 73 65  e.** label by se
1840: 74 74 69 6e 67 20 74 68 65 20 50 32 20 76 61 6c  tting the P2 val
1850: 75 65 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63  ue to its correc
1860: 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  t non-zero value
1870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1880: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6f  tine is called o
1890: 6e 63 65 20 61 66 74 65 72 20 61 6c 6c 20 6f 70  nce after all op
18a0: 63 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 20  codes have been 
18b0: 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  inserted..**.** 
18c0: 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 78 46 75  Variable *pMaxFu
18d0: 6e 63 41 72 67 73 20 69 73 20 73 65 74 20 74 6f  ncArgs is set to
18e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c   the maximum val
18f0: 75 65 20 6f 66 20 61 6e 79 20 50 32 20 61 72 67  ue of any P2 arg
1900: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20  ument .** to an 
1910: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f  OP_Function, OP_
1920: 41 67 67 53 74 65 70 20 6f 72 20 4f 50 5f 56 46  AggStep or OP_VF
1930: 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e 20 54 68  ilter opcode. Th
1940: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 0a 2a  is is used by .*
1950: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  * sqlite3VdbeMak
1960: 65 52 65 61 64 79 28 29 20 74 6f 20 73 69 7a 65  eReady() to size
1970: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
1980: 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54  ] array..**.** T
1990: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
19a0: 20 64 6f 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77   does the follow
19b0: 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ing optimization
19c0: 3a 20 20 49 74 20 73 63 61 6e 73 20 66 6f 72 0a  :  It scans for.
19d0: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
19e0: 74 68 61 74 20 6d 69 67 68 74 20 63 61 75 73 65  that might cause
19f0: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
1a00: 6c 62 61 63 6b 2e 20 20 53 75 63 68 20 69 6e 73  lback.  Such ins
1a10: 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  tructions.** are
1a20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  :.**.**   *  OP_
1a30: 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c  Halt with P1=SQL
1a40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
1a50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
1a60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
1a70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
1a80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
1a90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 49  _VRename.**.** I
1aa0: 66 20 6e 6f 20 73 75 63 68 20 69 6e 73 74 72 75  f no such instru
1ab0: 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20  ction is found, 
1ac0: 74 68 65 6e 20 65 76 65 72 79 20 53 74 61 74 65  then every State
1ad0: 6d 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  ment instruction
1ae0: 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67 65 64 20   .** is changed 
1af0: 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49 6e 20 74  to a Noop.  In t
1b00: 68 69 73 20 77 61 79 2c 20 77 65 20 61 76 6f 69  his way, we avoi
1b10: 64 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 73  d creating the s
1b20: 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20 6a 6f 75  tatement .** jou
1b30: 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e 65 63 65  rnal file unnece
1b40: 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ssarily..*/.stat
1b50: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50  ic void resolveP
1b60: 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c  2Values(Vdbe *p,
1b70: 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72   int *pMaxFuncAr
1b80: 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  gs){.  int i;.  
1b90: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 30  int nMaxArgs = 0
1ba0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  ;.  Op *pOp;.  i
1bb0: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d 3e  nt *aLabel = p->
1bc0: 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74 20 64 6f  aLabel;.  int do
1bd0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1be0: 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ack = 0;.  int h
1bf0: 61 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e  asStatementBegin
1c00: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1c10: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1c20: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1c30: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1c40: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1c50: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1c60: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1c70: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1c80: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
1c90: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1ca0: 3e 70 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >p5;.    }else i
1cb0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41 67  f( opcode==OP_Ag
1cc0: 67 53 74 65 70 20 0a 23 69 66 6e 64 65 66 20 53  gStep .#ifndef S
1cd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1ce0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
1cf0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
1d00: 70 64 61 74 65 0a 23 65 6e 64 69 66 0a 20 20 20  pdate.#endif.   
1d10: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1d20: 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29  p->p2>nMaxArgs )
1d30: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1d40: 3e 70 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  >p2;.    }.    i
1d50: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  f( opcode==OP_Ha
1d60: 6c 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  lt ){.      if( 
1d70: 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f  pOp->p1==SQLITE_
1d80: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
1d90: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20  p->p2==OE_Abort 
1da0: 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 65 73 53  ){.        doesS
1db0: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1dc0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1dd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1de0: 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74  de==OP_Statement
1df0: 20 29 7b 0a 20 20 20 20 20 20 68 61 73 53 74 61   ){.      hasSta
1e00: 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b  tementBegin = 1;
1e10: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1e20: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
1e30: 79 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73 53  y ){.      doesS
1e40: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
1e50: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
1e60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e70: 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
1e80: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1e90: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
1ea0: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b  e==OP_VRename ){
1eb0: 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74 65  .      doesState
1ec0: 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  mentRollback = 1
1ed0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1ee0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74  opcode==OP_VFilt
1ef0: 65 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  er ){.      int 
1f00: 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
1f10: 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33   p->nOp - i >= 3
1f20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f30: 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65  ( pOp[-1].opcode
1f40: 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a  ==OP_Integer );.
1f50: 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31        n = pOp[-1
1f60: 5d 2e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ].p1;.      if( 
1f70: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
1f80: 78 41 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69  xArgs = n;.#endi
1f90: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  f.    }..    if(
1fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f   sqlite3VdbeOpco
1fb0: 64 65 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70  deHasProperty(op
1fc0: 63 6f 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50  code, OPFLG_JUMP
1fd0: 29 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  ) && pOp->p2<0 )
1fe0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ff0: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c  -1-pOp->p2<p->nL
2000: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f  abel );.      pO
2010: 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d  p->p2 = aLabel[-
2020: 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20  1-pOp->p2];.    
2030: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
2040: 66 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b  free(p->aLabel);
2050: 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  .  p->aLabel = 0
2060: 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  ;..  *pMaxFuncAr
2070: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a  gs = nMaxArgs;..
2080: 20 20 2f 2a 20 49 66 20 77 65 20 6e 65 76 65 72    /* If we never
2090: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   rollback a stat
20a0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
20b0: 6e 2c 20 74 68 65 6e 20 73 74 61 74 65 6d 65 6e  n, then statemen
20c0: 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  t.  ** transacti
20d0: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ons are not need
20e0: 65 64 2e 20 20 53 6f 20 63 68 61 6e 67 65 20 65  ed.  So change e
20f0: 76 65 72 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e  very OP_Statemen
2100: 74 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e  t.  ** opcode in
2110: 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20  to an OP_Noop.  
2120: 54 68 69 73 20 61 76 6f 69 64 20 61 20 63 61 6c  This avoid a cal
2130: 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
2140: 65 6e 45 78 63 6c 75 73 69 76 65 28 29 0a 20 20  enExclusive().  
2150: 2a 2a 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  ** which can be 
2160: 65 78 70 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d  expensive on som
2170: 65 20 70 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a  e platforms..  *
2180: 2f 0a 20 20 69 66 28 20 68 61 73 53 74 61 74 65  /.  if( hasState
2190: 6d 65 6e 74 42 65 67 69 6e 20 26 26 20 21 64 6f  mentBegin && !do
21a0: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
21b0: 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 70  ack ){.    for(p
21c0: 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e  Op=p->aOp, i=p->
21d0: 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  nOp-1; i>=0; i--
21e0: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
21f0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2200: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
2210: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70  .        pOp->op
2220: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
2230: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
2250: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
2260: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2270: 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65  ction to be inse
2280: 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rted..*/.int sql
2290: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
22a0: 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ddr(Vdbe *p){.  
22b0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
22c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
22d0: 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  T );.  return p-
22e0: 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  >nOp;.}../*.** A
22f0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
2300: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
2310: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
2320: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68  tack.  Return th
2330: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20  e.** address of 
2340: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74  the first operat
2350: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e  ion added..*/.in
2360: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
2370: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20  OpList(Vdbe *p, 
2380: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c  int nOp, VdbeOpL
2390: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b  ist const *aOp){
23a0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
23b0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
23c0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
23d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
23e0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41   + nOp > p->nOpA
23f0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 72 65 73 69  lloc ){.    resi
2400: 7a 65 4f 70 41 72 72 61 79 28 70 2c 20 70 2d 3e  zeOpArray(p, p->
2410: 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f  nOpAlloc ? p->nO
2420: 70 41 6c 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f  pAlloc*2 : 1024/
2430: 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20  sizeof(Op));.   
2440: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b   assert( p->nOp+
2450: 6e 4f 70 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  nOp<=p->nOpAlloc
2460: 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   || p->db->mallo
2470: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20  cFailed );.  }. 
2480: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
2490: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
24a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
24b0: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
24c0: 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20   if( nOp>0 ){.  
24d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
24e0: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
24f0: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
2500: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
2510: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
2520: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
2530: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
2540: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
2550: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
2560: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
2570: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
2580: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
2590: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
25a0: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
25b0: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
25c0: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
25d0: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
25e0: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
25f0: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
2600: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
2610: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
2620: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
2630: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
2640: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
2650: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
2660: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
2670: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
2680: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
2690: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
26a0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
26b0: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
26c0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
26d0: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
26e0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
26f0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2700: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2710: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2720: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2730: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2740: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
2750: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2760: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
2770: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
2780: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
2790: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
27a0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
27b0: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
27c0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
27d0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
27e0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
27f0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2800: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2810: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2820: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2830: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2840: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
2850: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2860: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
2870: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
2880: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
2890: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
28a0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
28b0: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
28c0: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
28d0: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
28e0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
28f0: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
2900: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2910: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2920: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
2930: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2940: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2950: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2960: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
2970: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
2980: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2990: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
29a0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
29b0: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
29c0: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
29d0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
29e0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
29f0: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2a00: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2a10: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2a20: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
2a30: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2a40: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2a50: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
2a60: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2a70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2a80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2a90: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
2aa0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2ab0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2ac0: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2ad0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2ae0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2af0: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2b00: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2b10: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2b20: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2b40: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2b50: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2b60: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2b70: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2b80: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2b90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2ba0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2bb0: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2bc0: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
2bd0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2be0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2bf0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2c00: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
2c10: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70   );.    p->aOp[p
2c20: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61  ->nOp-1].p5 = va
2c30: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2c40: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
2c50: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2c60: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2c70: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2c80: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2c90: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2ca0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2cb0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2cc0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
2cd0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2ce0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2cf0: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
2d00: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
2d10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
2d20: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
2d30: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
2d40: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
2d50: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
2d60: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
2d70: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
2d80: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2d90: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
2da0: 6c 46 75 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65  lFunction(FuncDe
2db0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
2dc0: 70 44 65 66 20 26 26 20 28 70 44 65 66 2d 3e 66  pDef && (pDef->f
2dd0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
2de0: 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a  NC_EPHEM)!=0 ){.
2df0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e00: 28 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (pDef);.  }.}../
2e10: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
2e20: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
2e30: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2e40: 6f 69 64 20 66 72 65 65 50 34 28 69 6e 74 20 70  oid freeP4(int p
2e50: 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 33 29  4type, void *p3)
2e60: 7b 0a 20 20 69 66 28 20 70 33 20 29 7b 0a 20 20  {.  if( p3 ){.  
2e70: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
2e80: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
2e90: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
2ea0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
2eb0: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e     case P4_MPRIN
2ec0: 54 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  TF:.      case P
2ed0: 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20  4_DYNAMIC:.     
2ee0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
2ef0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
2f00: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a  KEYINFO_HANDOFF:
2f10: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
2f20: 65 33 5f 66 72 65 65 28 70 33 29 3b 0a 20 20 20  e3_free(p3);.   
2f30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f40: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
2f50: 34 5f 56 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20  4_VDBEFUNC: {.  
2f60: 20 20 20 20 20 20 56 64 62 65 46 75 6e 63 20 2a        VdbeFunc *
2f70: 70 56 64 62 65 46 75 6e 63 20 3d 20 28 56 64 62  pVdbeFunc = (Vdb
2f80: 65 46 75 6e 63 20 2a 29 70 33 3b 0a 20 20 20 20  eFunc *)p3;.    
2f90: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
2fa0: 6c 46 75 6e 63 74 69 6f 6e 28 70 56 64 62 65 46  lFunction(pVdbeF
2fb0: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
2fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2fd0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56  DeleteAuxData(pV
2fe0: 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20  dbeFunc, 0);.   
2ff0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3000: 65 28 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20  e(pVdbeFunc);.  
3010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3020: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
3030: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
3040: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
3050: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 28 46 75 6e  ralFunction((Fun
3060: 63 44 65 66 2a 29 70 33 29 3b 0a 20 20 20 20 20  cDef*)p3);.     
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3080: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
3090: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MEM: {.        s
30a0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
30b0: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
30c0: 70 33 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p3);.        bre
30d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
30e0: 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
30f0: 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 73  Change N opcodes
3100: 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 64   starting at add
3110: 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f 0a  r to No-ops..*/.
3120: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
3130: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
3140: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3150: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
3160: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  && p->aOp ){.   
3170: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
3180: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3190: 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29 7b 0a    while( N-- ){.
31a0: 20 20 20 20 20 20 66 72 65 65 50 34 28 70 4f 70        freeP4(pOp
31b0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
31c0: 34 2e 70 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  4.p);.      mems
31d0: 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f  et(pOp, 0, sizeo
31e0: 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20  f(pOp[0]));.    
31f0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
3200: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70  OP_Noop;.      p
3210: 4f 70 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Op++;.    }.  }.
3220: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
3230: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3240: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
3250: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
3260: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
3270: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
3280: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
3290: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
32a0: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
32b0: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
32c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
32d0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
32e0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
32f0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
3300: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
3310: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
3320: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
3330: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
3340: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
3350: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
3360: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
3370: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
3380: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3390: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
33a0: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
33b0: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
33c0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
33d0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
33e0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
33f0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
3400: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
3410: 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b  **.** If n==P4_K
3420: 45 59 49 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20  EYINFO it means 
3430: 74 68 61 74 20 7a 50 34 20 69 73 20 61 20 70 6f  that zP4 is a po
3440: 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e  inter to a KeyIn
3450: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  fo structure..**
3460: 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65 20   A copy is made 
3470: 6f 66 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  of the KeyInfo s
3480: 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 6d 65  tructure into me
3490: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
34a0: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
34b0: 6c 6c 6f 63 2c 20 74 6f 20 62 65 20 66 72 65 65  lloc, to be free
34c0: 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65 20  d when the Vdbe 
34d0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a  is finalized..**
34e0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48   n==P4_KEYINFO_H
34f0: 41 4e 44 4f 46 46 20 69 6e 64 69 63 61 74 65 73  ANDOFF indicates
3500: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
3510: 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74   to a KeyInfo st
3520: 72 75 63 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65  ructure.** store
3530: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74  d in memory that
3540: 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
3550: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
3560: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68  lite3_malloc. Th
3570: 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  e .** caller sho
3580: 75 6c 64 20 6e 6f 74 20 66 72 65 65 20 74 68 65  uld not free the
3590: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20   allocation, it 
35a0: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 77 68  will be freed wh
35b0: 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 0a 2a  en the Vdbe is.*
35c0: 2a 20 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20  * finalized..** 
35d0: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
35e0: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
35f0: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
3600: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
3610: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
3620: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
3630: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
3640: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
3650: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
3660: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
3670: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
3680: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
3690: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
36a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
36b0: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
36c0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
36d0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
36e0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
36f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
3700: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
3710: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
3720: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
3730: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
3740: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
3750: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3760: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3770: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3780: 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  >aOp==0 || p->db
3790: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
37a0: 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50  {.    if (n != P
37b0: 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20  4_KEYINFO) {.   
37c0: 20 20 20 66 72 65 65 50 34 28 6e 2c 20 28 76 6f     freeP4(n, (vo
37d0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
37e0: 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  4);.    }.    re
37f0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
3800: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
3810: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
3820: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
3830: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66  >nOp - 1;.    if
3840: 28 20 61 64 64 72 3c 30 20 29 20 72 65 74 75 72  ( addr<0 ) retur
3850: 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  n;.  }.  pOp = &
3860: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
3870: 66 72 65 65 50 34 28 70 4f 70 2d 3e 70 34 74 79  freeP4(pOp->p4ty
3880: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
3890: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
38a0: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
38b0: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
38c0: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
38d0: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
38e0: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
38f0: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
3900: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
3910: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
3920: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
3930: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 28 69 6e 74  pOp->p4.i = (int
3940: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
3950: 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65 6c  4type = n;.  }el
3960: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
3970: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
3980: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
3990: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
39a0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
39b0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
39c0: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
39d0: 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46  Info;.    int nF
39e0: 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20  ield, nByte;..  
39f0: 20 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79    nField = ((Key
3a00: 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65  Info*)zP4)->nFie
3a10: 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  ld;.    nByte = 
3a20: 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f  sizeof(*pKeyInfo
3a30: 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73  ) + (nField-1)*s
3a40: 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e  izeof(pKeyInfo->
3a50: 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65  aColl[0]) + nFie
3a60: 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  ld;.    pKeyInfo
3a70: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3a80: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20  c( nByte );.    
3a90: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
3aa0: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20   = pKeyInfo;.   
3ab0: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
3ac0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4b  .      memcpy(pK
3ad0: 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79  eyInfo, zP4, nBy
3ae0: 74 65 29 3b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  te);.      /* In
3af0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   the current imp
3b00: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 50 34 5f  lementation, P4_
3b10: 4b 45 59 49 4e 46 4f 20 69 73 20 6f 6e 6c 79 20  KEYINFO is only 
3b20: 65 76 65 72 20 75 73 65 64 20 6f 6e 0a 20 20 20  ever used on.   
3b30: 20 20 20 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74     ** KeyInfo st
3b40: 72 75 63 74 75 72 65 73 20 74 68 61 74 20 68 61  ructures that ha
3b50: 76 65 20 6e 6f 20 61 53 6f 72 74 4f 72 64 65 72  ve no aSortOrder
3b60: 20 63 6f 6d 70 6f 6e 65 6e 74 2e 20 20 45 6c 65   component.  Ele
3b70: 6d 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 77  ments.      ** w
3b80: 69 74 68 20 61 6e 20 61 53 6f 72 74 4f 72 64 65  ith an aSortOrde
3b90: 72 20 61 6c 77 61 79 73 20 75 73 65 20 50 34 5f  r always use P4_
3ba0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 2e  KEYINFO_HANDOFF.
3bb0: 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 0a 20    So we do not. 
3bc0: 20 20 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20       ** need to 
3bd0: 62 6f 74 68 65 72 20 77 69 74 68 20 64 75 70 6c  bother with dupl
3be0: 69 63 61 74 69 6e 67 20 74 68 65 20 61 53 6f 72  icating the aSor
3bf0: 74 4f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  tOrder. */.     
3c00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
3c10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3d 3d 30  o->aSortOrder==0
3c20: 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20   );.#if 0.      
3c30: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b 65  aSortOrder = pKe
3c40: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
3c50: 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 6f  r;.      if( aSo
3c60: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
3c70: 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f     pKeyInfo->aSo
3c80: 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 67  rtOrder = (unsig
3c90: 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 49  ned char*)&pKeyI
3ca0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c  nfo->aColl[nFiel
3cb0: 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  d];.        memc
3cc0: 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  py(pKeyInfo->aSo
3cd0: 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f 72  rtOrder, aSortOr
3ce0: 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20  der, nField);.  
3cf0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
3d00: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3d10: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20   P4_KEYINFO;.   
3d20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
3d30: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3d40: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70  d = 1;.      pOp
3d50: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
3d60: 54 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  TUSED;.    }.  }
3d70: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
3d80: 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29  EYINFO_HANDOFF )
3d90: 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20  {.    pOp->p4.p 
3da0: 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20  = (void*)zP4;.  
3db0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
3dc0: 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65  P4_KEYINFO;.  }e
3dd0: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  lse if( n<0 ){. 
3de0: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
3df0: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
3e00: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a  Op->p4type = n;.
3e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
3e20: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 74 72 6c   n==0 ) n = strl
3e30: 65 6e 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  en(zP4);.    pOp
3e40: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33  ->p4.z = sqlite3
3e50: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c  DbStrNDup(p->db,
3e60: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f   zP4, n);.    pO
3e70: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44  p->p4type = P4_D
3e80: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23  YNAMIC;.  }.}..#
3e90: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
3ea0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
3eb0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68  omment on the th
3ec0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
3ed0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
3ee0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
3ef0: 65 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64  e3VdbeComment(Vd
3f00: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
3f10: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
3f20: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
3f30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
3f40: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20  >0 || p->aOp==0 
3f50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
3f60: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70  aOp==0 || p->aOp
3f70: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
3f80: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d  ent==0 || p->db-
3f90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
3fa0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b  .  if( p->nOp ){
3fb0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d  .    char **pz =
3fc0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
3fd0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20  1].zComment;.   
3fe0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
3ff0: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69  ormat);.    sqli
4000: 74 65 33 5f 66 72 65 65 28 2a 70 7a 29 3b 0a 20  te3_free(*pz);. 
4010: 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33     *pz = sqlite3
4020: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
4030: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
4040: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
4050: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
4060: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63  * Return the opc
4070: 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ode for a given 
4080: 61 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65  address..*/.Vdbe
4090: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
40a0: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
40b0: 74 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72  t addr){.  asser
40c0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
40d0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
40e0: 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72 3e    assert( (addr>
40f0: 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f  =0 && addr<p->nO
4100: 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  p) || p->db->mal
4110: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
4120: 65 74 75 72 6e 20 28 28 61 64 64 72 3e 3d 30 20  eturn ((addr>=0 
4130: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 3f  && addr<p->nOp)?
4140: 28 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 29 3a  (&p->aOp[addr]):
4150: 30 29 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  0);.}..#if !defi
4160: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4170: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
4180: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
4190: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
41a0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
41b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
41c0: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
41d0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
41e0: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
41f0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
4200: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
4210: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
4220: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
4230: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
4240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
4250: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
4260: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
4270: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
4280: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
4290: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
42a0: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
42b0: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
42c0: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
42d0: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
42e0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
42f0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
4300: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
4310: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69  Info;.      sqli
4320: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4330: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69  mp, zTemp, "keyi
4340: 6e 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66  nfo(%d", pKeyInf
4350: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
4360: 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65    i = strlen(zTe
4370: 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  mp);.      for(j
4380: 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e  =0; j<pKeyInfo->
4390: 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20  nField; j++){.  
43a0: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
43b0: 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  Coll = pKeyInfo-
43c0: 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  >aColl[j];.     
43d0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
43e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
43f0: 3d 20 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e  = strlen(pColl->
4400: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
4410: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
4420: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  6 ){.           
4430: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
4440: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
4450: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4460: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4470: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
4480: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
4490: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
44a0: 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 4b  aSortOrder && pK
44b0: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
44c0: 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[j] ){.       
44d0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
44e0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 20  = '-';.         
44f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
4500: 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70  cpy(&zTemp[i], p
4510: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29  Coll->zName,n+1)
4520: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
4530: 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   n;.        }els
4540: 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d  e if( i+4<nTemp-
4550: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
4560: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
4570: 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20  ",nil",4);.     
4580: 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20       i += 4;.   
4590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
45a0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
45b0: 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65  = ')';.      zTe
45c0: 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[i] = 0;.     
45d0: 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70   assert( i<nTemp
45e0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
45f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4600: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
4610: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
4620: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
4630: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
4640: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4650: 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65  , zTemp, "collse
4660: 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  q(%.20s)", pColl
4670: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4690: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
46a0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
46b0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
46c0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
46d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
46e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
46f0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
4700: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
4710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4720: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
4730: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
4740: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
4750: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
4760: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
4770: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
4780: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4790: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
47a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
47b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
47c0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
47d0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
47e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
47f0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
4800: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
4810: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
4820: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
4830: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
4840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4850: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
4860: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
4870: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
4880: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4890: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
48a0: 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20  EM_Null)==0 );. 
48b0: 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66       if( pMem->f
48c0: 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
48d0: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20  {.        zP4 = 
48e0: 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d  pMem->z;.      }
48f0: 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66  else if( pMem->f
4900: 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29  lags & MEM_Int )
4910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4920: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4930: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
4940: 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20   pMem->u.i);.   
4950: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
4960: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  m->flags & MEM_R
4970: 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eal ){.        s
4980: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4990: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
49a0: 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b  .16g", pMem->r);
49b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
49c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
49d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
49e0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
49f0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
4a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
4a10: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
4a20: 2d 3e 70 34 2e 70 56 74 61 62 3b 0a 20 20 20 20  ->p4.pVtab;.    
4a30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4a40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
4a50: 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70   "vtab:%p:%p", p
4a60: 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f  Vtab, pVtab->pMo
4a70: 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  dule);.      bre
4a80: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
4a90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4aa0: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
4ab0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
4ac0: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
4ad0: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
4ae0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
4af0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4b00: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
4b10: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
4b20: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
4b30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  if../*.** Declar
4b40: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68  e to the Vdbe th
4b50: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a  at the BTree obj
4b60: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69  ect at db->aDb[i
4b70: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2f  ] is used..**.*/
4b80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4b90: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
4ba0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 69 6e  *p, int i){.  in
4bb0: 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 72 74  t mask;.  assert
4bc0: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
4bd0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
4be0: 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70 2d 3e  rt( i<sizeof(p->
4bf0: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a  btreeMask)*8 );.
4c00: 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b 0a 20    mask = 1<<i;. 
4c10: 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65 4d 61   if( (p->btreeMa
4c20: 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b  sk & mask)==0 ){
4c30: 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d 61 73  .    p->btreeMas
4c40: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 73  k |= mask;.    s
4c50: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
4c60: 41 72 72 61 79 49 6e 73 65 72 74 28 26 70 2d 3e  ArrayInsert(&p->
4c70: 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d 3e 61  aMutex, p->db->a
4c80: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 7d 0a  Db[i].pBt);.  }.
4c90: 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  }...#if defined(
4ca0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c  VDBE_PROFILE) ||
4cb0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4cc0: 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69  DEBUG)./*.** Pri
4cd0: 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f  nt a single opco
4ce0: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
4cf0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65  e is used for de
4d00: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
4d10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4d20: 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70  ePrintOp(FILE *p
4d30: 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20  Out, int pc, Op 
4d40: 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  *pOp){.  char *z
4d50: 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b  P4;.  char zPtr[
4d60: 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  50];.  static co
4d70: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
4d80: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20  t1 = "%4d %-13s 
4d90: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 34 73  %4d %4d %4d %-4s
4da0: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
4db0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
4dc0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
4dd0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
4de0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
4df0: 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69 6e 74  zPtr));.  fprint
4e00: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
4e10: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
4e20: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
4e30: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
4e40: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
4e50: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
4e60: 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53 51 4c  ->p5,.#ifdef SQL
4e70: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
4e80: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3f 20  pOp->zComment ? 
4e90: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3a 20  pOp->zComment : 
4ea0: 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22  "".#else.      "
4eb0: 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a 20 20  ".#endif.  );.  
4ec0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
4ed0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4ee0: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
4ef0: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
4f00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4f10: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
4f20: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c 20 69  Mem *p, int N, i
4f30: 6e 74 20 66 72 65 65 62 75 66 66 65 72 73 29 7b  nt freebuffers){
4f40: 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b  .  if( p && N ){
4f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
4f60: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 6e   = p->db;.    in
4f70: 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  t malloc_failed 
4f80: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
4f90: 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e  ed;.    while( N
4fa0: 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20 61 73  -->0 ){.      as
4fb0: 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70 5b 30  sert( N<2 || p[0
4fc0: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
4fd0: 0a 20 20 20 20 20 20 69 66 28 20 66 72 65 65 62  .      if( freeb
4fe0: 75 66 66 65 72 73 20 29 7b 0a 20 20 20 20 20 20  uffers ){.      
4ff0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5000: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
5010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5020: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
5030: 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c 28 70  eleaseExternal(p
5040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5050: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
5060: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2b 2b 3b  Null;.      p++;
5070: 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d  .    }.    db->m
5080: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
5090: 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d  lloc_failed;.  }
50a0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
50b0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
50c0: 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73  MANAGEMENT.int s
50d0: 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65 61 73  qlite3VdbeReleas
50e0: 65 42 75 66 66 65 72 73 28 56 64 62 65 20 2a 70  eBuffers(Vdbe *p
50f0: 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69  ){.  int ii;.  i
5100: 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  nt nFree = 0;.  
5110: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
5120: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
5130: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
5140: 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e  r(ii=1; ii<=p->n
5150: 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Mem; ii++){.    
5160: 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
5170: 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20 69 66  aMem[ii];.    if
5180: 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d 65  ( pMem->z && pMe
5190: 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79 6e  m->flags&MEM_Dyn
51a0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
51b0: 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29 3b  ( !pMem->xDel );
51c0: 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d 20  .      nFree += 
51d0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
51e0: 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  e(pMem->z);.    
51f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
5200: 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20  Release(pMem);. 
5210: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
5220: 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69  n nFree;.}.#endi
5230: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
5240: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f  E_OMIT_EXPLAIN./
5250: 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74  *.** Give a list
5260: 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72  ing of the progr
5270: 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 61  am in the virtua
5280: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a  l machine..**.**
5290: 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 69   The interface i
52a0: 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  s the same as sq
52b0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
52c0: 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66    But instead of
52d0: 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  .** running the 
52e0: 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73  code, it invokes
52f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
5300: 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74  ce for each inst
5310: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5320: 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 64   feature is used
5330: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45   to implement "E
5340: 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57  XPLAIN"..**.** W
5350: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
5360: 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 74  1, each instruct
5370: 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20  ion is listed.  
5380: 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61  When.** p->expla
5390: 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45  in==2, only OP_E
53a0: 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
53b0: 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 61  ons are listed a
53c0: 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20  nd these.** are 
53d0: 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65  shown in a diffe
53e0: 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d  rent format.  p-
53f0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75  >explain==2 is u
5400: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5410: 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52  .** EXPLAIN QUER
5420: 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  Y PLAN..*/.int s
5430: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
5440: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
5450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5460: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
5470: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
5480: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
5490: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
54a0: 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  OK;.  Mem *pMem 
54b0: 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  = p->pResultSet 
54c0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a  = &p->aMem[1];..
54d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70    assert( p->exp
54e0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  lain );.  if( p-
54f0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
5500: 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72 6e 20  IC_RUN ) return 
5510: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
5520: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 67   assert( db->mag
5530: 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43  ic==SQLITE_MAGIC
5540: 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73 65 72  _BUSY );.  asser
5550: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
5560: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
5570: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a 20 20  LITE_BUSY );..  
5580: 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74  /* Even though t
5590: 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20  his opcode does 
55a0: 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20  not use dynamic 
55b0: 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a  strings for.  **
55c0: 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73   the result, res
55d0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ult columns may 
55e0: 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69  become dynamic i
55f0: 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73  f the user calls
5600: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  ** sqlite3_co
5610: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63  lumn_text16(), c
5620: 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61  ausing a transla
5630: 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65  tion to UTF-16 e
5640: 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  ncoding..  */.  
5650: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
5660: 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 31  pMem, p->nMem, 1
5670: 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20  );..  do{.    i 
5680: 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68  = p->pc++;.  }wh
5690: 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26  ile( i<p->nOp &&
56a0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26   p->explain==2 &
56b0: 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  & p->aOp[i].opco
56c0: 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29  de!=OP_Explain )
56d0: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f  ;.  if( i>=p->nO
56e0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  p ){.    p->rc =
56f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5700: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
5710: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62  ;.  }else if( db
5720: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
5730: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
5740: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  = SQLITE_INTERRU
5750: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
5760: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
5770: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28  qlite3SetString(
5780: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c  &p->zErrMsg, sql
5790: 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63  ite3ErrStr(p->rc
57a0: 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
57b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
57c0: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20  *z;.    Op *pOp 
57d0: 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  = &p->aOp[i];.  
57e0: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
57f0: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65  ==1 ){.      pMe
5800: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
5810: 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  nt;.      pMem->
5820: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5830: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5840: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
5870: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
5880: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
5890: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
58a0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
58b0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
58c0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
58d0: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
58e0: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
58f0: 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70  >opcode);  /* Op
5900: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
5910: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5920: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
5930: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5940: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5950: 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54  >type = SQLITE_T
5960: 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  EXT;.      pMem-
5970: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5980: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
5990: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  ;.    }..    pMe
59a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
59b0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
59c0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
59f0: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
5a00: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
5a10: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
5a20: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5a30: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
5a40: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
5a70: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  */.    pMem->typ
5a80: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
5a90: 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ER;.    pMem++;.
5aa0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
5ab0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
5ac0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
5ad0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
5ae0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
5af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
5b10: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
5b20: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e  type = SQLITE_IN
5b30: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 4d 65  TEGER;.      pMe
5b40: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
5b50: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
5b60: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
5b70: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
5b80: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
5b90: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
5ba0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
5bb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5bc0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
5bd0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5be0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
5bf0: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d 20 64  _Term;.    z = d
5c00: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
5c10: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
5c20: 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29  if( z!=pMem->z )
5c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5c40: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
5c50: 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45  m, z, -1, SQLITE
5c60: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
5c70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
5c80: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
5c90: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
5ca0: 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e 7a  = strlen(pMem->z
5cb0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
5cc0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
5cd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
5ce0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5cf0: 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  TEXT;.    pMem++
5d00: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5d10: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5d20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5d30: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34  eMemGrow(pMem, 4
5d40: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
5d50: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
5d60: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  led = 1;.       
5d70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
5d80: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
5d90: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
5da0: 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74  = MEM_Dyn|MEM_St
5db0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
5dc0: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
5dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
5de0: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
5df0: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
5e00: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
5e10: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20       pMem->type 
5e20: 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20  = SQLITE_TEXT;. 
5e30: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
5e40: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
5e50: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
5e60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5e70: 55 47 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  UG.      if( pOp
5e80: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
5e90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5ea0: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
5eb0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d  Term;.        pM
5ec0: 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a 43 6f  em->z = pOp->zCo
5ed0: 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 70  mment;.        p
5ee0: 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28  Mem->n = strlen(
5ef0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  pMem->z);.      
5f00: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
5f10: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
5f20: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
5f30: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
5f40: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
5f50: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5f70: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
5f80: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
5f90: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
5fa0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
5fb0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
5fc0: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
5fd0: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
5fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5ff0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
6000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6010: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6020: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6030: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
6040: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
6050: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
6060: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
6070: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
6080: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
6090: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
60a0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
60b0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
60c0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
60d0: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
60e0: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
60f0: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
6100: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6110: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6120: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
6130: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
6140: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
6150: 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28 75 38  le( isspace(*(u8
6160: 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  *)z) ) z++;.    
6170: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
6180: 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  ]\n", z);.  }.}.
6190: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
61a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
61b0: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
61c0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
61d0: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
61e0: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
61f0: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
6200: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
6210: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6220: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
6230: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
6240: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
6250: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
6260: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
6270: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6280: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
6290: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
62a0: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
62b0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65  opcode==OP_Trace
62c0: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
62d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
62e0: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
62f0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
6300: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
6310: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
6320: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
6330: 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28 28 75  (i=0; isspace((u
6340: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 5b 69  nsigned char)z[i
6350: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6360: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6370: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73  +){.      if( is
6380: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
6390: 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a 20 20  char)z[i]) ){.  
63a0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
63b0: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
63c0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
63d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
63e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
63f0: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
6400: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6410: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
6420: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
6430: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
6440: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
6450: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
6460: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
6470: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 0a 2f  E_IOTRACE */.../
6480: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
6490: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
64a0: 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 54  or execution.  T
64b0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
64c0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
64d0: 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20  llocating stack 
64e0: 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61  space and initia
64f0: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72  lizing the progr
6500: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41  am counter..** A
6510: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61  fter the VDBE ha
6520: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74  s be prepped, it
6530: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64   can be executed
6540: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a   by one or more.
6550: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
6560: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20  te3VdbeExec().  
6570: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
6580: 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
6590: 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f 6d 20  ove a VDBE from 
65a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
65b0: 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43  to.** VDBE_MAGIC
65c0: 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  _RUN..*/.void sq
65d0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
65e0: 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  dy(.  Vdbe *p,  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45       /* The VDBE
6610: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20   */.  int nVar, 
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6640: 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74 68 65  f '?' see in the
6650: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a   SQL statement *
6660: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20  /.  int nMem,   
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6690: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20  memory cells to 
66a0: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
66b0: 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20 20 20  t nCursor,      
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66d0: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  Number of cursor
66e0: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
66f0: 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61 69 6e  .  int isExplain
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6710: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
6720: 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64   EXPLAIN keyword
6730: 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  s is present */.
6740: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
6750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
6760: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21  b;..  assert( p!
6770: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
6780: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6790: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20  AGIC_INIT );..  
67a0: 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  /* There should 
67b0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
67c0: 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61  opcode..  */.  a
67d0: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
67e0: 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
67f0: 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d   magic to VDBE_M
6800: 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20  AGIC_RUN sooner 
6810: 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
6820: 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69 73 20  r. This.   * is 
6830: 62 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c  because the call
6840: 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72 72 61   to resizeOpArra
6850: 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20 73 68  y() below may sh
6860: 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20 70 2d  rink the.   * p-
6870: 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74 6f 20  >aOp[] array to 
6880: 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66 20 63  save memory if c
6890: 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20 56 44  alled when in VD
68a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a 20 20  BE_MAGIC_RUN .  
68b0: 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a 2f 0a   * state..   */.
68c0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
68d0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20 20  E_MAGIC_RUN;..  
68e0: 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73  /* For each curs
68f0: 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73  or required, als
6900: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d  o allocate a mem
6910: 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79  ory cell. Memory
6920: 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65  .  ** cells (nMe
6930: 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d  m+1-nCursor)..nM
6940: 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77  em, inclusive, w
6950: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65  ill never be use
6960: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64  d by.  ** the vd
6970: 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74  be program. Inst
6980: 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65  ead they are use
6990: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70  d to allocate sp
69a0: 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43 75 72  ace for.  ** Cur
69b0: 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72  sor/BtCursor str
69c0: 75 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f  uctures. The blo
69d0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f  b of memory asso
69e0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a  ciated with .  *
69f0: 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74  * cursor 0 is st
6a00: 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63  ored in memory c
6a10: 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79  ell nMem. Memory
6a20: 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20   cell (nMem-1). 
6a30: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62   ** stores the b
6a40: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6a50: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
6a60: 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a  rsor 1, etc..  *
6a70: 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  *.  ** See also:
6a80: 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28   allocateCursor(
6a90: 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b  )..  */.  nMem +
6aa0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a  = nCursor;..  /*
6ab0: 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e  .  ** Allocation
6ac0: 20 73 70 61 63 65 20 66 6f 72 20 72 65 67 69 73   space for regis
6ad0: 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
6ae0: 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b 0a 20   p->aMem==0 ){. 
6af0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
6b00: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
6b10: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
6b20: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
6b30: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
6b40: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
6b50: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 2f 2a  , &nArg);.    /*
6b60: 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28 70 2c  resizeOpArray(p,
6b70: 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20 20 20   p->nOp);*/.    
6b80: 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d 30 20  assert( nVar>=0 
6b90: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45 78 70  );.    if( isExp
6ba0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
6bb0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d  ){.      p->nMem
6bc0: 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20   = nMem = 10;.  
6bd0: 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20    }.    p->aMem 
6be0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
6bf0: 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20 20 20  cZero(db,.      
6c00: 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65    nMem*sizeof(Me
6c10: 6d 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m)              
6c20: 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20 20 20   /* aMem */.    
6c30: 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28    + nVar*sizeof(
6c40: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6c50: 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a 20 20     /* aVar */.  
6c60: 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a 65 6f      + nArg*sizeo
6c70: 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20 20 20  f(Mem*)         
6c80: 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20 2a 2f       /* apArg */
6c90: 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a 73 69  .      + nVar*si
6ca0: 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20 20 20  zeof(char*)     
6cb0: 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56 61 72          /* azVar
6cc0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43 75 72   */.      + nCur
6cd0: 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72 73 6f  sor*sizeof(Curso
6ce0: 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20 61 70  r*) + 1    /* ap
6cf0: 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20  Csr */.    );.  
6d00: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
6d10: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
6d20: 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20   p->aMem--;     
6d30: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
6d40: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
6d50: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  Mem */.      p->
6d60: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
6d70: 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74      /*       not
6d80: 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20   from 0..nMem-1 
6d90: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72  */.      p->aVar
6da0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d 65 6d   = &p->aMem[nMem
6db0: 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 56  +1];.      p->nV
6dc0: 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20 20 20  ar = nVar;.     
6dd0: 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b 0a 20   p->okVar = 0;. 
6de0: 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20       p->apArg = 
6df0: 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61 72 5b  (Mem**)&p->aVar[
6e00: 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  nVar];.      p->
6e10: 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a 2a 29  azVar = (char**)
6e20: 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67 5d 3b  &p->apArg[nArg];
6e30: 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20  .      p->apCsr 
6e40: 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70 2d 3e  = (Cursor**)&p->
6e50: 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20 20 20  azVar[nVar];.   
6e60: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20     p->nCursor = 
6e70: 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 66  nCursor;.      f
6e80: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20  or(n=0; n<nVar; 
6e90: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  n++){.        p-
6ea0: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
6eb0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
6ec0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
6ed0: 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20   = db;.      }. 
6ee0: 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c       for(n=1; n<
6ef0: 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  =nMem; n++){.   
6f00: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
6f10: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
6f20: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d 65  ;.        p->aMe
6f30: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
6f40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
6f60: 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  BUG.  for(n=1; n
6f70: 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a  <p->nMem; n++){.
6f80: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
6f90: 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b  Mem[n].db==db );
6fa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70  .  }.#endif..  p
6fb0: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
6fc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6fd0: 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 3d    p->uniqueCnt =
6fe0: 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e 44   0;.  p->returnD
6ff0: 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 65  epth = 0;.  p->e
7000: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
7010: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c  Abort;.  p->expl
7020: 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e  ain |= isExplain
7030: 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
7040: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20  DBE_MAGIC_RUN;. 
7050: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
7060: 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d  .  p->cacheCtr =
7070: 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74   1;.  p->minWrit
7080: 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35  eFileFormat = 25
7090: 35 3b 0a 20 20 70 2d 3e 6f 70 65 6e 65 64 53 74  5;.  p->openedSt
70a0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66  atement = 0;.#if
70b0: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
70c0: 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  .  {.    int i;.
70d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
70e0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
70f0: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
7100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61   = 0;.      p->a
7110: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30  Op[i].cycles = 0
7120: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7130: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  if.}../*.** Clos
7140: 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20  e a VDBE cursor 
7150: 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
7160: 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68  the resources th
7170: 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61  at cursor .** ha
7180: 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a  ppens to hold..*
7190: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
71a0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62  beFreeCursor(Vdb
71b0: 65 20 2a 70 2c 20 43 75 72 73 6f 72 20 2a 70 43  e *p, Cursor *pC
71c0: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30  x){.  if( pCx==0
71d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
71e0: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70    }.  if( pCx->p
71f0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
7200: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
7210: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
7220: 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  or);.  }.  if( p
7230: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73  Cx->pBt ){.    s
7240: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
7250: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pCx->pBt);.  }.
7260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7270: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7280: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  .  if( pCx->pVta
7290: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
72a0: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
72b0: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
72c0: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
72d0: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
72e0: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
72f0: 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f  odule = pCx->pMo
7300: 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  dule;.    p->inV
7310: 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20  tabMethod = 1;. 
7320: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
7330: 53 61 66 65 74 79 4f 66 66 28 70 2d 3e 64 62 29  SafetyOff(p->db)
7340: 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78  ;.    pModule->x
7350: 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f  Close(pVtabCurso
7360: 72 29 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71  r);.    (void)sq
7370: 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70 2d  lite3SafetyOn(p-
7380: 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56  >db);.    p->inV
7390: 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20  tabMethod = 0;. 
73a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
73b0: 21 70 43 78 2d 3e 65 70 68 65 6d 50 73 65 75 64  !pCx->ephemPseud
73c0: 6f 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 73 71  oTable ){.    sq
73d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 78 2d 3e  lite3_free(pCx->
73e0: 70 44 61 74 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a  pData);.  }.  /*
73f0: 20 6d 65 6d 73 65 74 28 70 43 78 2c 20 30 2c 20   memset(pCx, 0, 
7400: 73 69 7a 65 6f 66 28 43 75 72 73 6f 72 29 29 3b  sizeof(Cursor));
7410: 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33   */.  /* sqlite3
7420: 5f 66 72 65 65 28 70 43 78 2d 3e 61 54 79 70 65  _free(pCx->aType
7430: 29 3b 20 2a 2f 0a 20 20 2f 2a 20 73 71 6c 69 74  ); */.  /* sqlit
7440: 65 33 5f 66 72 65 65 28 70 43 78 29 3b 20 2a 2f  e3_free(pCx); */
7450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
7460: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
7470: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
7480: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
7490: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
74a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
74b0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
74c0: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
74d0: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
74e0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
74f0: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
7500: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
7510: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
7520: 20 20 20 20 43 75 72 73 6f 72 20 2a 70 43 20 3d      Cursor *pC =
7530: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
7540: 20 20 69 66 28 20 70 43 20 26 26 20 28 21 70 2d    if( pC && (!p-
7550: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 7c 7c  >inVtabMethod ||
7560: 20 21 70 43 2d 3e 70 56 74 61 62 43 75 72 73 6f   !pC->pVtabCurso
7570: 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r) ){.      sqli
7580: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
7590: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
75a0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b  p->apCsr[i] = 0;
75b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
75c0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65  .** Clean up the
75d0: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74   VM after execut
75e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
75f0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74  routine will aut
7600: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65  omatically close
7610: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69   any cursors, li
7620: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73  sts, and/or.** s
7630: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65  orters that were
7640: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20   left open.  It 
7650: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65  also deletes the
7660: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61   values of.** va
7670: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61  riables in the a
7680: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Var[] array..*/.
7690: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61  static void Clea
76a0: 6e 75 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  nup(Vdbe *p, int
76b0: 20 66 72 65 65 62 75 66 66 65 72 73 29 7b 0a 20   freebuffers){. 
76c0: 20 69 6e 74 20 69 3b 0a 20 20 63 6c 6f 73 65 41   int i;.  closeA
76d0: 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74 41  llCursorsExceptA
76e0: 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20  ctiveVtabs(p);. 
76f0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
7700: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
7710: 4d 65 6d 53 65 74 54 79 70 65 46 6c 61 67 28 26  MemSetTypeFlag(&
7720: 70 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f  p->aMem[i], MEM_
7730: 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  Null);.  }.  rel
7740: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d  easeMemArray(&p-
7750: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65  >aMem[1], p->nMe
7760: 6d 2c 20 66 72 65 65 62 75 66 66 65 72 73 29 3b  m, freebuffers);
7770: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  .  sqlite3VdbeFi
7780: 66 6f 43 6c 65 61 72 28 26 70 2d 3e 73 46 69 66  foClear(&p->sFif
7790: 6f 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e  o);.  if( p->con
77a0: 74 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20  textStack ){.   
77b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 63   for(i=0; i<p->c
77c0: 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 3b 20  ontextStackTop; 
77d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
77e0: 74 65 33 56 64 62 65 46 69 66 6f 43 6c 65 61 72  te3VdbeFifoClear
77f0: 28 26 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  (&p->contextStac
7800: 6b 5b 69 5d 2e 73 46 69 66 6f 29 3b 0a 20 20 20  k[i].sFifo);.   
7810: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
7820: 72 65 65 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ree(p->contextSt
7830: 61 63 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ack);.  }.  p->c
7840: 6f 6e 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b  ontextStack = 0;
7850: 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61  .  p->contextSta
7860: 63 6b 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70  ckDepth = 0;.  p
7870: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f  ->contextStackTo
7880: 70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  p = 0;.  sqlite3
7890: 5f 66 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67  _free(p->zErrMsg
78a0: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
78b0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
78c0: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
78d0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
78e0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
78f0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
7900: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7910: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
7920: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
7930: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
7940: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
7950: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
7960: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
7970: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
7980: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
7990: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
79a0: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
79b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
79c0: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
79d0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
79e0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
79f0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
7a00: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
7a10: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
7a20: 6e 74 20 6e 3b 0a 0a 20 20 72 65 6c 65 61 73 65  nt n;..  release
7a30: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
7a40: 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
7a50: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31  umn*COLNAME_N, 1
7a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
7a70: 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  e(p->aColName);.
7a80: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
7a90: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
7aa0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52  >nResColumn = nR
7ab0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
7ac0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
7ad0: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
7ae0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
7af0: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  ->db, sizeof(Mem
7b00: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
7b10: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
7b20: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
7b30: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
7b40: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
7b50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
7b60: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
7b70: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
7b80: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
7b90: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
7ba0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
7bb0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
7bc0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
7bd0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
7be0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
7bf0: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
7c00: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
7c10: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
7c20: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
7c30: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
7c40: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
7c50: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d  s()..**.** If N=
7c60: 3d 50 34 5f 53 54 41 54 49 43 20 20 69 74 20 6d  =P4_STATIC  it m
7c70: 65 61 6e 73 20 74 68 61 74 20 7a 4e 61 6d 65 20  eans that zName 
7c80: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7c90: 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 61 74 69  a constant stati
7ca0: 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 6e 64 20  c.** string and 
7cb0: 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79  we can just copy
7cc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 20 49 66   the pointer. If
7cd0: 20 69 74 20 69 73 20 50 34 5f 44 59 4e 41 4d 49   it is P4_DYNAMI
7ce0: 43 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 65 20  C, then .** the 
7cf0: 73 74 72 69 6e 67 20 69 73 20 66 72 65 65 64 20  string is freed 
7d00: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  using sqlite3_fr
7d10: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
7d20: 62 65 20 69 73 20 66 69 6e 69 73 68 65 64 20 77  be is finished w
7d30: 69 74 68 0a 2a 2a 20 69 74 2e 20 4f 74 68 65 72  ith.** it. Other
7d40: 77 69 73 65 2c 20 4e 20 62 79 74 65 73 20 6f 66  wise, N bytes of
7d50: 20 7a 4e 61 6d 65 20 61 72 65 20 63 6f 70 69 65   zName are copie
7d60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7d70: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
7d80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 64 78  Vdbe *p, int idx
7d90: 2c 20 69 6e 74 20 76 61 72 2c 20 63 6f 6e 73 74  , int var, const
7da0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e   char *zName, in
7db0: 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  t N){.  int rc;.
7dc0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
7dd0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
7de0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
7df0: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
7e00: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
7e10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
7e20: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  iled ) return SQ
7e30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73  LITE_NOMEM;.  as
7e40: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d  sert( p->aColNam
7e50: 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61  e!=0 );.  pColNa
7e60: 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61  me = &(p->aColNa
7e70: 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52  me[idx+var*p->nR
7e80: 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66  esColumn]);.  if
7e90: 28 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49 43 20  ( N==P4_DYNAMIC 
7ea0: 7c 7c 20 4e 3d 3d 50 34 5f 53 54 41 54 49 43 20  || N==P4_STATIC 
7eb0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7ec0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
7ed0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65  (pColName, zName
7ee0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
7ef0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7f00: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7f10: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
7f20: 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
7f30: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51  me, zName, N, SQ
7f40: 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45  LITE_UTF8,SQLITE
7f50: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
7f60: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7f70: 45 5f 4f 4b 20 26 26 20 4e 3d 3d 50 34 5f 44 59  E_OK && N==P4_DY
7f80: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 70 43 6f  NAMIC ){.    pCo
7f90: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 26 3d 20  lName->flags &= 
7fa0: 28 7e 4d 45 4d 5f 53 74 61 74 69 63 29 3b 0a 20  (~MEM_Static);. 
7fb0: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61     pColName->zMa
7fc0: 6c 6c 6f 63 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d  lloc = pColName-
7fd0: 3e 7a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  >z;.  }.  return
7fe0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20   rc;.}../*.** A 
7ff0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
8000: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72  ansaction may or
8010: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69   may not be acti
8020: 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ve on database h
8030: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20  andle.** db. If 
8040: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
8050: 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20   active, commit 
8060: 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  it. If there is 
8070: 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73  a.** write-trans
8080: 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20  action spanning 
8090: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61  more than one da
80a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
80b0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b  s routine.** tak
80c0: 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d  es care of the m
80d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72  aster journal tr
80e0: 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ickery..*/.stati
80f0: 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74  c int vdbeCommit
8100: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8110: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54   int i;.  int nT
8120: 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75  rans = 0;  /* Nu
8130: 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65  mber of database
8140: 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65  s with an active
8150: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
8160: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  on */.  int rc =
8170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8180: 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
8190: 30 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  0;..  /* Before 
81a0: 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
81b0: 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
81c0: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
81d0: 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
81e0: 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
81f0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
8200: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
8210: 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
8220: 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
8230: 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
8240: 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
8250: 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
8260: 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
8270: 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
8280: 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
8290: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
82a0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
82b0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
82c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
82d0: 53 79 6e 63 28 64 62 2c 20 72 63 29 3b 0a 20 20  Sync(db, rc);.  
82e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
82f0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8300: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
8310: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
8320: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
8330: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
8340: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
8350: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
8360: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
8370: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
8380: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
8390: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
83a0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
83b0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
83c0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
83d0: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
83e0: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
83f0: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
8400: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
8410: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
8420: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
8430: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
8440: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
8450: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
8460: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
8470: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
8480: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
8490: 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
84a0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
84b0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
84c0: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
84d0: 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20  .      if( i!=1 
84e0: 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20  ) nTrans++;.    
84f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
8500: 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
8510: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
8520: 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
8530: 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
8540: 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
8550: 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
8560: 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
8570: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
8580: 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 20 20  afetyOff(db);.  
8590: 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
85a0: 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
85b0: 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
85c0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
85d0: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 20 20 69  etyOn(db);.    i
85e0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
85f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
8600: 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20  STRAINT;.    }. 
8610: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
8620: 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
8630: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
8640: 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
8650: 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
8660: 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
8670: 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
8680: 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
8690: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
86a0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
86b0: 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
86c0: 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
86d0: 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
86e0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
86f0: 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
8700: 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
8710: 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
8720: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
8730: 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
8740: 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
8750: 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
8760: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
8770: 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
8780: 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
8790: 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
87a0: 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
87b0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
87c0: 73 74 72 6c 65 6e 28 73 71 6c 69 74 65 33 42 74  strlen(sqlite3Bt
87d0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64  reeGetFilename(d
87e0: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 20  b->aDb[0].pBt)) 
87f0: 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a  || nTrans<=1 ){.
8800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
8810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
8820: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
8830: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
8840: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
8850: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
8860: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8870: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
8880: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
8890: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
88a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
88b0: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
88c0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
88d0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
88e0: 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
88f0: 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
8900: 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
8910: 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
8920: 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
8930: 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
8940: 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
8950: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
8960: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
8970: 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
8980: 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
8990: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
89a0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
89b0: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
89c0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
89d0: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
89e0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
89f0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
8a00: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
8a10: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
8a20: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
8a30: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
8a40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8a50: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
8a60: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
8a70: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8a80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8a90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8aa0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
8ab0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8ac0: 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
8ad0: 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
8ae0: 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
8af0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
8b00: 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
8b10: 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
8b20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
8b30: 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
8b40: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
8b50: 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c  ommitted atomicl
8b60: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
8b70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
8b80: 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  IO.  else{.    s
8b90: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
8ba0: 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20   = db->pVfs;.   
8bb0: 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20   int needSync = 
8bc0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  0;.    char *zMa
8bd0: 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
8be0: 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
8bf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8c00: 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
8c10: 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
8c20: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
8c30: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
8c40: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
8c50: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
8c60: 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
8c70: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
8c80: 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20  nt res;..    /* 
8c90: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
8ca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
8cb0: 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e */.    do {.  
8cc0: 20 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a      u32 random;.
8cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
8ce0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
8cf0: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
8d00: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 61 6e  mness(sizeof(ran
8d10: 64 6f 6d 29 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a  dom), &random);.
8d20: 20 20 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20        zMaster = 
8d30: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8d40: 62 2c 20 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20  b, "%s-mj%08X", 
8d50: 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 61 6e 64 6f  zMainFile, rando
8d60: 6d 26 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  m&0x7fffffff);. 
8d70: 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
8d80: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  r ){.        ret
8d90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
8da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8db0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
8dc0: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
8dd0: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
8de0: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
8df0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
8e00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
8e10: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
8e20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8e30: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
8e40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
8e50: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
8e60: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
8e70: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
8e80: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
8e90: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
8ea0: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
8eb0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
8ec0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
8ed0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
8ee0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
8ef0: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
8f00: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
8f10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8f20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
8f30: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
8f40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8f50: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
8f60: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
8f70: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
8f80: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
8f90: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
8fa0: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
8fb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8fc0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
8fd0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
8fe0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
8ff0: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
9000: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9010: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
9020: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
9030: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
9040: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
9050: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
9060: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
9070: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
9080: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
9090: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
90a0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
90b0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
90c0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
90d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
90e0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
90f0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
9100: 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e 75  ( i==1 ) continu
9110: 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  e;   /* Ignore t
9120: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
9130: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71   */.      if( sq
9140: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
9150: 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
9160: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
9170: 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
9180: 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
9190: 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
91a0: 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30   if( zFile[0]==0
91b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
91c0: 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a   Ignore :memory:
91d0: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
91e0: 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53        if( !needS
91f0: 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42  ync && !sqlite3B
9200: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
9210: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
9220: 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
9230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9240: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9250: 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
9260: 7a 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46  zFile, strlen(zF
9270: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
9280: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
9290: 2b 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  += strlen(zFile)
92a0: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +1;.        if( 
92b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
92c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
92d0: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
92e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
92f0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
9300: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
9320: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
9330: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
9340: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
9350: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9360: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
9370: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9380: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
9390: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
93a0: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
93b0: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
93c0: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
93d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 69  .    */.    zMai
93e0: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
93f0: 74 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 64  treeGetDirname(d
9400: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
9410: 20 20 20 20 69 66 28 20 28 6e 65 65 64 53 79 6e      if( (needSyn
9420: 63 20 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  c .     && (0==(
9430: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
9440: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
9450: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
9460: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
9470: 29 0a 20 20 20 20 20 26 26 20 28 72 63 3d 73 71  ).     && (rc=sq
9480: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
9490: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
94a0: 5f 4e 4f 52 4d 41 4c 29 29 21 3d 53 51 4c 49 54  _NORMAL))!=SQLIT
94b0: 45 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 73  E_OK) ){.      s
94c0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
94d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
94e0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
94f0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
9500: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
9510: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
9520: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
9530: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9540: 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
9550: 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
9560: 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
9570: 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
9580: 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
9590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
95a0: 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
95b0: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
95c0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
95d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
95e0: 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
95f0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
9600: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9610: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
9620: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
9630: 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
9640: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9650: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9660: 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
9670: 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
9680: 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
9690: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
96a0: 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
96b0: 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
96c0: 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
96d0: 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
96e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
96f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
9700: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
9710: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
9720: 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
9730: 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  e failure occure
9740: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9750: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9760: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9770: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
9780: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
9790: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
97a0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
97b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
97c0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
97d0: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
97e0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
97f0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
9800: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9810: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
9820: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9830: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9840: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
9850: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
9860: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
9870: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9880: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
9890: 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
98a0: 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
98b0: 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
98c0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
98d0: 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
98e0: 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
98f0: 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
9900: 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
9910: 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
9920: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9930: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
9940: 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20  Master, 1);.    
9950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61  sqlite3_free(zMa
9960: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
9970: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
9980: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
9990: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
99a0: 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
99b0: 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
99c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
99d0: 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
99e0: 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
99f0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
9a00: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9a10: 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
9a20: 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
9a30: 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
9a40: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
9a50: 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
9a60: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
9a70: 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
9a80: 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
9a90: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
9aa0: 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
9ab0: 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
9ac0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
9ad0: 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
9ae0: 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
9af0: 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
9b00: 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
9b10: 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
9b20: 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
9b30: 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
9b40: 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
9b50: 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
9b60: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
9b70: 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
9b80: 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69  e3FaultBeginBeni
9b90: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
9ba0: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 29 3b  NJECTOR_MALLOC);
9bb0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9bc0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
9bd0: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9be0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9bf0: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
9c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9c10: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
9c20: 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20  aseTwo(pBt);.   
9c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
9c40: 71 6c 69 74 65 33 46 61 75 6c 74 45 6e 64 42 65  qlite3FaultEndBe
9c50: 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c  nign(SQLITE_FAUL
9c60: 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43  TINJECTOR_MALLOC
9c70: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
9c80: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
9c90: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
9ca0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
9cb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
9cc0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
9cd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9ce0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
9cf0: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
9d00: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
9d10: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
9d20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
9d30: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
9d40: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
9d50: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
9d60: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
9d70: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
9d80: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
9d90: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
9da0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
9db0: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
9dc0: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
9dd0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
9de0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
9df0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
9e00: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
9e10: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
9e20: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
9e30: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
9e40: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
9e50: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
9e60: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
9e70: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 70 20 3d 20   cnt = 0;.  p = 
9e80: 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
9e90: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
9ea0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
9eb0: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e  MAGIC_RUN && p->
9ec0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  pc>=0 ){.      c
9ed0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
9ee0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
9ef0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
9f00: 3d 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43  =db->activeVdbeC
9f10: 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  nt );.}.#else.#d
9f20: 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
9f30: 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
9f40: 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76  if../*.** For ev
9f50: 65 72 79 20 42 74 72 65 65 20 74 68 61 74 20 69  ery Btree that i
9f60: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
9f70: 63 74 69 6f 6e 20 64 62 20 77 68 69 63 68 20 0a  ction db which .
9f80: 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
9f90: 66 69 65 64 2c 20 22 74 72 69 70 22 20 6f 72 20  fied, "trip" or 
9fa0: 69 6e 76 61 6c 69 64 61 74 65 20 65 61 63 68 20  invalidate each 
9fb0: 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61  cursor in.** tha
9fc0: 74 20 42 74 72 65 65 20 6d 69 67 68 74 20 68 61  t Btree might ha
9fd0: 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ve been modified
9fe0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 75 72   so that the cur
9ff0: 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72  sor.** can never
a000: 20 62 65 20 75 73 65 64 20 61 67 61 69 6e 2e 20   be used again. 
a010: 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
a020: 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  en a rollback.**
a030: 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 20 68 61  * occurs.  We ha
a040: 76 65 20 74 6f 20 74 72 69 70 20 61 6c 6c 20 74  ve to trip all t
a050: 68 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  he other cursors
a060: 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  , even.** cursor
a070: 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20   from other VMs 
a080: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 64 61 74  in different dat
a090: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a0a0: 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f  s,.** so that no
a0b0: 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 79 20 74  ne of them try t
a0c0: 6f 20 75 73 65 20 74 68 65 20 64 61 74 61 20 61  o use the data a
a0d0: 74 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20  t which they.** 
a0e0: 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e  were pointing an
a0f0: 64 20 77 68 69 63 68 20 6e 6f 77 20 6d 61 79 20  d which now may 
a100: 68 61 76 65 20 62 65 65 6e 20 63 68 61 6e 67 65  have been change
a110: 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20  d due.** to the 
a120: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
a130: 52 65 6d 65 6d 62 65 72 20 74 68 61 74 20 61 20  Remember that a 
a140: 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c  rollback can del
a150: 65 74 65 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c  ete tables compl
a160: 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64  ete and.** reord
a170: 65 72 20 72 6f 6f 74 70 61 67 65 73 2e 20 20 53  er rootpages.  S
a180: 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66  o it is not suff
a190: 69 63 69 65 6e 74 20 6a 75 73 74 20 74 6f 20 73  icient just to s
a1a0: 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 61 74 65  ave.** the state
a1b0: 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20   of the cursor. 
a1c0: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 61   We have to inva
a1d0: 6c 69 64 61 74 65 20 74 68 65 20 63 75 72 73 6f  lidate the curso
a1e0: 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  r.** so that it 
a1f0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 61 67  is never used ag
a200: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
a210: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 75  oid invalidateCu
a220: 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42  rsorsOnModifiedB
a230: 74 72 65 65 73 28 73 71 6c 69 74 65 33 20 2a 64  trees(sqlite3 *d
a240: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  b){.  int i;.  f
a250: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a260: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
a270: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
a280: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
a290: 70 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  p && sqlite3Btre
a2a0: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
a2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a2c0: 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
a2d0: 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  s(p, SQLITE_ABOR
a2e0: 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  T);.    }.  }.}.
a2f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
a300: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
a310: 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
a320: 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
a330: 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
a340: 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
a350: 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
a360: 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
a370: 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
a380: 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
a390: 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
a3a0: 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
a3b0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
a3c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
a3d0: 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
a3e0: 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
a3f0: 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
a400: 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
a410: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
a420: 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
a430: 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
a440: 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
a450: 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
a460: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
a470: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
a480: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
a490: 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
a4a0: 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
a4b0: 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
a4c0: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
a4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
a4e0: 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
a4f0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
a500: 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
a510: 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
a520: 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
a530: 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
a540: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
a550: 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
a560: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
a570: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
a580: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
a590: 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b  Btree *pBt) = 0;
a5a0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
a5b0: 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74   call on each bt
a5c0: 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  ree backend */. 
a5d0: 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
a5e0: 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
a5f0: 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
a600: 66 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  f SQLITE_NOMEM o
a610: 72 20 49 4f 45 52 52 20 2a 2f 0a 0a 20 20 2f 2a  r IOERR */..  /*
a620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
a630: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
a640: 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
a650: 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
a660: 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
a670: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
a680: 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
a690: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
a6a0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
a6b0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
a6c0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
a6d0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
a6e0: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
a6f0: 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
a700: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
a710: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
a720: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
a730: 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
a740: 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
a750: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
a760: 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
a770: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
a780: 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
a790: 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
a7a0: 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
a7b0: 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
a7c0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
a7d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
a7e0: 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
a7f0: 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
a800: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
a810: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
a820: 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
a830: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
a840: 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
a850: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a860: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
a870: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
a880: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
a890: 72 73 45 78 63 65 70 74 41 63 74 69 76 65 56 74  rsExceptActiveVt
a8a0: 61 62 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  abs(p);.  if( p-
a8b0: 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
a8c0: 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
a8d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a8e0: 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
a8f0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
a900: 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
a910: 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
a920: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
a930: 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a 2f  never started */
a940: 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
a950: 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
a960: 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
a970: 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
a980: 72 63 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  rc */..    /* Lo
a990: 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
a9a0: 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
a9b0: 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
a9c0: 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61  e3BtreeMutexArra
a9d0: 79 45 6e 74 65 72 28 26 70 2d 3e 61 4d 75 74 65  yEnter(&p->aMute
a9e0: 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  x);..    /* Chec
a9f0: 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
aa00: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
aa10: 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
aa20: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
aa30: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
aa40: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
aa50: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
aa60: 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
aa80: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
aa90: 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
aaa0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
aab0: 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
aac0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
aad0: 73 20 6c 6f 6f 70 20 64 6f 65 73 20 73 74 61 74  s loop does stat
aae0: 69 63 20 61 6e 61 6c 79 73 69 73 20 6f 66 20 74  ic analysis of t
aaf0: 68 65 20 71 75 65 72 79 20 74 6f 20 73 65 65 20  he query to see 
ab00: 77 68 69 63 68 20 6f 66 20 74 68 65 0a 20 20 20  which of the.   
ab10: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
ab20: 74 68 72 65 65 20 63 61 74 65 67 6f 72 69 65 73  three categories
ab30: 20 69 74 20 66 61 6c 6c 73 20 69 6e 74 6f 3a 0a   it falls into:.
ab40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ab50: 2a 20 20 20 20 20 52 65 61 64 2d 6f 6e 6c 79 0a  *     Read-only.
ab60: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51 75 65        **     Que
ab70: 72 79 20 77 69 74 68 20 73 74 61 74 65 6d 65 6e  ry with statemen
ab80: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t journal.      
ab90: 2a 2a 20 20 20 20 20 51 75 65 72 79 20 77 69 74  **     Query wit
aba0: 68 6f 75 74 20 73 74 61 74 65 6d 65 6e 74 20 6a  hout statement j
abb0: 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 0a  ournal.      **.
abc0: 20 20 20 20 20 20 2a 2a 20 57 65 20 63 6f 75 6c        ** We coul
abd0: 64 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 6d  d do something m
abe0: 6f 72 65 20 65 6c 65 67 61 6e 74 20 74 68 61 6e  ore elegant than
abf0: 20 74 68 69 73 20 73 74 61 74 69 63 20 61 6e 61   this static ana
ac00: 6c 79 73 69 73 20 28 69 2e 65 2e 0a 20 20 20 20  lysis (i.e..    
ac10: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 74    ** store the t
ac20: 79 70 65 20 6f 66 20 71 75 65 72 79 20 61 73 20  ype of query as 
ac30: 70 61 72 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  part of the comp
ac40: 6c 69 61 74 69 6f 6e 20 70 68 61 73 65 29 2c 20  liation phase), 
ac50: 62 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 68 61  but .      ** ha
ac60: 6e 64 6c 69 6e 67 20 6d 61 6c 6c 6f 63 28 29 20  ndling malloc() 
ac70: 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 20 69 73  or IO failure is
ac80: 20 61 20 66 61 69 72 6c 79 20 6f 62 73 63 75 72   a fairly obscur
ac90: 65 20 65 64 67 65 20 63 61 73 65 20 73 6f 20 0a  e edge case so .
aca0: 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73        ** this is
acb0: 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72   probably easier
acc0: 2e 20 54 6f 64 6f 3a 20 4d 69 67 68 74 20 62 65  . Todo: Might be
acd0: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
ace0: 74 6f 20 72 65 64 75 63 65 20 0a 20 20 20 20 20  to reduce .     
acf0: 20 2a 2a 20 63 6f 64 65 20 73 69 7a 65 20 61 20   ** code size a 
ad00: 76 65 72 79 20 73 6d 61 6c 6c 20 61 6d 6f 75 6e  very small amoun
ad10: 74 20 74 68 6f 75 67 68 2e 2e 2e 0a 20 20 20 20  t though....    
ad20: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
ad30: 6f 74 52 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  otReadOnly = 0;.
ad40: 20 20 20 20 20 20 69 6e 74 20 69 73 53 74 61 74        int isStat
ad50: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  ement = 0;.     
ad60: 20 61 73 73 65 72 74 28 70 2d 3e 61 4f 70 20 7c   assert(p->aOp |
ad70: 7c 20 70 2d 3e 6e 4f 70 3d 3d 30 29 3b 0a 20 20  | p->nOp==0);.  
ad80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ad90: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nOp; i++){ .  
ada0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 2d        switch( p-
adb0: 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 20 29  >aOp[i].opcode )
adc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
add0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a   OP_Transaction:
ade0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74  .            not
adf0: 52 65 61 64 4f 6e 6c 79 20 7c 3d 20 70 2d 3e 61  ReadOnly |= p->a
ae00: 4f 70 5b 69 5d 2e 70 32 3b 0a 20 20 20 20 20 20  Op[i].p2;.      
ae10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ae20: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
ae30: 74 61 74 65 6d 65 6e 74 3a 0a 20 20 20 20 20 20  tatement:.      
ae40: 20 20 20 20 20 20 69 73 53 74 61 74 65 6d 65 6e        isStatemen
ae50: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
ae60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
ae80: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
ae90: 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d   query was read-
aea0: 6f 6e 6c 79 2c 20 77 65 20 6e 65 65 64 20 64 6f  only, we need do
aeb0: 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20   no rollback at 
aec0: 61 6c 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  all. Otherwise,.
aed0: 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 65 64        ** proceed
aee0: 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
aef0: 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
af00: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e    */.      if( n
af10: 6f 74 52 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72  otReadOnly || mr
af20: 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c!=SQLITE_INTERR
af30: 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  UPT ){.        i
af40: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
af50: 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 26  _IOERR_BLOCKED &
af60: 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b  & isStatement ){
af70: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
af80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
af90: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
afa0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
afb0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
afc0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 28      } else if( (
afd0: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
afe0: 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
aff0: 5f 46 55 4c 4c 29 20 26 26 20 69 73 53 74 61 74  _FULL) && isStat
b000: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
b010: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
b020: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
b030: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  tmt;.        }el
b040: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
b050: 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
b060: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
b070: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
b080: 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
b090: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
b0a0: 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
b0b0: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
b0c0: 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
b0d0: 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
b0e0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
b0f0: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
b100: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
b110: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
b120: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
b130: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20  llbackAll(db);. 
b140: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
b150: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
b160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b170: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
b180: 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
b190: 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
b1a0: 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
b1b0: 6c 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20  ly active vdbe, 
b1c0: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64  then.    ** we d
b1d0: 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69  o either a commi
b1e0: 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  t or rollback of
b1f0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
b200: 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a  nsaction. .    *
b210: 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54  *.    ** Note: T
b220: 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72  his block also r
b230: 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68  uns if one of th
b240: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
b250: 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a   handled .    **
b260: 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72   above has occur
b270: 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
b280: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  if( db->autoComm
b290: 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65  it && db->active
b2a0: 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20  VdbeCnt==1 ){.  
b2b0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
b2c0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
b2d0: 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
b2e0: 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
b2f0: 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
b300: 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
b310: 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
b320: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 76 64 62  rue, and the vdb
b330: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 0a 20  e program was . 
b340: 20 20 20 20 20 20 20 2a 2a 20 73 75 63 63 65 73         ** succes
b350: 73 66 75 6c 20 6f 72 20 68 69 74 20 61 6e 20 27  sful or hit an '
b360: 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
b370: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
b380: 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20  a commit .      
b390: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
b3a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b3b0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 76 64       int rc = vd
b3c0: 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  beCommit(db);.  
b3d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b3e0: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
b3f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
b400: 72 65 65 4d 75 74 65 78 41 72 72 61 79 4c 65 61  reeMutexArrayLea
b410: 76 65 28 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a  ve(&p->aMutex);.
b420: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b430: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
b440: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b450: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b460: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
b470: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
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 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b4b0: 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
b4c0: 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
b4d0: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
b4e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b4f0: 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
b500: 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  ckAll(db);.     
b510: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
b520: 20 21 78 46 75 6e 63 20 29 7b 0a 20 20 20 20 20   !xFunc ){.     
b530: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
b540: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
b550: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
b560: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
b570: 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d 65  p->openedStateme
b580: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nt ){.          
b590: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42  xFunc = sqlite3B
b5a0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a  treeCommitStmt;.
b5b0: 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
b5c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
b5d0: 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
b5e0: 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 78  ort ){.        x
b5f0: 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74  Func = sqlite3Bt
b600: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b  reeRollbackStmt;
b610: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b620: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
b630: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65  CursorsOnModifie
b640: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20  dBtrees(db);.   
b650: 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
b660: 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20  backAll(db);.   
b670: 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
b680: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  mit = 1;.      }
b690: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
b6a0: 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f 74   If xFunc is not
b6b0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
b6c0: 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 33  s one of sqlite3
b6d0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
b6e0: 74 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  t or.    ** sqli
b6f0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
b700: 6d 74 2e 20 43 61 6c 6c 20 69 74 20 6f 6e 63 65  mt. Call it once
b710: 20 6f 6e 20 65 61 63 68 20 62 61 63 6b 65 6e 64   on each backend
b720: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
b730: 63 75 72 73 0a 20 20 20 20 2a 2a 20 61 6e 64 20  curs.    ** and 
b740: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
b750: 69 73 20 73 74 69 6c 6c 20 53 51 4c 49 54 45 5f  is still SQLITE_
b760: 4f 4b 2c 20 73 65 74 20 74 68 65 20 72 65 74 75  OK, set the retu
b770: 72 6e 20 63 6f 64 65 20 74 6f 20 74 68 65 20 6e  rn code to the n
b780: 65 77 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  ew.    ** error 
b790: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  value..    */.  
b7a0: 20 20 61 73 73 65 72 74 28 21 78 46 75 6e 63 20    assert(!xFunc 
b7b0: 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d  ||.      xFunc==
b7c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
b7d0: 69 74 53 74 6d 74 20 7c 7c 0a 20 20 20 20 20 20  itStmt ||.      
b7e0: 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74  xFunc==sqlite3Bt
b7f0: 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 0a  reeRollbackStmt.
b800: 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
b810: 3d 30 3b 20 78 46 75 6e 63 20 26 26 20 69 3c 64  =0; xFunc && i<d
b820: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
b830: 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
b840: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
b850: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
b860: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
b870: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 78 46  .        rc = xF
b880: 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20  unc(pBt);.      
b890: 20 20 69 66 28 20 72 63 20 26 26 20 28 70 2d 3e    if( rc && (p->
b8a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b8b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 43   p->rc==SQLITE_C
b8c0: 4f 4e 53 54 52 41 49 4e 54 29 20 29 7b 0a 20 20  ONSTRAINT) ){.  
b8d0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
b8e0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
b8f0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
b900: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  p->zErrMsg, 0);.
b910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b920: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
b930: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
b940: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
b950: 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 74 68  or DELETE and th
b960: 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  e statement was 
b970: 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20 20 20  committed, .    
b980: 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  ** set the chang
b990: 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20  e counter. .    
b9a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68  */.    if( p->ch
b9b0: 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70 2d 3e  angeCntOn && p->
b9c0: 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  pc>=0 ){.      i
b9d0: 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75  f( !xFunc || xFu
b9e0: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65  nc==sqlite3Btree
b9f0: 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20  CommitStmt ){.  
ba00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba10: 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
ba20: 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  p->nChange);.   
ba30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ba50: 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a  Changes(db, 0);.
ba60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
ba70: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
ba80: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f    }.  .    /* Ro
ba90: 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74  llback or commit
baa0: 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e   any schema chan
bab0: 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65  ges that occurre
bac0: 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  d. */.    if( p-
bad0: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc!=SQLITE_OK &
bae0: 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  & db->flags&SQLI
baf0: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
bb00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bb10: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
bb20: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 20  hema(db, 0);.   
bb30: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28     db->flags = (
bb40: 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49  db->flags | SQLI
bb50: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
bb60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
bb70: 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
bb80: 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
bb90: 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 79  3BtreeMutexArray
bba0: 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 78  Leave(&p->aMutex
bbb0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
bbc0: 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
bbd0: 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
bbe0: 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
bbf0: 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
bc00: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
bc10: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69   ){.    db->acti
bc20: 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d  veVdbeCnt--;.  }
bc30: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
bc40: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
bc50: 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
bc60: 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70  Cnt(db);.  if( p
bc70: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
bc80: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
bc90: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
bca0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
bcb0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
bcc0: 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
bcd0: 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
bce0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
bcf0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
bd00: 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
bd10: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
bd20: 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
bd30: 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
bd40: 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
bd50: 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
bd60: 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
bd70: 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
bd80: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
bd90: 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
bda0: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
bdb0: 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
bdc0: 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
bdd0: 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
bde0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
bdf0: 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
be00: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
be10: 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
be20: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
be30: 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
be40: 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
be50: 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
be60: 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
be70: 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
be80: 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
be90: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
bea0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
beb0: 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
bec0: 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
bed0: 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
bee0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
bef0: 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
bf00: 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
bf10: 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
bf20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72 65  Vdbe *p, int fre
bf30: 65 62 75 66 66 65 72 73 29 7b 0a 20 20 73 71 6c  ebuffers){.  sql
bf40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d  ite3 *db;.  db =
bf50: 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66   p->db;..  /* If
bf60: 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20   the VM did not 
bf70: 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  run to completio
bf80: 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75  n or if it encou
bf90: 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65  ntered an.  ** e
bfa0: 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69  rror, then it mi
bfb0: 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65  ght not have bee
bfc0: 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c  n halted properl
bfd0: 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a  y.  So halt.  **
bfe0: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
bff0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
c000: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
c010: 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
c020: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
c030: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
c040: 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
c050: 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
c060: 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
c070: 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
c080: 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
c090: 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
c0a0: 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
c0b0: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
c0c0: 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
c0d0: 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
c0e0: 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
c0f0: 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
c100: 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
c110: 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
c120: 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
c130: 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
c140: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
c150: 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
c160: 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
c170: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
c180: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a   ){.    if( p->z
c190: 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
c1a0: 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
c1b0: 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70  tr(db->pErr,-1,p
c1c0: 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45  ->zErrMsg,SQLITE
c1d0: 5f 55 54 46 38 2c 73 71 6c 69 74 65 33 5f 66 72  _UTF8,sqlite3_fr
c1e0: 65 65 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 65  ee);.      db->e
c1f0: 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63 3b 0a  rrCode = p->rc;.
c200: 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67        p->zErrMsg
c210: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c220: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20  if( p->rc ){.   
c230: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
c240: 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20  db, p->rc, 0);. 
c250: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c260: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
c270: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
c280: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
c290: 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
c2a0: 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
c2b0: 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
c2c0: 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
c2d0: 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
c2e0: 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
c2f0: 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
c300: 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
c310: 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
c320: 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
c330: 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
c340: 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
c350: 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
c360: 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
c370: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
c380: 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 30  ror(db, p->rc, 0
c390: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
c3a0: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
c3b0: 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d  rr, -1, p->zErrM
c3c0: 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  sg, SQLITE_UTF8,
c3d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
c3e0: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
c3f0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
c400: 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
c410: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
c420: 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
c430: 28 70 2c 20 66 72 65 65 62 75 66 66 65 72 73 29  (p, freebuffers)
c440: 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
c450: 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
c460: 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
c470: 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
c480: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
c490: 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
c4a0: 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
c4b0: 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
c4c0: 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
c4d0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
c4e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
c4f0: 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
c500: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c510: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
c520: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
c530: 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
c540: 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
c550: 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
c560: 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
c570: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c580: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
c590: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
c5a0: 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38  , "%6d %10lld %8
c5b0: 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20  lld ",.         
c5c0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c    p->aOp[i].cnt,
c5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c5e0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20  Op[i].cycles,.  
c5f0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
c600: 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f  i].cnt>0 ? p->aO
c610: 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61  p[i].cycles/p->a
c620: 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20  Op[i].cnt : 0.  
c630: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
c640: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
c650: 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
c660: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
c670: 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
c680: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
c690: 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ndif.  p->magic 
c6a0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
c6b0: 54 3b 0a 20 20 70 2d 3e 61 62 6f 72 74 65 64 20  T;.  p->aborted 
c6c0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 0;.  return p-
c6d0: 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
c6e0: 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
c6f0: 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
c700: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
c710: 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
c720: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
c730: 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
c740: 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
c750: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
c760: 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
c770: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
c780: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
c790: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
c7a0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c7b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
c7c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
c7d0: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
c7e0: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
c7f0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c800: 33 56 64 62 65 52 65 73 65 74 28 70 2c 20 31 29  3VdbeReset(p, 1)
c810: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
c820: 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
c830: 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c  sk)==rc );.  }el
c840: 73 65 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  se if( p->magic!
c850: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
c860: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c870: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
c880: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
c890: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c  ray(&p->aMem[1],
c8a0: 20 70 2d 3e 6e 4d 65 6d 2c 20 31 29 3b 0a 20 20   p->nMem, 1);.  
c8b0: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
c8c0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
c8d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
c8e0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
c8f0: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
c900: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
c910: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
c920: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
c930: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
c940: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
c950: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
c960: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
c970: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
c980: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
c990: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
c9a0: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
c9b0: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
c9c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c9d0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
c9e0: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
c9f0: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
ca00: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ca10: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
ca20: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
ca30: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
ca40: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
ca50: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
ca60: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
ca70: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
ca80: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
ca90: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
caa0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
cab0: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
cac0: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
cad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
cae0: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
caf0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
cb00: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
cb10: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
cb20: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
cb30: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
cb40: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t i;.  if( p==0 
cb50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61  ) return;.  Clea
cb60: 6e 75 70 28 70 2c 20 31 29 3b 0a 20 20 69 66 28  nup(p, 1);.  if(
cb70: 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20   p->pPrev ){.   
cb80: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
cb90: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
cba0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
cbb0: 28 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d  ( p->db->pVdbe==
cbc0: 70 20 29 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e  p );.    p->db->
cbd0: 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
cbe0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
cbf0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
cc00: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
cc10: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
cc20: 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  ( p->aOp ){.    
cc30: 4f 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70  Op *pOp = p->aOp
cc40: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cc50: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f  <p->nOp; i++, pO
cc60: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65  p++){.      free
cc70: 50 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  P4(pOp->p4type, 
cc80: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
cc90: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
cca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ccb0: 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ee(pOp->zComment
ccc0: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
ccd0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cce0: 5f 66 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20  _free(p->aOp);. 
ccf0: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
cd00: 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d  rray(p->aVar, p-
cd10: 3e 6e 56 61 72 2c 20 31 29 3b 0a 20 20 73 71 6c  >nVar, 1);.  sql
cd20: 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 4c 61  ite3_free(p->aLa
cd30: 62 65 6c 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  bel);.  if( p->a
cd40: 4d 65 6d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Mem ){.    sqlit
cd50: 65 33 5f 66 72 65 65 28 26 70 2d 3e 61 4d 65 6d  e3_free(&p->aMem
cd60: 5b 31 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  [1]);.  }.  rele
cd70: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
cd80: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
cd90: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
cda0: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 1);.  sqlite3_
cdb0: 66 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  free(p->aColName
cdc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
cdd0: 65 28 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 70 2d  e(p->zSql);.  p-
cde0: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
cdf0: 47 49 43 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69  GIC_DEAD;.  sqli
ce00: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a  te3_free(p);.}..
ce10: 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  /*.** If a MoveT
ce20: 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
ce30: 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
ce40: 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
ce50: 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
ce60: 54 6f 20 6e 6f 77 2e 20 20 52 65 74 75 72 6e 20  To now.  Return 
ce70: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
ce80: 49 66 20 6e 6f 20 4d 6f 76 65 54 6f 20 69 73 20  If no MoveTo is 
ce90: 70 65 6e 64 69 6e 67 2c 20 74 68 69 73 0a 2a 2a  pending, this.**
cea0: 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f   routine does no
ceb0: 74 68 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  thing and return
cec0: 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
ced0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
cee0: 75 72 73 6f 72 4d 6f 76 65 74 6f 28 43 75 72 73  ursorMoveto(Curs
cef0: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
cf00: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
cf10: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
cf20: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
cf30: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
cf40: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
cf50: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
cf60: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
cf70: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
cf80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
cf90: 65 65 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72  eeMoveto(p->pCur
cfa0: 73 6f 72 2c 20 30 2c 20 30 2c 20 70 2d 3e 6d 6f  sor, 0, 0, p->mo
cfb0: 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
cfc0: 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  res);.    if( rc
cfd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
cfe0: 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d    *p->pIncrKey =
cff0: 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52   0;.    p->lastR
d000: 6f 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28  owid = keyToInt(
d010: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29  p->movetoTarget)
d020: 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
d030: 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a  Valid = res==0;.
d040: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
d050: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
d060: 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 2d 3e  te3BtreeNext(p->
d070: 70 43 75 72 73 6f 72 2c 20 26 72 65 73 29 3b 0a  pCursor, &res);.
d080: 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
d090: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
d0a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
d0b0: 53 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ST.    sqlite3_s
d0c0: 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
d0d0: 65 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66  endif.    p->def
d0e0: 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b  erredMoveto = 0;
d0f0: 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61  .    p->cacheSta
d100: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
d110: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
d120: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d130: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
d140: 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
d150: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
d160: 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
d170: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
d180: 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
d190: 74 65 33 56 64 62 65 53 65 72 69 61 6c 52 65 61  te3VdbeSerialRea
d1a0: 64 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  d().** sqlite3Vd
d1b0: 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
d1c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d1d0: 61 6c 57 72 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20  alWrite().**.** 
d1e0: 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
d1f0: 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
d200: 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
d210: 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
d220: 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
d230: 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
d240: 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
d250: 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
d260: 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
d270: 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
d280: 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
d290: 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
d2a0: 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
d2b0: 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
d2c0: 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
d2d0: 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
d2e0: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
d2f0: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
d300: 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
d310: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
d320: 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
d330: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
d340: 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
d350: 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
d360: 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
d370: 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
d380: 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
d390: 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
d3a0: 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
d3b0: 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
d3c0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
d3d0: 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
d3e0: 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
d3f0: 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
d400: 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
d410: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
d420: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
d430: 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
d440: 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
d450: 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
d460: 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
d470: 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
d480: 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
d490: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
d4a0: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
d4b0: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
d4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
d4d0: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d4e0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
d4f0: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
d500: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
d510: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
d520: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
d530: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
d560: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d570: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
d590: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d5a0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d5b0: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
d5c0: 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
d5d0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
d5e0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
d610: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d620: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
d630: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
d640: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d650: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d660: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
d670: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
d680: 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
d690: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
d6b0: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
d6c0: 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
d6d0: 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
d6e0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
d6f0: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
d700: 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
d710: 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
d740: 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
d750: 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
d760: 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
d770: 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
d780: 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
d790: 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
d7a0: 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
d7b0: 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
d7c0: 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
d7d0: 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
d7e0: 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
d7f0: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
d800: 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
d810: 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
d820: 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
d830: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d840: 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
d850: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
d860: 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
d870: 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
d880: 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
d890: 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
d8a0: 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
d8b0: 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
d8c0: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
d8d0: 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
d8e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d8f0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
d900: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
d910: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
d920: 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
d930: 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
d940: 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
d950: 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
d960: 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
d970: 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
d980: 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
d990: 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
d9a0: 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
d9b0: 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
d9c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 69        return 8+i
d9d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20  ;.    }.    u = 
d9e0: 69 3c 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20  i<0 ? -i : i;.  
d9f0: 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72    if( u<=127 ) r
da00: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28  eturn 1;.    if(
da10: 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
da20: 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
da30: 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
da40: 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
da50: 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
da60: 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
da70: 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
da80: 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
da90: 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
daa0: 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
dab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
dac0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 6c    }.  assert( fl
dad0: 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
dae0: 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20  _Blob) );.  n = 
daf0: 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
db00: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
db10: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
db20: 2d 3e 75 2e 69 3b 0a 20 20 7d 0a 20 20 61 73 73  ->u.i;.  }.  ass
db30: 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 72  ert( n>=0 );.  r
db40: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31  eturn ((n*2) + 1
db50: 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f  2 + ((flags&MEM_
db60: 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a  Str)!=0));.}../*
db70: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
db80: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
db90: 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
dba0: 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
dbb0: 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
dbc0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
dbd0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
dbe0: 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
dbf0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
dc00: 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75  >=12 ){.    retu
dc10: 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d  rn (serial_type-
dc20: 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a  12)/2;.  }else{.
dc30: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
dc40: 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20   u8 aSize[] = { 
dc50: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36  0, 1, 2, 3, 4, 6
dc60: 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c  , 8, 8, 0, 0, 0,
dc70: 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e   0 };.    return
dc80: 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79   aSize[serial_ty
dc90: 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  pe];.  }.}../*.*
dca0: 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61  * If we are on a
dcb0: 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77  n architecture w
dcc0: 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  ith mixed-endian
dcd0: 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f   floating .** po
dce0: 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20  ints (ex: ARM7) 
dcf0: 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f  then swap the lo
dd00: 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68  wer 4 bytes with
dd10: 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34   the .** upper 4
dd20: 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20   bytes.  Return 
dd30: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
dd40: 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69  * For most archi
dd50: 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69  tectures, this i
dd60: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
dd70: 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73   (later):  It is
dd80: 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20   reported to me 
dd90: 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65  that the mixed-e
dda0: 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a  ndian problem.**
ddb0: 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69   on ARM7 is an i
ddc0: 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e  ssue with GCC, n
ddd0: 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37  ot with the ARM7
dde0: 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73   chip.  It seems
ddf0: 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76  .** that early v
de00: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73  ersions of GCC s
de10: 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f  tored the two wo
de20: 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a  rds of a 64-bit.
de30: 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20  ** float in the 
de40: 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e  wrong order.  An
de50: 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73  d that error has
de60: 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64   been propagated
de70: 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20  .** ever since. 
de80: 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f   The blame is no
de90: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69  t necessarily wi
dea0: 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a  th GCC, though..
deb0: 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76  ** GCC might hav
dec0: 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74  e just copying t
ded0: 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20  he problem from 
dee0: 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72  a prior compiler
def0: 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74  ..** I am also t
df00: 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76  old that newer v
df10: 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74  ersions of GCC t
df20: 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66  hat follow a dif
df30: 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65  ferent.** ABI ge
df40: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
df50: 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65   right..**.** De
df60: 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53  velopers using S
df70: 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37  QLite on an ARM7
df80: 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20   should compile 
df90: 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a  and run their.**
dfa0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69   application usi
dfb0: 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55  ng -DSQLITE_DEBU
dfc0: 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  G=1 at least onc
dfd0: 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a  e.  With DEBUG.*
dfe0: 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20  * enabled, some 
dff0: 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69  asserts below wi
e000: 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ll ensure that t
e010: 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66  he byte order of
e020: 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  .** floating poi
e030: 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72  nt values is cor
e040: 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30  rect..**.** (200
e050: 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20  7-08-30)  Frank 
e060: 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75  van Vugt has stu
e070: 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65  died this proble
e080: 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64  m closely.** and
e090: 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69   has send his fi
e0a0: 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51  ndings to the SQ
e0b0: 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e  Lite developers.
e0c0: 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65    Frank.** write
e0d0: 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75  s that some Linu
e0e0: 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20  x kernels offer 
e0f0: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68  floating point h
e100: 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61  ardware.** emula
e110: 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f  tion that uses o
e120: 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69  nly 32-bit manti
e130: 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20  ssas instead of 
e140: 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69  a full .** 48-bi
e150: 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62  ts as required b
e160: 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64  y the IEEE stand
e170: 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74  ard.  (This is t
e180: 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45  he.** CONFIG_FPE
e190: 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e  _FASTFPE option.
e1a0: 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65  )  On such syste
e1b0: 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ms, floating poi
e1c0: 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70  nt.** byte swapp
e1d0: 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79  ing becomes very
e1e0: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54   complicated.  T
e1f0: 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73  o avoid problems
e200: 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61  ,.** the necessa
e210: 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ry byte swapping
e220: 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20   is carried out 
e230: 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69  using a 64-bit i
e240: 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72  nteger.** rather
e250: 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66   than a 64-bit f
e260: 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73  loat.  Frank ass
e270: 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65  ures us that the
e280: 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f   code here.** wo
e290: 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65  rks for him.  We
e2a0: 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73  , the developers
e2b0: 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f  , have no way to
e2c0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a   independently.*
e2d0: 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62  * verify this, b
e2e0: 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74  ut Frank seems t
e2f0: 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69  o know what he i
e300: 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a  s talking about.
e310: 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68  ** so we trust h
e320: 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  im..*/.#ifdef SQ
e330: 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
e340: 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74  N_64BIT_FLOAT.st
e350: 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77  atic u64 floatSw
e360: 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e  ap(u64 in){.  un
e370: 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b  ion {.    u64 r;
e380: 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20  .    u32 i[2];. 
e390: 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a   } u;.  u32 t;..
e3a0: 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20    u.r = in;.  t 
e3b0: 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b  = u.i[0];.  u.i[
e3c0: 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75  0] = u.i[1];.  u
e3d0: 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74  .i[1] = t;.  ret
e3e0: 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66  urn u.r;.}.# def
e3f0: 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
e400: 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d  ianFloat(X)  X =
e410: 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65   floatSwap(X).#e
e420: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61  lse.# define swa
e430: 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
e440: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(X).#endif../*.
e450: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72  ** Write the ser
e460: 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f  ialized data blo
e470: 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  b for the value 
e480: 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69  stored in pMem i
e490: 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20  nto .** buf. It 
e4a0: 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
e4b0: 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
e4c0: 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69  llocated suffici
e4d0: 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65  ent space..** Re
e4e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
e4f0: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
e500: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20  ..**.** nBuf is 
e510: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70  the amount of sp
e520: 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b  ace left in buf[
e530: 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 20 61 6c  ].  nBuf must al
e540: 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 72 67 65  ways be.** large
e550: 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
e560: 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64  the entire field
e570: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  .  Except, if th
e580: 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a 20 61 20  e field is.** a 
e590: 62 6c 6f 62 20 77 69 74 68 20 61 20 7a 65 72 6f  blob with a zero
e5a0: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c 20 74 68  -filled tail, th
e5b0: 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 74 20 62  en buf[] might b
e5c0: 65 20 6a 75 73 74 20 74 68 65 20 72 69 67 68 74  e just the right
e5d0: 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 6f 6c 64  .** size to hold
e5e0: 20 65 76 65 72 79 74 68 69 6e 67 20 65 78 63 65   everything exce
e5f0: 70 74 20 66 6f 72 20 74 68 65 20 7a 65 72 6f 2d  pt for the zero-
e600: 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 20 49 66  filled tail.  If
e610: 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c   buf[].** is onl
e620: 79 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  y big enough to 
e630: 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d 7a 65 72  hold the non-zer
e640: 6f 20 70 72 65 66 69 78 2c 20 74 68 65 6e 20 6f  o prefix, then o
e650: 6e 6c 79 20 77 72 69 74 65 20 74 68 61 74 0a 2a  nly write that.*
e660: 2a 20 70 72 65 66 69 78 20 69 6e 74 6f 20 62 75  * prefix into bu
e670: 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 62 75 66  f[].  But if buf
e680: 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  [] is large enou
e690: 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f 74 68 20  gh to hold both 
e6a0: 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 20 61 6e  the.** prefix an
e6b0: 64 20 74 68 65 20 74 61 69 6c 20 74 68 65 6e 20  d the tail then 
e6c0: 77 72 69 74 65 20 74 68 65 20 70 72 65 66 69 78  write the prefix
e6d0: 20 61 6e 64 20 73 65 74 20 74 68 65 20 74 61 69   and set the tai
e6e0: 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f  l to all.** zero
e6f0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
e700: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
e710: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
e720: 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
e730: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
e740: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
e750: 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
e760: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
e770: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
e780: 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
e790: 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
e7a0: 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
e7b0: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62   .int sqlite3Vdb
e7c0: 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
e7d0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c 20 4d 65  uf, int nBuf, Me
e7e0: 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
e7f0: 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 75 33 32  e_format){.  u32
e800: 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73   serial_type = s
e810: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e820: 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 6c 65 5f  Type(pMem, file_
e830: 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e 74 20 6c  format);.  int l
e840: 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
e850: 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
e860: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
e870: 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
e880: 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
e890: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
e8a0: 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
e8b0: 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
e8c0: 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
e8d0: 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 20  sizeof(pMem->r) 
e8e0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
e8f0: 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20 73 69  &v, &pMem->r, si
e900: 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
e910: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
e920: 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
e930: 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
e940: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
e950: 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
e960: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
e970: 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
e980: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e990: 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20  len<=nBuf );.   
e9a0: 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20   while( i-- ){. 
e9b0: 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76       buf[i] = (v
e9c0: 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
e9d0: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
e9e0: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
e9f0: 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
ea00: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
ea10: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
ea20: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
ea30: 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
ea40: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
ea50: 29 3f 70 4d 65 6d 2d 3e 75 2e 69 3a 30 29 0a 20  )?pMem->u.i:0). 
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 73              == s
ea70: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ea80: 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
ea90: 79 70 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ype) );.    asse
eaa0: 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75  rt( pMem->n<=nBu
eab0: 66 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  f );.    len = p
eac0: 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63  Mem->n;.    memc
ead0: 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c  py(buf, pMem->z,
eae0: 20 6c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70   len);.    if( p
eaf0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
eb00: 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 6c  _Zero ){.      l
eb10: 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  en += pMem->u.i;
eb20: 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e  .      if( len>n
eb30: 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Buf ){.        l
eb40: 65 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20  en = nBuf;.     
eb50: 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
eb60: 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30  &buf[pMem->n], 0
eb70: 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a  , len-pMem->n);.
eb80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
eb90: 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
eba0: 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
ebb0: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
ebc0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ebd0: 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
ebe0: 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
ebf0: 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
ec00: 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
ec10: 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
ec20: 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
ec30: 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
ec40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
ec50: 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69  ytes read..*/ .i
ec60: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt sqlite3VdbeSe
ec70: 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
ec80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ec90: 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
eca0: 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
ecb0: 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
ecc0: 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
ecd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
ece0: 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
ecf0: 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
ed00: 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
ed10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
ed20: 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
ed30: 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
ed40: 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
ed50: 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
ed60: 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
ed70: 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
ed80: 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
ed90: 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
eda0: 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
edb0: 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
edc0: 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f  0: {  /* NULL */
edd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
ede0: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
edf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ee00: 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  }.    case 1: { 
ee10: 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
ee20: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
ee30: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73    pMem->u.i = (s
ee40: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
ee50: 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  ];.      pMem->f
ee60: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
ee70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
ee80: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
ee90: 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
eea0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
eeb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
eec0: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
eed0: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
eee0: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[1];.      pMe
eef0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
ef00: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
ef10: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
ef20: 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
ef30: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
ef40: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
ef50: 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20  u.i = (((signed 
ef60: 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36  char)buf[0])<<16
ef70: 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20  ) | (buf[1]<<8) 
ef80: 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20  | buf[2];.      
ef90: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
efa0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
efb0: 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
efc0: 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
efd0: 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
efe0: 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
eff0: 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d  m->u.i = (buf[0]
f000: 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c  <<24) | (buf[1]<
f010: 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c  <16) | (buf[2]<<
f020: 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20  8) | buf[3];.   
f030: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f040: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f050: 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a  return 4;.    }.
f060: 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a      case 5: { /*
f070: 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   6-byte signed i
f080: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f090: 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65  u64 x = (((signe
f0a0: 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c  d char)buf[0])<<
f0b0: 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20  8) | buf[1];.   
f0c0: 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b     u32 y = (buf[
f0d0: 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33  2]<<24) | (buf[3
f0e0: 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d  ]<<16) | (buf[4]
f0f0: 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20  <<8) | buf[5];. 
f100: 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
f110: 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d   | y;.      pMem
f120: 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
f130: 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  x;.      pMem->f
f140: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
f150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
f160: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
f170: 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
f180: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
f190: 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
f1a0: 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
f1b0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36  oint */.      u6
f1c0: 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79  4 x;.      u32 y
f1d0: 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ;.#if !defined(N
f1e0: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
f1f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
f200: 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
f210: 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74       /* Verify t
f220: 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64  hat integers and
f230: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
f240: 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73  values use the s
f250: 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  ame.      ** byt
f260: 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
f270: 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
f280: 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
f290: 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a  FLOAT is.      *
f2a0: 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
f2b0: 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
f2c0: 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
f2d0: 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
f2e0: 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
f2f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61      */.      sta
f300: 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31  tic const u64 t1
f310: 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30   = ((u64)0x3ff00
f320: 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20  000)<<32;.      
f330: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
f340: 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
f350: 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
f360: 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64  .      swapMixed
f370: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b  EndianFloat(t2);
f380: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
f390: 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
f3a0: 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
f3b0: 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
f3c0: 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
f3d0: 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62  if..      x = (b
f3e0: 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75  uf[0]<<24) | (bu
f3f0: 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66  f[1]<<16) | (buf
f400: 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d  [2]<<8) | buf[3]
f410: 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66  ;.      y = (buf
f420: 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b  [4]<<24) | (buf[
f430: 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36  5]<<16) | (buf[6
f440: 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a  ]<<8) | buf[7];.
f450: 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
f460: 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28  ) | y;.      if(
f470: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20   serial_type==6 
f480: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
f490: 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
f4a0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
f4b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f4c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f4d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
f4e0: 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
f4f0: 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38  zeof(pMem->r)==8
f500: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70   );.        swap
f510: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
f520: 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  (x);.        mem
f530: 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78  cpy(&pMem->r, &x
f540: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
f550: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
f560: 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
f570: 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f  (pMem->r) ? MEM_
f580: 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
f590: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f5a0: 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20  eturn 8;.    }. 
f5b0: 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
f5c0: 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
f5d0: 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
f5e0: 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
f5f0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
f600: 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
f610: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f620: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
f630: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
f640: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
f650: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
f660: 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
f670: 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
f680: 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b  z = (char *)buf;
f690: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
f6a0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d   len;.      pMem
f6b0: 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20  ->xDel = 0;.    
f6c0: 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
f6d0: 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  e&0x01 ){.      
f6e0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
f6f0: 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70  MEM_Str | MEM_Ep
f700: 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  hem;.      }else
f710: 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
f720: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62  flags = MEM_Blob
f730: 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20   | MEM_Ephem;.  
f740: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
f750: 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  rn len;.    }.  
f760: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f770: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
f780: 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f  e nKey-byte enco
f790: 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64  ding of a record
f7a0: 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73   in pKey[], pars
f7b0: 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  e the.** record 
f7c0: 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52  into a UnpackedR
f7d0: 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e  ecord structure.
f7e0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
f7f0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74  er to.** that st
f800: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54  ructure..**.** T
f810: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
f820: 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64  ion might provid
f830: 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20  e szSpace bytes 
f840: 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61  of memory.** spa
f850: 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54  ce at pSpace.  T
f860: 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65  his space can be
f870: 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
f880: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44  e returned.** VD
f890: 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73  beParsedRecord s
f8a0: 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69  tructure if it i
f8b0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20  s large enough. 
f8c0: 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74   If it is.** not
f8d0: 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61   big enough, spa
f8e0: 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ce is obtained f
f8f0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
f900: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oc()..**.** The 
f910: 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75  returned structu
f920: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f  re should be clo
f930: 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
f940: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44  .** sqlite3VdbeD
f950: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
f960: 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63  ord()..*/ .Unpac
f970: 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
f980: 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
f990: 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
f9a0: 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
f9b0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
f9c0: 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
f9d0: 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
f9e0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
f9f0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
fa00: 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
fa10: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
fa20: 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
fa30: 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
fa40: 0a 20 20 76 6f 69 64 20 2a 70 53 70 61 63 65 2c  .  void *pSpace,
fa50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
fa60: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ce available to 
fa70: 68 6f 6c 64 20 72 65 73 75 6c 74 69 6e 67 20 6f  hold resulting o
fa80: 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 73  bject */.  int s
fa90: 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 20 20  zSpace          
faa0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
fab0: 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
fac0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
fad0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
fae0: 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
faf0: 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
fb00: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
fb10: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65   *p;.  int nByte
fb20: 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 78 2c 20  ;.  int i, idx, 
fb30: 64 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  d;.  u32 szHdr;.
fb40: 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 0a    Mem *pMem;.  .
fb50: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
fb60: 28 4d 65 6d 29 3e 73 69 7a 65 6f 66 28 2a 70 29  (Mem)>sizeof(*p)
fb70: 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   );.  nByte = si
fb80: 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
fb90: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 32 29 3b 0a  nfo->nField+2);.
fba0: 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
fbb0: 61 63 65 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  ace ){.    p = s
fbc0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
fbd0: 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  w(pKeyInfo->db, 
fbe0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
fbf0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
fc00: 0a 20 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65  .    p->needFree
fc10: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
fc20: 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20     p = pSpace;. 
fc30: 20 20 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 3d     p->needFree =
fc40: 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65   0;.  }.  p->pKe
fc50: 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
fc60: 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
fc70: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
fc80: 20 2b 20 31 3b 0a 20 20 70 2d 3e 6e 65 65 64 44   + 1;.  p->needD
fc90: 65 73 74 72 6f 79 20 3d 20 31 3b 0a 20 20 70 2d  estroy = 1;.  p-
fca0: 3e 61 4d 65 6d 20 3d 20 70 4d 65 6d 20 3d 20 26  >aMem = pMem = &
fcb0: 28 28 4d 65 6d 2a 29 70 29 5b 31 5d 3b 0a 20 20  ((Mem*)p)[1];.  
fcc0: 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
fcd0: 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
fce0: 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 69    d = szHdr;.  i
fcf0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
fd00: 64 78 3c 73 7a 48 64 72 20 26 26 20 69 3c 70 2d  dx<szHdr && i<p-
fd10: 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
fd20: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
fd30: 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
fd40: 61 72 69 6e 74 33 32 28 20 61 4b 65 79 2b 69 64  arint32( aKey+id
fd50: 78 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  x, serial_type);
fd60: 0a 20 20 20 20 69 66 28 20 64 3e 3d 6e 4b 65 79  .    if( d>=nKey
fd70: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53   && sqlite3VdbeS
fd80: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
fd90: 69 61 6c 5f 74 79 70 65 29 3e 30 20 29 20 62 72  ial_type)>0 ) br
fda0: 65 61 6b 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  eak;.    pMem->e
fdb0: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
fdc0: 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
fdd0: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
fde0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
fdf0: 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
fe00: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
fe10: 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
fe20: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
fe30: 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
fe40: 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
fe50: 6d 2b 2b 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  m++;.    i++;.  
fe60: 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  }.  p->nField = 
fe70: 69 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69  i;.  return (voi
fe80: 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  d*)p;.}../*.** T
fe90: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 74  his routine dest
fea0: 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 52  roys a UnpackedR
feb0: 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f 0a  ecord object.*/.
fec0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
fed0: 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
fee0: 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65 63  cord(UnpackedRec
fef0: 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ord *p){.  if( p
ff00: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
ff10: 65 65 64 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  eedDestroy ){.  
ff20: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ff30: 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20   Mem *pMem;.    
ff40: 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d    for(i=0, pMem=
ff50: 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46  p->aMem; i<p->nF
ff60: 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  ield; i++, pMem+
ff70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
ff80: 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b  pMem->zMalloc ){
ff90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ffa0: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ffb0: 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  (pMem);.        
ffc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ffd0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 46      if( p->needF
ffe0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ree ){.      sql
fff0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
10000 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
10010 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
10020 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20  ompares the two 
10030 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e  table rows or in
10040 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73  dex records.** s
10050 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65  pecified by {nKe
10060 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70  y1, pKey1} and p
10070 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72  PKey2.  It retur
10080 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a  ns a negative, z
10090 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
100a0 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 7b 6e  ve integer if {n
100b0 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 69 73 20  Key1, pKey1} is 
100c0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
100d0 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
100e0 65 72 20 74 68 61 6e 20 70 50 4b 65 79 32 2e 20  er than pPKey2. 
100f0 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
10100 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
10110 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
10120 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52  d by th OP_MakeR
10130 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
10140 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
10150 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
10160 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
10170 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
10180 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
10190 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
101a0 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e  d..**.** Key1 an
101b0 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61  d Key2 do not ha
101c0 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  ve to contain th
101d0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
101e0 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 42 75 74 20   fields..** But 
101f0 69 66 20 74 68 65 20 6c 65 6e 67 74 68 73 20 64  if the lengths d
10200 69 66 66 65 72 2c 20 4b 65 79 32 20 6d 75 73 74  iffer, Key2 must
10210 20 62 65 20 74 68 65 20 73 68 6f 72 74 65 72 20   be the shorter 
10220 6f 66 20 74 68 65 20 74 77 6f 2e 0a 2a 2a 0a 2a  of the two..**.*
10230 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 6e 6f 74  * Historical not
10240 65 3a 20 49 6e 20 65 61 72 6c 69 65 72 20 76 65  e: In earlier ve
10250 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 72  rsions of this r
10260 6f 75 74 69 6e 65 20 62 6f 74 68 20 4b 65 79 31  outine both Key1
10270 0a 2a 2a 20 61 6e 64 20 4b 65 79 32 20 77 65 72  .** and Key2 wer
10280 65 20 62 6c 6f 62 73 20 6f 62 74 61 69 6e 65 64  e blobs obtained
10290 20 66 72 6f 6d 20 4f 50 5f 4d 61 6b 65 52 65 63   from OP_MakeRec
102a0 6f 72 64 2e 20 20 42 75 74 20 77 65 20 66 6f 75  ord.  But we fou
102b0 6e 64 0a 2a 2a 20 74 68 61 74 20 69 6e 20 74 79  nd.** that in ty
102c0 70 69 63 61 6c 20 75 73 65 20 74 68 65 20 73 61  pical use the sa
102d0 6d 65 20 4b 65 79 32 20 77 6f 75 6c 64 20 62 65  me Key2 would be
102e0 20 73 75 62 6d 69 74 74 65 64 20 6d 75 6c 74 69   submitted multi
102f0 70 6c 65 20 74 69 6d 65 73 0a 2a 2a 20 69 6e 20  ple times.** in 
10300 61 20 72 6f 77 2e 20 20 53 6f 20 61 6e 20 6f 70  a row.  So an op
10310 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 61  timization was a
10320 64 64 65 64 20 74 6f 20 70 61 72 73 65 20 74 68  dded to parse th
10330 65 20 4b 65 79 32 20 6b 65 79 0a 2a 2a 20 73 65  e Key2 key.** se
10340 70 61 72 61 74 65 6c 79 20 61 6e 64 20 73 75 62  parately and sub
10350 6d 69 74 20 74 68 65 20 70 61 72 73 65 64 20 76  mit the parsed v
10360 65 72 73 69 6f 6e 2e 20 20 49 6e 20 74 68 69 73  ersion.  In this
10370 20 77 61 79 2c 20 77 65 20 61 76 6f 69 64 0a 2a   way, we avoid.*
10380 2a 20 70 61 72 73 69 6e 67 20 74 68 65 20 73 61  * parsing the sa
10390 6d 65 20 4b 65 79 32 20 6d 75 6c 74 69 70 6c 65  me Key2 multiple
103a0 20 74 69 6d 65 73 20 69 6e 20 61 20 72 6f 77 2e   times in a row.
103b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
103c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
103d0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
103e0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
103f0 2c 20 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  , .  UnpackedRec
10400 6f 72 64 20 2a 70 50 4b 65 79 32 0a 29 7b 0a 20  ord *pPKey2.){. 
10410 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20   u32 d1;        
10420 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
10430 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
10440 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a  t data element *
10450 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
10460 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
10470 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
10480 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d  next header elem
10490 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48  ent */.  u32 szH
104a0 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  dr1;        /* N
104b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
104c0 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
104d0 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  t i = 0;.  int n
104e0 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20  Field;.  int rc 
104f0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
10500 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
10510 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
10520 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
10530 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
10540 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
10550 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
10560 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
10570 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  o;.  mem1.enc = 
10580 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
10590 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
105a0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e  nfo->db;.  mem1.
105b0 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d  flags = 0;.  mem
105c0 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  1.zMalloc = 0;. 
105d0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
105e0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
105f0 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
10600 48 64 72 31 3b 0a 20 20 6e 46 69 65 6c 64 20 3d  Hdr1;.  nField =
10610 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10620 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31  d;.  while( idx1
10630 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
10640 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20  ey2->nField ){. 
10650 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
10660 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  pe1;..    /* Rea
10670 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  d the serial typ
10680 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  es for the next 
10690 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20  element in each 
106a0 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31  key. */.    idx1
106b0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
106c0 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72   aKey1+idx1, ser
106d0 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20  ial_type1 );.   
106e0 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26   if( d1>=nKey1 &
106f0 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  & sqlite3VdbeSer
10700 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
10710 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65  l_type1)>0 ) bre
10720 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72  ak;..    /* Extr
10730 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
10740 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
10750 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
10760 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10770 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
10780 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
10790 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
107a0 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
107b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
107c0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
107d0 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
107e0 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20  2->aMem[i],.    
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20         i<nField 
10810 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  ? pKeyInfo->aCol
10820 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69  l[i] : 0);.    i
10830 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
10840 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
10850 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     i++;.  }.  if
10860 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29  ( mem1.zMalloc )
10870 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
10880 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a  elease(&mem1);..
10890 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
108a0 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
108b0 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c 20  fields, but all 
108c0 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
108d0 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a 2a   that point.  **
108e0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 20   were equal. If 
108f0 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 67  the incrKey flag
10900 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
10910 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 73  he second key is
10920 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73  .  ** treated as
10930 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 20   larger..  */.  
10940 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
10950 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 69   if( pKeyInfo->i
10960 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ncrKey ){.      
10970 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  rc = -1;.    }el
10980 73 65 20 69 66 28 20 21 70 4b 65 79 49 6e 66 6f  se if( !pKeyInfo
10990 2d 3e 70 72 65 66 69 78 49 73 45 71 75 61 6c 20  ->prefixIsEqual 
109a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 31 3c  ){.      if( d1<
109b0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
109c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
109d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
109e0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
109f0 72 74 4f 72 64 65 72 20 26 26 20 69 3c 70 4b 65  rtOrder && i<pKe
10a00 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 0a 20 20  yInfo->nField.  
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
10a20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
10a30 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72  rder[i] ){.    r
10a40 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20  c = -rc;.  }..  
10a50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10a60 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
10a70 20 69 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   is an index ent
10a80 72 79 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e  ry composed usin
10a90 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
10aa0 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54  ord opcode..** T
10ab0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
10ac0 20 74 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f   this record sho
10ad0 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
10ae0 72 20 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a  r (specifically.
10af0 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f  ** an integer ro
10b00 77 69 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74  wid).  This rout
10b10 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
10b20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
10b30 69 6e 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67  in.** that integ
10b40 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
10b50 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65  e3VdbeIdxRowidLe
10b60 6e 28 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  n(const u8 *aKey
10b70 29 7b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  ){.  u32 szHdr; 
10b80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10b90 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
10ba0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
10bb0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
10bc0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
10bd0 2a 2f 0a 0a 20 20 28 76 6f 69 64 29 67 65 74 56  */..  (void)getV
10be0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
10bf0 48 64 72 29 3b 0a 20 20 28 76 6f 69 64 29 67 65  Hdr);.  (void)ge
10c00 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b  tVarint32(&aKey[
10c10 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f  szHdr-1], typeRo
10c20 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  wid);.  return s
10c30 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
10c40 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69  TypeLen(typeRowi
10c50 64 29 3b 0a 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20  d);.}.  ../*.** 
10c60 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
10c70 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
10c80 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
10c90 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
10ca0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
10cb0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
10cc0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
10cd0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
10ce0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
10cf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10d00 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
10d10 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
10d20 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
10d30 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
10d40 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 42  e3VdbeIdxRowid(B
10d50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
10d60 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36  64 *rowid){.  i6
10d70 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
10d80 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
10d90 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  szHdr;        /*
10da0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   Size of the hea
10db0 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70  der */.  u32 typ
10dc0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65  eRowid;    /* Se
10dd0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65  rial type of the
10de0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20   rowid */.  u32 
10df0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a  lenRowid;     /*
10e00 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77   Size of the row
10e10 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76  id */.  Mem m, v
10e20 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
10e30 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
10e40 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
10e50 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a   nCellKey<=0 ){.
10e60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
10e80 20 20 7d 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20    }.  m.flags = 
10e90 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20  0;.  m.db = 0;. 
10ea0 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a   m.zMalloc = 0;.
10eb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
10ec0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
10ed0 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79  Cur, 0, nCellKey
10ee0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
10ef0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
10f00 20 72 63 3b 0a 20 20 7d 0a 20 20 28 76 6f 69 64   rc;.  }.  (void
10f10 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
10f20 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
10f30 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
10f40 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
10f50 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
10f60 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20  );.  lenRowid = 
10f70 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10f80 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77  lTypeLen(typeRow
10f90 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  id);.  sqlite3Vd
10fa0 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
10fb0 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
10fc0 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
10fd0 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
10fe0 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
10ff0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
11000 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
11010 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
11020 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
11030 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
11040 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
11050 70 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61  pC is point to a
11060 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
11070 79 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79  y string in pKey
11080 20 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79   (of length nKey
11090 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  ).  Write into *
110a0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
110b0 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
110c0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
110d0 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
110e0 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
110f0 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
11100 20 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74   than pKey.  Ret
11110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
11120 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
11130 70 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63  pKey is either c
11140 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61  reated without a
11150 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75   rowid or is tru
11160 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69  ncated so that i
11170 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72  t.** omits the r
11180 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e  owid at the end.
11190 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74    The rowid at t
111a0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e  he end of the in
111b0 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20  dex entry.** is 
111c0 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e  ignored as well.
111d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
111e0 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
111f0 28 0a 20 20 43 75 72 73 6f 72 20 2a 70 43 2c 20  (.  Cursor *pC, 
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
11220 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
11230 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
11240 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
11250 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e  .  int nKey, con
11260 73 74 20 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f  st u8 *pKey,   /
11270 2a 20 54 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d  * The key to com
11280 70 61 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72  pare */.  int *r
11290 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  es              
112a0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
112b0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
112c0 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
112d0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
112e0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
112f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d  BtCursor *pCur =
11300 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20   pC->pCursor;.  
11310 69 6e 74 20 6c 65 6e 52 6f 77 69 64 3b 0a 20 20  int lenRowid;.  
11320 4d 65 6d 20 6d 3b 0a 20 20 55 6e 70 61 63 6b 65  Mem m;.  Unpacke
11330 64 52 65 63 6f 72 64 20 2a 70 52 65 63 3b 0a 20  dRecord *pRec;. 
11340 20 63 68 61 72 20 7a 53 70 61 63 65 5b 32 30 30   char zSpace[200
11350 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ];..  sqlite3Btr
11360 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
11370 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66  &nCellKey);.  if
11380 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b  ( nCellKey<=0 ){
11390 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
113a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
113b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64 62 20  _OK;.  }.  m.db 
113c0 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73 20 3d  = 0;.  m.flags =
113d0 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f 63 20   0;.  m.zMalloc 
113e0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
113f0 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
11400 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c  ree(pC->pCursor,
11410 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c   0, nCellKey, 1,
11420 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
11430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11440 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
11450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  = sqlite3VdbeIdx
11460 52 6f 77 69 64 4c 65 6e 28 28 75 38 2a 29 6d 2e  RowidLen((u8*)m.
11470 7a 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70 61  z);.  if( !pUnpa
11480 63 6b 65 64 20 29 7b 0a 20 20 20 20 70 52 65 63  cked ){.    pRec
11490 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
114a0 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 2d 3e 70  cordUnpack(pC->p
114b0 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70  KeyInfo, nKey, p
114c0 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Key,.           
114d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114e0 20 20 20 20 20 7a 53 70 61 63 65 2c 20 73 69 7a       zSpace, siz
114f0 65 6f 66 28 7a 53 70 61 63 65 29 29 3b 0a 20 20  eof(zSpace));.  
11500 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 63 20  }else{.    pRec 
11510 3d 20 70 55 6e 70 61 63 6b 65 64 3b 0a 20 20 7d  = pUnpacked;.  }
11520 0a 20 20 69 66 28 20 70 52 65 63 3d 3d 30 20 29  .  if( pRec==0 )
11530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11540 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
11550 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56   *res = sqlite3V
11560 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
11570 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d  (m.n-lenRowid, m
11580 2e 7a 2c 20 70 52 65 63 29 3b 0a 20 20 69 66 28  .z, pRec);.  if(
11590 20 21 70 55 6e 70 61 63 6b 65 64 20 29 7b 0a 20   !pUnpacked ){. 
115a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
115b0 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
115c0 72 64 28 70 52 65 63 29 3b 0a 20 20 7d 0a 20 20  rd(pRec);.  }.  
115d0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
115e0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
115f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
11600 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11610 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
11620 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
11630 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
11640 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
11650 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
11660 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
11670 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
11680 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
11690 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
116a0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
116b0 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
116c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
116d0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
116e0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
116f0 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
11700 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
11710 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
11720 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
11730 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
11740 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
11750 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
11760 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
11770 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
11780 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
11790 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
117a0 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
117b0 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
117c0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
117d0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
117e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
117f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11800 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
11810 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
11820 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
11830 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
11840 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
11850 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
11860 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
11870 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
11880 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
11890 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
118a0 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
118b0 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
118c0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
118d0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
118e0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
118f0 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
11900 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
11910 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
11920 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
11930 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
11940 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
11950 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
11960 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
11970 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
11980 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
11990 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
119a0 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
119b0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
119c0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
119d0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
119e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
119f0 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
11a00 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
11a10 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
11a20 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
11a30 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
11a40 64 62 3b 0a 7d 0a                                db;.}.