/ Hex Artifact Content
Login

Artifact 734d27d1e18bb4fb3c7f94d499039a8d3bbf8407:


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 39 35 20 32  eaux.c,v 1.395 2
02c0: 30 30 38 2f 30 37 2f 30 38 20 32 32 3a 32 38 3a  008/07/08 22:28:
02d0: 34 39 20 73 68 61 6e 65 20 45 78 70 20 24 0a 2a  49 shane Exp $.*
02e0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02f0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
0300: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e 63  e <ctype.h>.#inc
0310: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
0320: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64  ..../*.** When d
0330: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64  ebugging the cod
0340: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61  e generator in a
0350: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67   symbolic debugg
0360: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73  er, one can.** s
0370: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  et the sqlite3Vd
0380: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20  beAddopTrace to 
0390: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65  1 and all opcode
03a0: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65  s will be printe
03b0: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65  d.** as they are
03c0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
03d0: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d  struction stream
03e0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
03f0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c  TE_DEBUG.int sql
0400: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0410: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ce = 0;.#endif..
0420: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
0430: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61  new virtual data
0440: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a  base engine..*/.
0450: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62  Vdbe *sqlite3Vdb
0460: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20  eCreate(sqlite3 
0470: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
0480: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
0490: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
04a0: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20  izeof(Vdbe) );. 
04b0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
04c0: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  rn 0;.  p->db = 
04d0: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56  db;.  if( db->pV
04e0: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70  dbe ){.    db->p
04f0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Vdbe->pPrev = p;
0500: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20  .  }.  p->pNext 
0510: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70  = db->pVdbe;.  p
0520: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64  ->pPrev = 0;.  d
0530: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20  b->pVdbe = p;.  
0540: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
0550: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65  MAGIC_INIT;.  re
0560: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
0570: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51   Remember the SQ
0580: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70  L string for a p
0590: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05a0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
05b0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62  e3VdbeSetSql(Vdb
05c0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
05d0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
05e0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
05f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  ;.  assert( p->z
0600: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0610: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0620: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
0630: 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   n);.}../*.** Re
0640: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
0650: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
0660: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
0670: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
0680: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0690: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
06a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 56 64  ){.  return ((Vd
06b0: 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 7a 53 71  be *)pStmt)->zSq
06c0: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  l;.}../*.** Swap
06d0: 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 74   all content bet
06e0: 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 74  ween two VDBE st
06f0: 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f 69  ructures..*/.voi
0700: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 61  d sqlite3VdbeSwa
0710: 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 65  p(Vdbe *pA, Vdbe
0720: 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 6d   *pB){.  Vdbe tm
0730: 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 72  p, *pTmp;.  char
0740: 20 2a 7a 54 6d 70 3b 0a 20 20 69 6e 74 20 6e 54   *zTmp;.  int nT
0750: 6d 70 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b  mp;.  tmp = *pA;
0760: 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20  .  *pA = *pB;.  
0770: 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d  *pB = tmp;.  pTm
0780: 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20  p = pA->pNext;. 
0790: 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d   pA->pNext = pB-
07a0: 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e  >pNext;.  pB->pN
07b0: 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54  ext = pTmp;.  pT
07c0: 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a  mp = pA->pPrev;.
07d0: 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 42    pA->pPrev = pB
07e0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70  ->pPrev;.  pB->p
07f0: 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a  Prev = pTmp;.  z
0800: 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a  Tmp = pA->zSql;.
0810: 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d    pA->zSql = pB-
0820: 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71  >zSql;.  pB->zSq
0830: 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 6e 54 6d 70  l = zTmp;.  nTmp
0840: 20 3d 20 70 41 2d 3e 6e 53 71 6c 3b 0a 20 20 70   = pA->nSql;.  p
0850: 41 2d 3e 6e 53 71 6c 20 3d 20 70 42 2d 3e 6e 53  A->nSql = pB->nS
0860: 71 6c 3b 0a 20 20 70 42 2d 3e 6e 53 71 6c 20 3d  ql;.  pB->nSql =
0870: 20 6e 54 6d 70 3b 0a 7d 0a 0a 23 69 66 64 65 66   nTmp;.}..#ifdef
0880: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0890: 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e 67  .** Turn tracing
08a0: 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 6f   on or off.*/.vo
08b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  id sqlite3VdbeTr
08c0: 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 4c  ace(Vdbe *p, FIL
08d0: 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d 3e  E *trace){.  p->
08e0: 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a 7d  trace = trace;.}
08f0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0900: 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61  esize the Vdbe.a
0910: 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  Op array so that
0920: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20   it contains at 
0930: 6c 65 61 73 74 20 4e 0a 2a 2a 20 65 6c 65 6d 65  least N.** eleme
0940: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  nts..**.** If an
0950: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65   out-of-memory e
0960: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
0970: 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61  e resizing the a
0980: 72 72 61 79 2c 0a 2a 2a 20 56 64 62 65 2e 61 4f  rray,.** Vdbe.aO
0990: 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c  p and Vdbe.nOpAl
09a0: 6c 6f 63 20 72 65 6d 61 69 6e 20 75 6e 63 68 61  loc remain uncha
09b0: 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f  nged (this is so
09c0: 20 74 68 61 74 0a 2a 2a 20 61 6e 79 20 6f 70 63   that.** any opc
09d0: 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  odes already all
09e0: 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 63 6f  ocated can be co
09f0: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0a00: 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74  ted.** along wit
0a10: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
0a20: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
0a30: 69 63 20 76 6f 69 64 20 72 65 73 69 7a 65 4f 70  ic void resizeOp
0a40: 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69  Array(Vdbe *p, i
0a50: 6e 74 20 4e 29 7b 0a 20 20 56 64 62 65 4f 70 20  nt N){.  VdbeOp 
0a60: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
0a70: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0a80: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  (p->db, p->aOp, 
0a90: 4e 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20  N*sizeof(Op));. 
0aa0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
0ab0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 4e   p->nOpAlloc = N
0ac0: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 20 3d 20 70  ;.    p->aOp = p
0ad0: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  New;.  }.}../*.*
0ae0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0af0: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0b00: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0b10: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0b20: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0b30: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0b40: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0b50: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0b60: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
0b70: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
0b80: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
0b90: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
0ba0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
0bb0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
0bc0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0bd0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
0be0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
0bf0: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
0c00: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
0c10: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
0c20: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
0c30: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
0c40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0c50: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
0c60: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
0c70: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
0c80: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  operand..*/.int 
0c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0ca0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0cb0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0cc0: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
0cd0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0ce0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0cf0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0d00: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0d10: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
0d20: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  p->nOpAlloc<=i )
0d30: 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f 70 41 72  {.    resizeOpAr
0d40: 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c  ray(p, p->nOpAll
0d50: 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  oc ? p->nOpAlloc
0d60: 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a 65 6f 66  *2 : 1024/sizeof
0d70: 28 4f 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70  (Op));.    if( p
0d80: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0d90: 65 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ed ){.      retu
0da0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
0db0: 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f    p->nOp++;.  pO
0dc0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
0dd0: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
0de0: 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20  op;.  pOp->p5 = 
0df0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70  0;.  pOp->p1 = p
0e00: 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70  1;.  pOp->p2 = p
0e10: 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70  2;.  pOp->p3 = p
0e20: 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  3;.  pOp->p4.p =
0e30: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70   0;.  pOp->p4typ
0e40: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
0e50: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
0e60: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
0e70: 44 45 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f  DEBUG.  pOp->zCo
0e80: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  mment = 0;.  if(
0e90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f   sqlite3VdbeAddo
0ea0: 70 54 72 61 63 65 20 29 20 73 71 6c 69 74 65 33  pTrace ) sqlite3
0eb0: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
0ec0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23  , &p->aOp[i]);.#
0ed0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42  endif.#ifdef VDB
0ee0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d  E_PROFILE.  pOp-
0ef0: 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70  >cycles = 0;.  p
0f00: 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e  Op->cnt = 0;.#en
0f10: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  dif.  return i;.
0f20: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
0f30: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c  eAddOp0(Vdbe *p,
0f40: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75   int op){.  retu
0f50: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
0f60: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30  dOp3(p, op, 0, 0
0f70: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
0f80: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64  te3VdbeAddOp1(Vd
0f90: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  be *p, int op, i
0fa0: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e  nt p1){.  return
0fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0fc0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(p, op, p1, 0,
0fd0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
0fe0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62  e3VdbeAddOp2(Vdb
0ff0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1000: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
1010: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1020: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1030: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a   p1, p2, 0);.}..
1040: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1050: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1060: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1070: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1080: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1090: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
10a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
10b0: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
10c0: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
10d0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
10e0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
10f0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1100: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1110: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1120: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1140: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1150: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1160: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1170: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1180: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1190: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
11a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
11b0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
11c0: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
11d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
11e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11f0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1200: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1210: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1220: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1230: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1240: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
1250: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
1260: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
1270: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
1280: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
1290: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
12a0: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
12b0: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
12c0: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
12d0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
12e0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
12f0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
1300: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
1310: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
1320: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
1330: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
1340: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
1350: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
1360: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
1370: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
1380: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
1390: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
13a0: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
13b0: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
13c0: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
13d0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
13e0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
13f0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
1400: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
1410: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
1420: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
1430: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
1440: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
1450: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
1460: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
1470: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
1480: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
1490: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
14a0: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
14b0: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
14c0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
14d0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 70  akeLabel(Vdbe *p
14e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  ){.  int i;.  i 
14f0: 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20  = p->nLabel++;. 
1500: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
1510: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
1520: 49 54 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70  IT );.  if( i>=p
1530: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b  ->nLabelAlloc ){
1540: 0a 20 20 20 20 70 2d 3e 6e 4c 61 62 65 6c 41 6c  .    p->nLabelAl
1550: 6c 6f 63 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 41  loc = p->nLabelA
1560: 6c 6c 6f 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20  lloc*2 + 10;.   
1570: 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c   p->aLabel = sql
1580: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
1590: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
15a0: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
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 70 2d 3e 6e 4c 61            p->nLa
15d0: 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  belAlloc*sizeof(
15e0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
15f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1600: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1610: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1620: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
1640: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
1650: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
1660: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
1670: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
1680: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
1690: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
16a0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
16b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
16c0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
16d0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16e0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
16f0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1700: 62 65 6c 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  bel(Vdbe *p, int
1710: 20 78 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d   x){.  int j = -
1720: 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1-x;.  assert( p
1730: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
1740: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
1750: 73 65 72 74 28 20 6a 3e 3d 30 20 26 26 20 6a 3c  sert( j>=0 && j<
1760: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
1770: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1780: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
1790: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d   = p->nOp;.  }.}
17a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72  ../*.** Loop thr
17b0: 6f 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d  ough the program
17c0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20   looking for P2 
17d0: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
17e0: 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a  negative.** on j
17f0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
1800: 2e 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c  .  Each such val
1810: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20  ue is a label.  
1820: 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c  Resolve the.** l
1830: 61 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20  abel by setting 
1840: 74 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20  the P2 value to 
1850: 69 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d  its correct non-
1860: 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  zero value..**.*
1870: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1880: 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66  s called once af
1890: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
18a0: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
18b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62  ed..**.** Variab
18c0: 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  le *pMaxFuncArgs
18d0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d   is set to the m
18e0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  aximum value of 
18f0: 61 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20  any P2 argument 
1900: 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e  .** to an OP_Fun
1910: 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65  ction, OP_AggSte
1920: 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20  p or OP_VFilter 
1930: 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20  opcode. This is 
1940: 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69  used by .** sqli
1950: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
1960: 28 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56  () to size the V
1970: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
1980: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  y..**.** This ro
1990: 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20  utine also does 
19a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 70  the following op
19b0: 74 69 6d 69 7a 61 74 69 6f 6e 3a 20 20 49 74 20  timization:  It 
19c0: 73 63 61 6e 73 20 66 6f 72 0a 2a 2a 20 69 6e 73  scans for.** ins
19d0: 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 6d  tructions that m
19e0: 69 67 68 74 20 63 61 75 73 65 20 61 20 73 74 61  ight cause a sta
19f0: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  tement rollback.
1a00: 20 20 53 75 63 68 20 69 6e 73 74 72 75 63 74 69    Such instructi
1a10: 6f 6e 73 0a 2a 2a 20 61 72 65 3a 0a 2a 2a 0a 2a  ons.** are:.**.*
1a20: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20 77  *   *  OP_Halt w
1a30: 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f  ith P1=SQLITE_CO
1a40: 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32 3d  NSTRAINT and P2=
1a50: 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a  OE_Abort..**   *
1a60: 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20    OP_Destroy.** 
1a70: 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74 65 0a    *  OP_VUpdate.
1a80: 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61  **   *  OP_VRena
1a90: 6d 65 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73  me.**.** If no s
1aa0: 75 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  uch instruction 
1ab0: 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 65  is found, then e
1ac0: 76 65 72 79 20 53 74 61 74 65 6d 65 6e 74 20 69  very Statement i
1ad0: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 69  nstruction .** i
1ae0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 61 20 4e  s changed to a N
1af0: 6f 6f 70 2e 20 20 49 6e 20 74 68 69 73 20 77 61  oop.  In this wa
1b00: 79 2c 20 77 65 20 61 76 6f 69 64 20 63 72 65 61  y, we avoid crea
1b10: 74 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ting the stateme
1b20: 6e 74 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  nt .** journal f
1b30: 69 6c 65 20 75 6e 6e 65 63 65 73 73 61 72 69 6c  ile unnecessaril
1b40: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
1b50: 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65  d resolveP2Value
1b60: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  s(Vdbe *p, int *
1b70: 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20  pMaxFuncArgs){. 
1b80: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d   int i;.  int nM
1b90: 61 78 41 72 67 73 20 3d 20 30 3b 0a 20 20 4f 70  axArgs = 0;.  Op
1ba0: 20 2a 70 4f 70 3b 0a 20 20 69 6e 74 20 2a 61 4c   *pOp;.  int *aL
1bb0: 61 62 65 6c 20 3d 20 70 2d 3e 61 4c 61 62 65 6c  abel = p->aLabel
1bc0: 3b 0a 20 20 69 6e 74 20 64 6f 65 73 53 74 61 74  ;.  int doesStat
1bd0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1be0: 30 3b 0a 20 20 69 6e 74 20 68 61 73 53 74 61 74  0;.  int hasStat
1bf0: 65 6d 65 6e 74 42 65 67 69 6e 20 3d 20 30 3b 0a  ementBegin = 0;.
1c00: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
1c10: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
1c20: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
1c30: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
1c40: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
1c50: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
1c60: 50 5f 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70  P_Function || op
1c70: 63 6f 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70  code==OP_AggStep
1c80: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   ){.      if( pO
1c90: 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29  p->p5>nMaxArgs )
1ca0: 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d   nMaxArgs = pOp-
1cb0: 3e 70 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >p5;.#ifndef SQL
1cc0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1cd0: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
1ce0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56  if( opcode==OP_V
1cf0: 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 20 20  Update ){.      
1d00: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
1d10: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1d20: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 23 65 6e 64 69  = pOp->p2;.#endi
1d30: 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  f.    }.    if( 
1d40: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
1d50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
1d60: 2d 3e 70 31 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  ->p1==SQLITE_CON
1d70: 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e  STRAINT && pOp->
1d80: 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  p2==OE_Abort ){.
1d90: 20 20 20 20 20 20 20 20 64 6f 65 73 53 74 61 74          doesStat
1da0: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1db0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1dc0: 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65 3d  else if( opcode=
1dd0: 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b  =OP_Statement ){
1de0: 0a 20 20 20 20 20 20 68 61 73 53 74 61 74 65 6d  .      hasStatem
1df0: 65 6e 74 42 65 67 69 6e 20 3d 20 31 3b 0a 20 20  entBegin = 1;.  
1e00: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f    }else if( opco
1e10: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 29  de==OP_Destroy )
1e20: 7b 0a 20 20 20 20 20 20 64 6f 65 73 53 74 61 74  {.      doesStat
1e30: 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20  ementRollback = 
1e40: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
1e50: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1e60: 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
1e70: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  ( opcode==OP_VUp
1e80: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
1e90: 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20 20  OP_VRename ){.  
1ea0: 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65 6e      doesStatemen
1eb0: 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  tRollback = 1;. 
1ec0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63     }else if( opc
1ed0: 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20  ode==OP_VFilter 
1ee0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  ){.      int n;.
1ef0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1f00: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
1f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f20: 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f  Op[-1].opcode==O
1f30: 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20  P_Integer );.   
1f40: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
1f50: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  1;.      if( n>n
1f60: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
1f70: 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20  gs = n;.#endif. 
1f80: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
1f90: 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65 48  lite3VdbeOpcodeH
1fa0: 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f 64  asProperty(opcod
1fb0: 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 26  e, OPFLG_JUMP) &
1fc0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
1fd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31 2d       assert( -1-
1fe0: 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65  pOp->p2<p->nLabe
1ff0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
2000: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
2010: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
2020: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
2030: 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  e(p->aLabel);.  
2040: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 0a  p->aLabel = 0;..
2050: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20    *pMaxFuncArgs 
2060: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 0a 20 20 2f  = nMaxArgs;..  /
2070: 2a 20 49 66 20 77 65 20 6e 65 76 65 72 20 72 6f  * If we never ro
2080: 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
2090: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
20a0: 74 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 0a 20  then statement. 
20b0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
20c0: 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 2e   are not needed.
20d0: 20 20 53 6f 20 63 68 61 6e 67 65 20 65 76 65 72    So change ever
20e0: 79 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 0a 20  y OP_Statement. 
20f0: 20 2a 2a 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20   ** opcode into 
2100: 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 20 20 54 68 69  an OP_Noop.  Thi
2110: 73 20 61 76 6f 69 64 20 61 20 63 61 6c 6c 20 74  s avoid a call t
2120: 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  o sqlite3OsOpenE
2130: 78 63 6c 75 73 69 76 65 28 29 0a 20 20 2a 2a 20  xclusive().  ** 
2140: 77 68 69 63 68 20 63 61 6e 20 62 65 20 65 78 70  which can be exp
2150: 65 6e 73 69 76 65 20 6f 6e 20 73 6f 6d 65 20 70  ensive on some p
2160: 6c 61 74 66 6f 72 6d 73 2e 0a 20 20 2a 2f 0a 20  latforms..  */. 
2170: 20 69 66 28 20 68 61 73 53 74 61 74 65 6d 65 6e   if( hasStatemen
2180: 74 42 65 67 69 6e 20 26 26 20 21 64 6f 65 73 53  tBegin && !doesS
2190: 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63 6b  tatementRollback
21a0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d   ){.    for(pOp=
21b0: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
21c0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
21d0: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
21e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
21f0: 5f 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  _Statement ){.  
2200: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
2210: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
2220: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
2230: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2240: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2250: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2260: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
2270: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2280: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2290: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
22a0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
22b0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
22c0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
22d0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  p;.}../*.** Add 
22e0: 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20  a whole list of 
22f0: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68  operations to th
2300: 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63  e operation stac
2310: 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  k.  Return the.*
2320: 2a 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  * address of the
2330: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
2340: 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73   added..*/.int s
2350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
2360: 69 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ist(Vdbe *p, int
2370: 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74   nOp, VdbeOpList
2380: 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b 0a 20 20   const *aOp){.  
2390: 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73 65  int addr;.  asse
23a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
23b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
23c0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
23d0: 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  nOp > p->nOpAllo
23e0: 63 20 29 7b 0a 20 20 20 20 72 65 73 69 7a 65 4f  c ){.    resizeO
23f0: 70 41 72 72 61 79 28 70 2c 20 70 2d 3e 6e 4f 70  pArray(p, p->nOp
2400: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c  Alloc ? p->nOpAl
2410: 6c 6f 63 2a 32 20 3a 20 31 30 32 34 2f 73 69 7a  loc*2 : 1024/siz
2420: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 20 20 61 73  eof(Op));.    as
2430: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 2b 6e 4f 70  sert( p->nOp+nOp
2440: 3c 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 7c 7c  <=p->nOpAlloc ||
2450: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
2460: 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 20 20 69 66  iled );.  }.  if
2470: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
2480: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
2490: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64  urn 0;.  }.  add
24a0: 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66  r = p->nOp;.  if
24b0: 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20 20 20 69  ( nOp>0 ){.    i
24c0: 6e 74 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70  nt i;.    VdbeOp
24d0: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20  List const *pIn 
24e0: 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69  = aOp;.    for(i
24f0: 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20  =0; i<nOp; i++, 
2500: 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  pIn++){.      in
2510: 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a  t p2 = pIn->p2;.
2520: 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f        VdbeOp *pO
2530: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ut = &p->aOp[i+a
2540: 64 64 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74  ddr];.      pOut
2550: 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e  ->opcode = pIn->
2560: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f  opcode;.      pO
2570: 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31  ut->p1 = pIn->p1
2580: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 32 3c 30  ;.      if( p2<0
2590: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 4f   && sqlite3VdbeO
25a0: 70 63 6f 64 65 48 61 73 50 72 6f 70 65 72 74 79  pcodeHasProperty
25b0: 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 2c 20 4f  (pOut->opcode, O
25c0: 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b 0a 20 20  PFLG_JUMP) ){.  
25d0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
25e0: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
25f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2600: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
2610: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
2620: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
2630: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
2640: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
2650: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
2660: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
2670: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
2680: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2690: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 70 4f 75  _DEBUG.      pOu
26a0: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
26b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
26c0: 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  e3VdbeAddopTrace
26d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26e0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
26f0: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
2700: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
2710: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2720: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
2730: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
2740: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
2750: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
2760: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
2770: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
2780: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
2790: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
27a0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
27b0: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
27c0: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
27d0: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
27e0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
27f0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
2800: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
2810: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
2820: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
2830: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
2840: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
2850: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
2860: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
2870: 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
2880: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
2890: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
28a0: 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 20  f( p && addr>=0 
28b0: 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26  && p->nOp>addr &
28c0: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
28d0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
28e0: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
28f0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
2900: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
2910: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
2920: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
2930: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
2940: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
2950: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
2960: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
2970: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
2980: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
2990: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20  , int addr, int 
29a0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
29b0: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  p==0 || p->magic
29c0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
29d0: 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  T );.  if( p && 
29e0: 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f  addr>=0 && p->nO
29f0: 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70  p>addr && p->aOp
2a00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
2a10: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
2a20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
2a30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
2a40: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
2a50: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
2a60: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
2a70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
2a80: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
2a90: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61  int addr, int va
2aa0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  l){.  assert( p=
2ab0: 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  =0 || p->magic==
2ac0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2ad0: 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 61 64  );.  if( p && ad
2ae0: 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e  dr>=0 && p->nOp>
2af0: 61 64 64 72 20 26 26 20 70 2d 3e 61 4f 70 20 29  addr && p->aOp )
2b00: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
2b10: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
2b20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
2b30: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
2b40: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
2b50: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2b60: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
2b70: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
2b80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2b90: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
2ba0: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
2bb0: 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  ==0 || p->magic=
2bc0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2bd0: 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70   );.  if( p && p
2be0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->aOp ){.    ass
2bf0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b  ert( p->nOp>0 );
2c00: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  .    p->aOp[p->n
2c10: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a  Op-1].p5 = val;.
2c20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2c30: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61  nge the P2 opera
2c40: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f  nd of instructio
2c50: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69  n addr so that i
2c60: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
2c70: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
2c80: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
2c90: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a  on to be coded..
2ca0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2cb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65  dbeJumpHere(Vdbe
2cc0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a   *p, int addr){.
2cd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2ce0: 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70  ngeP2(p, addr, p
2cf0: 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ->nOp);.}.../*.*
2d00: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 46  * If the input F
2d10: 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65  uncDef structure
2d20: 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   is ephemeral, t
2d30: 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66  hen free it.  If
2d40: 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20  .** the FuncDef 
2d50: 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c  is not ephermal,
2d60: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67   then do nothing
2d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d80: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
2d90: 6e 63 74 69 6f 6e 28 46 75 6e 63 44 65 66 20 2a  nction(FuncDef *
2da0: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
2db0: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
2dc0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2dd0: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
2de0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
2df0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ef);.  }.}../*.*
2e00: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
2e10: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
2e20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2e30: 20 66 72 65 65 50 34 28 69 6e 74 20 70 34 74 79   freeP4(int p4ty
2e40: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
2e50: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 73   if( p4 ){.    s
2e60: 77 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b  witch( p4type ){
2e70: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
2e80: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
2e90: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
2ea0: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
2eb0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44  .      case P4_D
2ec0: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61  YNAMIC:.      ca
2ed0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20  se P4_KEYINFO:. 
2ee0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
2ef0: 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73  ARRAY:.      cas
2f00: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  e P4_KEYINFO_HAN
2f10: 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  DOFF: {.        
2f20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
2f30: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2f40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f50: 61 73 65 20 50 34 5f 56 44 42 45 46 55 4e 43 3a  ase P4_VDBEFUNC:
2f60: 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 46   {.        VdbeF
2f70: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d  unc *pVdbeFunc =
2f80: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 34 3b   (VdbeFunc *)p4;
2f90: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
2fa0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 70  emeralFunction(p
2fb0: 56 64 62 65 46 75 6e 63 2d 3e 70 46 75 6e 63 29  VdbeFunc->pFunc)
2fc0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2fd0: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
2fe0: 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 30 29  ta(pVdbeFunc, 0)
2ff0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
3000: 33 5f 66 72 65 65 28 70 56 64 62 65 46 75 6e 63  3_free(pVdbeFunc
3010: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
3020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3030: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
3040: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
3050: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
3060: 28 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a  ((FuncDef*)p4);.
3070: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3080: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
3090: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
30a0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
30b0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61  Free((sqlite3_va
30c0: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  lue*)p4);.      
30d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
30e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
30f0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70  *.** Change N op
3100: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61  codes starting a
3110: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73  t addr to No-ops
3120: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3130: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
3140: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
3150: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69  ddr, int N){.  i
3160: 66 28 20 70 20 26 26 20 70 2d 3e 61 4f 70 20 29  f( p && p->aOp )
3170: 7b 0a 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f  {.    VdbeOp *pO
3180: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3190: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d  ];.    while( N-
31a0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  - ){.      freeP
31b0: 34 28 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  4(pOp->p4type, p
31c0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 20  Op->p4.p);.     
31d0: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
31e0: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
31f0: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  .      pOp->opco
3200: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
3210: 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20 7d      pOp++;.    }
3220: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
3230: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
3240: 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  f the P4 operand
3250: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
3260: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
3270: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3280: 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61  useful when a la
3290: 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  rge program is l
32a0: 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20  oaded from a.** 
32b0: 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 69  static array usi
32c0: 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ng sqlite3VdbeAd
32d0: 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 77  dOpList but we w
32e0: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a  ant to make a.**
32f0: 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67   few minor chang
3300: 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61  es to the progra
3310: 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30  m..**.** If n>=0
3320: 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65   then the P4 ope
3330: 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c  rand is dynamic,
3340: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20   meaning that a 
3350: 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73  copy of.** the s
3360: 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e  tring is made in
3370: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
3380: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
3390: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76  malloc()..** A v
33a0: 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61  alue of n==0 mea
33b0: 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66  ns copy bytes of
33c0: 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69   zP4 up to and i
33d0: 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20  ncluding the.** 
33e0: 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e  first null byte.
33f0: 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f    If n>0 then co
3400: 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20  py n+1 bytes of 
3410: 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d  zP4..**.** If n=
3420: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20 6d  =P4_KEYINFO it m
3430: 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69 73  eans that zP4 is
3440: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
3450: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
3460: 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73 20  e..** A copy is 
3470: 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79 49  made of the KeyI
3480: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 6e  nfo structure in
3490: 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  to memory obtain
34a0: 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
34b0: 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62 65  e3_malloc, to be
34c0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20   freed when the 
34d0: 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a 65  Vdbe is finalize
34e0: 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59 49  d..** n==P4_KEYI
34f0: 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64 69  NFO_HANDOFF indi
3500: 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20 70  cates that zP4 p
3510: 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49 6e  oints to a KeyIn
3520: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  fo structure.** 
3530: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
3540: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
3550: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   has obtained fr
3560: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
3570: 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  c. The .** calle
3580: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72 65  r should not fre
3590: 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  e the allocation
35a0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  , it will be fre
35b0: 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62 65  ed when the Vdbe
35c0: 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 64   is.** finalized
35d0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
35e0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
35f0: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
3600: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
3610: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
3620: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
3630: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
3640: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
3650: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
3660: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
3670: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
3680: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
3690: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
36a0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
36b0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
36c0: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
36d0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
36e0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
36f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3700: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
3710: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
3720: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
3730: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
3740: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  Op;.  assert( p!
3750: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
3760: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
3770: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
3780: 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20  f( p->aOp==0 || 
3790: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
37a0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 28 6e  led ){.    if (n
37b0: 20 21 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 29 20   != P4_KEYINFO) 
37c0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 6e  {.      freeP4(n
37d0: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a  , (void*)*(char*
37e0: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20  *)&zP4);.    }. 
37f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
3800: 20 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d   assert( addr<p-
3810: 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64  >nOp );.  if( ad
3820: 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72  dr<0 ){.    addr
3830: 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20   = p->nOp - 1;. 
3840: 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20     if( addr<0 ) 
3850: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f  return;.  }.  pO
3860: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
3870: 5d 3b 0a 20 20 66 72 65 65 50 34 28 70 4f 70 2d  ];.  freeP4(pOp-
3880: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
3890: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
38a0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
38b0: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
38c0: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
38d0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
38e0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
38f0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
3900: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
3910: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
3920: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
3930: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
3940: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
3950: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
3960: 2d 3e 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20  ->p4type = n;.  
3970: 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d 30  }else if( zP4==0
3980: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
3990: 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  p = 0;.    pOp->
39a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
39b0: 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
39c0: 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29   n==P4_KEYINFO )
39d0: 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
39e0: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  KeyInfo;.    int
39f0: 20 6e 46 69 65 6c 64 2c 20 6e 42 79 74 65 3b 0a   nField, nByte;.
3a00: 0a 20 20 20 20 6e 46 69 65 6c 64 20 3d 20 28 28  .    nField = ((
3a10: 4b 65 79 49 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e  KeyInfo*)zP4)->n
3a20: 46 69 65 6c 64 3b 0a 20 20 20 20 6e 42 79 74 65  Field;.    nByte
3a30: 20 3d 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79 49   = sizeof(*pKeyI
3a40: 6e 66 6f 29 20 2b 20 28 6e 46 69 65 6c 64 2d 31  nfo) + (nField-1
3a50: 29 2a 73 69 7a 65 6f 66 28 70 4b 65 79 49 6e 66  )*sizeof(pKeyInf
3a60: 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e  o->aColl[0]) + n
3a70: 46 69 65 6c 64 3b 0a 20 20 20 20 70 4b 65 79 49  Field;.    pKeyI
3a80: 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  nfo = sqlite3Mal
3a90: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
3aa0: 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e    pOp->p4.pKeyIn
3ab0: 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
3ac0: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20     if( pKeyInfo 
3ad0: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f  ){.      u8 *aSo
3ae0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d  rtOrder;.      m
3af0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2c 20  emcpy(pKeyInfo, 
3b00: 7a 50 34 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  zP4, nByte);.   
3b10: 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20     aSortOrder = 
3b20: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3b30: 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rder;.      if( 
3b40: 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  aSortOrder ){.  
3b50: 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e        pKeyInfo->
3b60: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e  aSortOrder = (un
3b70: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b  signed char*)&pK
3b80: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46  eyInfo->aColl[nF
3b90: 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d  ield];.        m
3ba0: 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e  emcpy(pKeyInfo->
3bb0: 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72  aSortOrder, aSor
3bc0: 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b  tOrder, nField);
3bd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
3be0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3bf0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c  KEYINFO;.    }el
3c00: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d  se{.      p->db-
3c10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
3c20: 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  1;.      pOp->p4
3c30: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
3c40: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  D;.    }.  }else
3c50: 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e   if( n==P4_KEYIN
3c60: 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20  FO_HANDOFF ){.  
3c70: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
3c80: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
3c90: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b  p->p4type = P4_K
3ca0: 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20  EYINFO;.  }else 
3cb0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
3cc0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
3cd0: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
3ce0: 70 34 74 79 70 65 20 3d 20 6e 3b 0a 20 20 7d 65  p4type = n;.  }e
3cf0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d  lse{.    if( n==
3d00: 30 20 29 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a  0 ) n = strlen(z
3d10: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
3d20: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
3d30: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
3d40: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
3d50: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
3d60: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  IC;.  }.}..#ifnd
3d70: 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
3d80: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
3d90: 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f  nt on the the mo
3da0: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
3db0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
3dc0: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
3dd0: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
3de0: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
3df0: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
3e00: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
3e10: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
3e20: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
3e30: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
3e40: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
3e50: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
3e60: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f  ion build..*/.vo
3e70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
3e80: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
3e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3ea0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
3eb0: 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74  ist ap;.  assert
3ec0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
3ed0: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
3ee0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
3ef0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
3f00: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
3f10: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
3f20: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
3f30: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61  ->nOp ){.    cha
3f40: 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70  r **pz = &p->aOp
3f50: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
3f60: 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  ent;.    va_star
3f70: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
3f80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3f90: 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d  (*pz);.    *pz =
3fa0: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
3fb0: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
3fc0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
3fd0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
3fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
3ff0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
4000: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
4010: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
4020: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69  _list ap;.  sqli
4030: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c  te3VdbeAddOp0(p,
4040: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 73   OP_Noop);.  ass
4050: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
4060: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
4070: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
4080: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
4090: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
40a0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
40b0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
40c0: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
40d0: 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e  char **pz = &p->
40e0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
40f0: 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73  omment;.    va_s
4100: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
4110: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
4120: 72 65 65 28 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  ree(*pz);.    *p
4130: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
4140: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
4150: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
4160: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
4170: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
4180: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
4190: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
41a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
41b0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
41c0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
41d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
41e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
41f0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4200: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
4210: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
4220: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
4230: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4240: 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ed );.  return (
4250: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
4260: 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f  <p->nOp)?(&p->aO
4270: 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a  p[addr]):0);.}..
4280: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4290: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
42a0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
42b0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
42c0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
42d0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
42e0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
42f0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
4300: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
4310: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
4320: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
4330: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
4340: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
4350: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
4360: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
4370: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
4380: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
4390: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
43a0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
43b0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
43c0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
43d0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
43e0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
43f0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
4400: 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65  STATIC:.    case
4410: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
4420: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
4430: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
4440: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
4450: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  .pKeyInfo;.     
4460: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4470: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4480: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
4490: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
44a0: 0a 20 20 20 20 20 20 69 20 3d 20 73 74 72 6c 65  .      i = strle
44b0: 6e 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  n(zTemp);.      
44c0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
44d0: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
44e0: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
44f0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
4500: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
4510: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
4520: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  l ){.          i
4530: 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 43  nt n = strlen(pC
4540: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
4550: 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e         if( i+n>n
4560: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
4570: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
4580: 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29  emp[i],",...",4)
4590: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
45a0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
45b0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
45c0: 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [i++] = ',';.   
45d0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
45e0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20  nfo->aSortOrder 
45f0: 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
4600: 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20  rtOrder[j] ){.  
4610: 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b            zTemp[
4620: 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20  i++] = '-';.    
4630: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4640: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b    memcpy(&zTemp[
4650: 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  i], pColl->zName
4660: 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  ,n+1);.         
4670: 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20   i += n;.       
4680: 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34 3c 6e   }else if( i+4<n
4690: 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20  Temp-6 ){.      
46a0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
46b0: 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a  p[i],",nil",4);.
46c0: 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
46d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
46e0: 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b    }.      zTemp[
46f0: 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20  i++] = ')';.    
4700: 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a    zTemp[i] = 0;.
4710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c        assert( i<
4720: 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62  nTemp );.      b
4730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4740: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
4750: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
4760: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
4770: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
4780: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4790: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 63  nTemp, zTemp, "c
47a0: 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22 2c 20  ollseq(%.20s)", 
47b0: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
47c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
47d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  }.    case P4_FU
47e0: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46  NCDEF: {.      F
47f0: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
4800: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20  Op->p4.pFunc;.  
4810: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4820: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4830: 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  p, "%s(%d)", pDe
4840: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
4850: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
4860: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4870: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
4880: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4890: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
48a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
48b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
48c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
48d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
48e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
48f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4900: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
4910: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
4920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4930: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
4940: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
4950: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
4960: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
4970: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
4980: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4990: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
49b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
49c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73  .pMem;.      ass
49d0: 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c 61 67  ert( (pMem->flag
49e0: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30  s & MEM_Null)==0
49f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   );.      if( pM
4a00: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4a10: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
4a20: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
4a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
4a40: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
4a50: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
4a60: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4a70: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
4a80: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
4a90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4aa0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
4ab0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
4ac0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4ad0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4ae0: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
4af0: 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ->r);.      }.  
4b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4b10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4b20: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4b30: 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 54  E.    case P4_VT
4b40: 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AB: {.      sqli
4b50: 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20  te3_vtab *pVtab 
4b60: 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 3b  = pOp->p4.pVtab;
4b70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4b80: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4b90: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25  Temp, "vtab:%p:%
4ba0: 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62  p", pVtab, pVtab
4bb0: 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20  ->pModule);.    
4bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4bd0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50  endif.    case P
4be0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
4bf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
4c00: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
4c10: 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a  p, "intarray");.
4c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4c30: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
4c40: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
4c50: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
4c60: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
4c70: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
4c80: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
4c90: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
4ca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4cb0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
4cc0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
4cd0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
4ce0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
4cf0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
4d00: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
4d10: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
4d20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4d30: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
4d40: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
4d50: 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65  int mask;.  asse
4d60: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
4d70: 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73  >db->nDb );.  as
4d80: 73 65 72 74 28 20 69 3c 73 69 7a 65 6f 66 28 70  sert( i<sizeof(p
4d90: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
4da0: 3b 0a 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 3b  ;.  mask = 1<<i;
4db0: 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65 65  .  if( (p->btree
4dc0: 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
4dd0: 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65 4d  ){.    p->btreeM
4de0: 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
4df0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74   sqlite3BtreeMut
4e00: 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26 70  exArrayInsert(&p
4e10: 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62 2d  ->aMutex, p->db-
4e20: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[i].pBt);.  
4e30: 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65  }.}...#if define
4e40: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20  d(VDBE_PROFILE) 
4e50: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
4e60: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50  E_DEBUG)./*.** P
4e70: 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70  rint a single op
4e80: 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74  code.  This rout
4e90: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
4ea0: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
4eb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4ec0: 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20  dbePrintOp(FILE 
4ed0: 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f  *pOut, int pc, O
4ee0: 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20  p *pOp){.  char 
4ef0: 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74  *zP4;.  char zPt
4f00: 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63 20  r[50];.  static 
4f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
4f20: 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33  mat1 = "%4d %-13
4f30: 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d  s %4d %4d %4d %-
4f40: 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  4s %.2X %s\n";. 
4f50: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
4f60: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
4f70: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
4f80: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
4f90: 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72 69  f(zPtr));.  fpri
4fa0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
4fb0: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
4fc0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
4fd0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
4fe0: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
4ff0: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
5000: 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20 53  Op->p5,.#ifdef S
5010: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
5020: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
5030: 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ? pOp->zComment 
5040: 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20 20  : "".#else.     
5050: 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b 0a   "".#endif.  );.
5060: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
5070: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
5080: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
5090: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
50a0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
50b0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
50c0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 2c  y(Mem *p, int N,
50d0: 20 69 6e 74 20 66 72 65 65 62 75 66 66 65 72 73   int freebuffers
50e0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
50f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
5100: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
5110: 69 6e 74 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  int malloc_faile
5120: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  d = db->mallocFa
5130: 69 6c 65 64 3b 0a 20 20 20 20 77 68 69 6c 65 28  iled;.    while(
5140: 20 4e 2d 2d 3e 30 20 29 7b 0a 20 20 20 20 20 20   N-->0 ){.      
5150: 61 73 73 65 72 74 28 20 4e 3c 32 20 7c 7c 20 70  assert( N<2 || p
5160: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
5170: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 72 65  );.      if( fre
5180: 65 62 75 66 66 65 72 73 20 29 7b 0a 20 20 20 20  ebuffers ){.    
5190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
51a0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
51b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
51c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
51d0: 6d 52 65 6c 65 61 73 65 45 78 74 65 72 6e 61 6c  mReleaseExternal
51e0: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
51f0: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45     p->flags = ME
5200: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2b  M_Null;.      p+
5210: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  +;.    }.    db-
5220: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5230: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
5240: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
5250: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
5260: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74  Y_MANAGEMENT.int
5270: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
5280: 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65 20  aseBuffers(Vdbe 
5290: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  *p){.  int ii;. 
52a0: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a   int nFree = 0;.
52b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
52c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
52d0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
52e0: 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d  for(ii=1; ii<=p-
52f0: 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nMem; ii++){.  
5300: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
5310: 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20  ->aMem[ii];.    
5320: 69 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70  if( pMem->z && p
5330: 4d 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44  Mem->flags&MEM_D
5340: 79 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  yn ){.      asse
5350: 72 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20  rt( !pMem->xDel 
5360: 29 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b  );.      nFree +
5370: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
5380: 69 7a 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  ize(pMem->z);.  
5390: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
53a0: 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
53b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
53c0: 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65 6e  urn nFree;.}.#en
53d0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
53e0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
53f0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69  ./*.** Give a li
5400: 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f  sting of the pro
5410: 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74  gram in the virt
5420: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a  ual machine..**.
5430: 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65  ** The interface
5440: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
5450: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
5460: 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20  ).  But instead 
5470: 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68  of.** running th
5480: 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b  e code, it invok
5490: 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  es the callback 
54a0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e  once for each in
54b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
54c0: 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73  is feature is us
54d0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
54e0: 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a  "EXPLAIN"..**.**
54f0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
5500: 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75  ==1, each instru
5510: 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e  ction is listed.
5520: 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70    When.** p->exp
5530: 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50  lain==2, only OP
5540: 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63  _Explain instruc
5550: 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64  tions are listed
5560: 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72   and these.** ar
5570: 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66  e shown in a dif
5580: 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20  ferent format.  
5590: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73  p->explain==2 is
55a0: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
55b0: 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55  nt.** EXPLAIN QU
55c0: 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74  ERY PLAN..*/.int
55d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
55e0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5600: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
5610: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5620: 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  p->db;.  int i;.
5630: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5640: 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  E_OK;.  Mem *pMe
5650: 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53 65  m = p->pResultSe
5660: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
5670: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ..  assert( p->e
5680: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
5690: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
56a0: 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75 72  AGIC_RUN ) retur
56b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
56c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
56d0: 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41 47  agic==SQLITE_MAG
56e0: 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73 73  IC_BUSY );.  ass
56f0: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
5700: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
5710: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 0a  SQLITE_BUSY );..
5720: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
5730: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
5740: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
5750: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
5760: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
5770: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
5780: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
5790: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
57a0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
57b0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
57c0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
57d0: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
57e0: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
57f0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
5800: 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65 6d 2c  y(pMem, p->nMem,
5810: 20 31 29 3b 0a 0a 20 20 64 6f 7b 0a 20 20 20 20   1);..  do{.    
5820: 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d  i = p->pc++;.  }
5830: 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70 20  while( i<p->nOp 
5840: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  && p->explain==2
5850: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70   && p->aOp[i].op
5860: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e  code!=OP_Explain
5870: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e   );.  if( i>=p->
5880: 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  nOp ){.    p->rc
5890: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
58a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
58b0: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  NE;.  }else if( 
58c0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
58d0: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  pted ){.    p->r
58e0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  c = SQLITE_INTER
58f0: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
5900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5910: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
5920: 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64  g(&p->zErrMsg, d
5930: 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  b, "%s", sqlite3
5940: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
5950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
5960: 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  r *z;.    Op *pO
5970: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a  p = &p->aOp[i];.
5980: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
5990: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70  in==1 ){.      p
59a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
59b0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d  _Int;.      pMem
59c0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
59d0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
59e0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a10: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
5a20: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
5a30: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
5a40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
5a50: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
5a60: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
5a70: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
5a80: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
5a90: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20  p->opcode);  /* 
5aa0: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
5ab0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
5ac0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
5ad0: 2d 3e 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65  ->n = strlen(pMe
5ae0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
5af0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
5b00: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65  _TEXT;.      pMe
5b10: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
5b20: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
5b30: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ++;.    }..    p
5b40: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
5b50: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
5b60: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
5b90: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20  .    pMem->type 
5ba0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  = SQLITE_INTEGER
5bb0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  ;.    pMem++;.. 
5bc0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
5bd0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
5be0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
5bf0: 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
5c10: 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  2 */.    pMem->t
5c20: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
5c30: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
5c40: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
5c50: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
5c60: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
5c70: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
5c80: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
5c90: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5cb0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P3 */.      pMem
5cc0: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  ->type = SQLITE_
5cd0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70  INTEGER;.      p
5ce0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  Mem++;.    }..  
5cf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
5d00: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
5d10: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
5d20: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
5d30: 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63     p->db->malloc
5d40: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
5d50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5d60: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
5d70: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
5d80: 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d  EM_Dyn|MEM_Str|M
5d90: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 20 3d  EM_Term;.    z =
5da0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
5db0: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
5dc0: 20 20 69 66 28 20 7a 21 3d 70 4d 65 6d 2d 3e 7a    if( z!=pMem->z
5dd0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5de0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
5df0: 4d 65 6d 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49  Mem, z, -1, SQLI
5e00: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
5e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
5e20: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
5e30: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
5e40: 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d  n = strlen(pMem-
5e50: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
5e60: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
5e70: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d  F8;.    }.    pM
5e80: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  em->type = SQLIT
5e90: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d  E_TEXT;.    pMem
5ea0: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
5eb0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
5ec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
5ed0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
5ee0: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   4, 0) ){.      
5ef0: 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46    p->db->mallocF
5f00: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
5f10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f20: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
5f30: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
5f40: 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f  s = MEM_Dyn|MEM_
5f50: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
5f60: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
5f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
5f80: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
5f90: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
5fa0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
5fb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
5fc0: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
5fd0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
5fe0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
5ff0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
6000: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
6010: 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20 70  EBUG.      if( p
6020: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
6030: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c          pMem->fl
6040: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
6050: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  M_Term;.        
6060: 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70 2d 3e 7a  pMem->z = pOp->z
6070: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 20 20 20  Comment;.       
6080: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 74 72 6c 65   pMem->n = strle
6090: 6e 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  n(pMem->z);.    
60a0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
60b0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
60c0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
60d0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
60e0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
60f0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6110: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20   Comment */.    
6120: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d      pMem->type =
6130: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20   SQLITE_NULL;.  
6140: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
6150: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
6160: 20 38 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61   8 - 5*(p->expla
6170: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63  in-1);.    p->rc
6180: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6190: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
61a0: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
61b0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
61c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
61d0: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
61e0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
61f0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
6200: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
6210: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
6220: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
6230: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
6240: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
6250: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
6260: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
6270: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  p;.  if( nOp<1 )
6280: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
6290: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
62a0: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
62b0: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
62c0: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
62d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
62e0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77  pOp->p4.z;.    w
62f0: 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 28  hile( isspace(*(
6300: 75 38 2a 29 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  u8*)z) ) z++;.  
6310: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
6320: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
6330: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
6340: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6350: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
6360: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6370: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
6380: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
6390: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
63a0: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
63b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
63c0: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
63d0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
63e0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
63f0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
6400: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
6410: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6420: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
6430: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
6440: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
6450: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
6460: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
6470: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
6480: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
6490: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
64a0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
64b0: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
64c0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
64d0: 6f 72 28 69 3d 30 3b 20 69 73 73 70 61 63 65 28  or(i=0; isspace(
64e0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
64f0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
6500: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20   for(j=0; z[i]; 
6510: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6520: 69 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65  isspace((unsigne
6530: 64 20 63 68 61 72 29 7a 5b 69 5d 29 20 29 7b 0a  d char)z[i]) ){.
6540: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
6550: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
6560: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
6570: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
6580: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6590: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
65a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
65b0: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
65c0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
65d0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
65e0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
65f0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
6600: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
6610: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
6620: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
6630: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
6640: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 2e 20   for execution. 
6650: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74   This involves t
6660: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73  hings such.** as
6670: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63   allocating stac
6680: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74  k space and init
6690: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
66a0: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
66b0: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
66c0: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
66d0: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
66e0: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
66f0: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
6700: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
6710: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73    .**.** This is
6720: 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
6730: 20 6d 6f 76 65 20 61 20 56 44 42 45 20 66 72 6f   move a VDBE fro
6740: 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  m VDBE_MAGIC_INI
6750: 54 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47  T to.** VDBE_MAG
6760: 49 43 5f 52 55 4e 2e 0a 2a 2f 0a 76 6f 69 64 20  IC_RUN..*/.void 
6770: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
6780: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
67b0: 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  BE */.  int nVar
67c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
67e0: 20 6f 66 20 27 3f 27 20 73 65 65 20 69 6e 20 74   of '?' see in t
67f0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
6800: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 2c 20   */.  int nMem, 
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6830: 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
6840: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
6850: 69 6e 74 20 6e 43 75 72 73 6f 72 2c 20 20 20 20  int nCursor,    
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6870: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  * Number of curs
6880: 6f 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ors to allocate 
6890: 2a 2f 0a 20 20 69 6e 74 20 69 73 45 78 70 6c 61  */.  int isExpla
68a0: 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  in              
68b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
68c0: 68 65 20 45 58 50 4c 41 49 4e 20 6b 65 79 77 6f  he EXPLAIN keywo
68d0: 72 64 73 20 69 73 20 70 72 65 73 65 6e 74 20 2a  rds is present *
68e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
68f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
6900: 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  >db;..  assert( 
6910: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
6920: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
6930: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
6940: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
6950: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
6960: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
6970: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
6980: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
6990: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
69a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
69b0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
69c0: 74 65 72 2e 20 54 68 69 73 0a 20 20 20 2a 20 69  ter. This.   * i
69d0: 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63 61  s because the ca
69e0: 6c 6c 20 74 6f 20 72 65 73 69 7a 65 4f 70 41 72  ll to resizeOpAr
69f0: 72 61 79 28 29 20 62 65 6c 6f 77 20 6d 61 79 20  ray() below may 
6a00: 73 68 72 69 6e 6b 20 74 68 65 0a 20 20 20 2a 20  shrink the.   * 
6a10: 70 2d 3e 61 4f 70 5b 5d 20 61 72 72 61 79 20 74  p->aOp[] array t
6a20: 6f 20 73 61 76 65 20 6d 65 6d 6f 72 79 20 69 66  o save memory if
6a30: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 6e 20   called when in 
6a40: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 0a  VDBE_MAGIC_RUN .
6a50: 20 20 20 2a 20 73 74 61 74 65 2e 0a 20 20 20 2a     * state..   *
6a60: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
6a70: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
6a80: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
6a90: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
6aa0: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
6ab0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
6ac0: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
6ad0: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
6ae0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
6af0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
6b00: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
6b10: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
6b20: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
6b30: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
6b40: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 43  space for.  ** C
6b50: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
6b60: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
6b70: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
6b80: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
6b90: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
6ba0: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
6bb0: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
6bc0: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
6bd0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
6be0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
6bf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6c00: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
6c10: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
6c20: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
6c30: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
6c40: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
6c50: 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 69  /*.  ** Allocati
6c60: 6f 6e 20 73 70 61 63 65 20 66 6f 72 20 72 65 67  on space for reg
6c70: 69 73 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  isters..  */.  i
6c80: 66 28 20 70 2d 3e 61 4d 65 6d 3d 3d 30 20 29 7b  f( p->aMem==0 ){
6c90: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  .    int nArg;  
6ca0: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
6cb0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70  number of args p
6cc0: 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20  assed to a user 
6cd0: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
6ce0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
6cf0: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20  (p, &nArg);.    
6d00: 2f 2a 72 65 73 69 7a 65 4f 70 41 72 72 61 79 28  /*resizeOpArray(
6d10: 70 2c 20 70 2d 3e 6e 4f 70 29 3b 2a 2f 0a 20 20  p, p->nOp);*/.  
6d20: 20 20 61 73 73 65 72 74 28 20 6e 56 61 72 3e 3d    assert( nVar>=
6d30: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 69 73 45  0 );.    if( isE
6d40: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31  xplain && nMem<1
6d50: 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4d  0 ){.      p->nM
6d60: 65 6d 20 3d 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a  em = nMem = 10;.
6d70: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4d 65      }.    p->aMe
6d80: 6d 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  m = sqlite3DbMal
6d90: 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20 20 20 20  locZero(db,.    
6da0: 20 20 20 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28      nMem*sizeof(
6db0: 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20 20 20  Mem)            
6dc0: 20 20 20 2f 2a 20 61 4d 65 6d 20 2a 2f 0a 20 20     /* aMem */.  
6dd0: 20 20 20 20 2b 20 6e 56 61 72 2a 73 69 7a 65 6f      + nVar*sizeo
6de0: 66 28 4d 65 6d 29 20 20 20 20 20 20 20 20 20 20  f(Mem)          
6df0: 20 20 20 20 20 2f 2a 20 61 56 61 72 20 2a 2f 0a       /* aVar */.
6e00: 20 20 20 20 20 20 2b 20 6e 41 72 67 2a 73 69 7a        + nArg*siz
6e10: 65 6f 66 28 4d 65 6d 2a 29 20 20 20 20 20 20 20  eof(Mem*)       
6e20: 20 20 20 20 20 20 20 2f 2a 20 61 70 41 72 67 20         /* apArg 
6e30: 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 56 61 72 2a  */.      + nVar*
6e40: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 20 20  sizeof(char*)   
6e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 7a 56            /* azV
6e60: 61 72 20 2a 2f 0a 20 20 20 20 20 20 2b 20 6e 43  ar */.      + nC
6e70: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 43 75 72  ursor*sizeof(Cur
6e80: 73 6f 72 2a 29 20 2b 20 31 20 20 20 20 2f 2a 20  sor*) + 1    /* 
6e90: 61 70 43 73 72 20 2a 2f 0a 20 20 20 20 29 3b 0a  apCsr */.    );.
6ea0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
6eb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6ec0: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20     p->aMem--;   
6ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
6ee0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
6ef0: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70  .nMem */.      p
6f00: 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20  ->nMem = nMem;  
6f10: 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e        /*       n
6f20: 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d  ot from 0..nMem-
6f30: 31 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 61 56  1 */.      p->aV
6f40: 61 72 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 6e 4d  ar = &p->aMem[nM
6f50: 65 6d 2b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e  em+1];.      p->
6f60: 6e 56 61 72 20 3d 20 6e 56 61 72 3b 0a 20 20 20  nVar = nVar;.   
6f70: 20 20 20 70 2d 3e 6f 6b 56 61 72 20 3d 20 30 3b     p->okVar = 0;
6f80: 0a 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20  .      p->apArg 
6f90: 3d 20 28 4d 65 6d 2a 2a 29 26 70 2d 3e 61 56 61  = (Mem**)&p->aVa
6fa0: 72 5b 6e 56 61 72 5d 3b 0a 20 20 20 20 20 20 70  r[nVar];.      p
6fb0: 2d 3e 61 7a 56 61 72 20 3d 20 28 63 68 61 72 2a  ->azVar = (char*
6fc0: 2a 29 26 70 2d 3e 61 70 41 72 67 5b 6e 41 72 67  *)&p->apArg[nArg
6fd0: 5d 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 43 73  ];.      p->apCs
6fe0: 72 20 3d 20 28 43 75 72 73 6f 72 2a 2a 29 26 70  r = (Cursor**)&p
6ff0: 2d 3e 61 7a 56 61 72 5b 6e 56 61 72 5d 3b 0a 20  ->azVar[nVar];. 
7000: 20 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20       p->nCursor 
7010: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  = nCursor;.     
7020: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
7030: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; n++){.        
7040: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
7050: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
7060: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
7070: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d  db = db;.      }
7080: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20  .      for(n=1; 
7090: 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20  n<=nMem; n++){. 
70a0: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
70b0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ].flags = MEM_Nu
70c0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ll;.        p->a
70d0: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
70e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
70f0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
7100: 44 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b  DEBUG.  for(n=1;
7110: 20 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29   n<p->nMem; n++)
7120: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
7130: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20  >aMem[n].db==db 
7140: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
7150: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
7160: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
7170: 3b 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74  ;.  p->uniqueCnt
7180: 20 3d 20 30 3b 0a 20 20 70 2d 3e 65 72 72 6f 72   = 0;.  p->error
7190: 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
71a0: 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20  t;.  p->explain 
71b0: 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a 20 20  |= isExplain;.  
71c0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
71d0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e  MAGIC_RUN;.  p->
71e0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
71f0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
7200: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
7210: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
7220: 20 70 2d 3e 6f 70 65 6e 65 64 53 74 61 74 65 6d   p->openedStatem
7230: 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  ent = 0;.#ifdef 
7240: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b  VDBE_PROFILE.  {
7250: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
7260: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
7270: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  p; i++){.      p
7280: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
7290: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69  ;.      p->aOp[i
72a0: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
72b0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
72c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
72d0: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20  VDBE cursor and 
72e0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  release all the 
72f0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63  resources that c
7300: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e  ursor .** happen
7310: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f  s to hold..*/.vo
7320: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
7330: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70  eeCursor(Vdbe *p
7340: 2c 20 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  , Cursor *pCx){.
7350: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
7360: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7370: 20 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73    if( pCx->pCurs
7380: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
7390: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
73a0: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b  r(pCx->pCursor);
73b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e  .  }.  if( pCx->
73c0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
73d0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
73e0: 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 23 69 66 6e  ->pBt);.  }.#ifn
73f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7400: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
7410: 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72  f( pCx->pVtabCur
7420: 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  sor ){.    sqlit
7430: 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a  e3_vtab_cursor *
7440: 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70 43  pVtabCursor = pC
7450: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b 0a  x->pVtabCursor;.
7460: 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
7470: 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c  3_module *pModul
7480: 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c 65  e = pCx->pModule
7490: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
74a0: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 28  ethod = 1;.    (
74b0: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
74c0: 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20 20  tyOff(p->db);.  
74d0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
74e0: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
74f0: 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
7500: 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62 29  3SafetyOn(p->db)
7510: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
7520: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ethod = 0;.  }.#
7530: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43 78  endif.  if( !pCx
7540: 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61 62  ->ephemPseudoTab
7550: 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  le ){.    sqlite
7560: 33 5f 66 72 65 65 28 70 43 78 2d 3e 70 44 61 74  3_free(pCx->pDat
7570: 61 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 6d 65 6d  a);.  }.  /* mem
7580: 73 65 74 28 70 43 78 2c 20 30 2c 20 73 69 7a 65  set(pCx, 0, size
7590: 6f 66 28 43 75 72 73 6f 72 29 29 3b 20 2a 2f 0a  of(Cursor)); */.
75a0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
75b0: 65 28 70 43 78 2d 3e 61 54 79 70 65 29 3b 20 2a  e(pCx->aType); *
75c0: 2f 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66  /.  /* sqlite3_f
75d0: 72 65 65 28 70 43 78 29 3b 20 2a 2f 0a 7d 0a 0a  ree(pCx); */.}..
75e0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
75f0: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 66  cursors except f
7600: 6f 72 20 56 54 61 62 20 63 75 72 73 6f 72 73 20  or VTab cursors 
7610: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
7620: 6c 79 0a 2a 2a 20 69 6e 20 75 73 65 2e 0a 2a 2f  ly.** in use..*/
7630: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f  .static void clo
7640: 73 65 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65  seAllCursorsExce
7650: 70 74 41 63 74 69 76 65 56 74 61 62 73 28 56 64  ptActiveVtabs(Vd
7660: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
7670: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 3d  .  if( p->apCsr=
7680: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
7690: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
76a0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
76b0: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
76c0: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66  apCsr[i];.    if
76d0: 28 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56  ( pC && (!p->inV
76e0: 74 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43  tabMethod || !pC
76f0: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20 29  ->pVtabCursor) )
7700: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7710: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
7720: 20 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61   pC);.      p->a
7730: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
7740: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7750: 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20  Clean up the VM 
7760: 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
7770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7780: 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74  ine will automat
7790: 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79  ically close any
77a0: 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c   cursors, lists,
77b0: 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65   and/or.** sorte
77c0: 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66  rs that were lef
77d0: 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f  t open.  It also
77e0: 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c   deletes the val
77f0: 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62  ues of.** variab
7800: 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b  les in the aVar[
7810: 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
7820: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
7830: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 66 72 65  Vdbe *p, int fre
7840: 65 62 75 66 66 65 72 73 29 7b 0a 20 20 69 6e 74  ebuffers){.  int
7850: 20 69 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75   i;.  closeAllCu
7860: 72 73 6f 72 73 45 78 63 65 70 74 41 63 74 69 76  rsorsExceptActiv
7870: 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66 6f 72  eVtabs(p);.  for
7880: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
7890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 53  ; i++){.    MemS
78a0: 65 74 54 79 70 65 46 6c 61 67 28 26 70 2d 3e 61  etTypeFlag(&p->a
78b0: 4d 65 6d 5b 69 5d 2c 20 4d 45 4d 5f 4e 75 6c 6c  Mem[i], MEM_Null
78c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
78d0: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
78e0: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 2c 20 66  m[1], p->nMem, f
78f0: 72 65 65 62 75 66 66 65 72 73 29 3b 0a 20 20 73  reebuffers);.  s
7900: 71 6c 69 74 65 33 56 64 62 65 46 69 66 6f 43 6c  qlite3VdbeFifoCl
7910: 65 61 72 28 26 70 2d 3e 73 46 69 66 6f 29 3b 0a  ear(&p->sFifo);.
7920: 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74 65 78 74    if( p->context
7930: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  Stack ){.    for
7940: 28 69 3d 30 3b 20 69 3c 70 2d 3e 63 6f 6e 74 65  (i=0; i<p->conte
7950: 78 74 53 74 61 63 6b 54 6f 70 3b 20 69 2b 2b 29  xtStackTop; i++)
7960: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
7970: 64 62 65 46 69 66 6f 43 6c 65 61 72 28 26 70 2d  dbeFifoClear(&p-
7980: 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 5b 69 5d  >contextStack[i]
7990: 2e 73 46 69 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  .sFifo);.    }. 
79a0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
79b0: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 29  p->contextStack)
79c0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e 74 65  ;.  }.  p->conte
79d0: 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 70  xtStack = 0;.  p
79e0: 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 44 65  ->contextStackDe
79f0: 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f  pth = 0;.  p->co
7a00: 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20 3d 20  ntextStackTop = 
7a10: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  0;.  sqlite3_fre
7a20: 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  e(p->zErrMsg);. 
7a30: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
7a40: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
7a50: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
7a60: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
7a70: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
7a80: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
7a90: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
7aa0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
7ab0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
7ac0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
7ad0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
7ae0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
7af0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
7b00: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
7b10: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
7b20: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
7b30: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
7b40: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
7b50: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
7b60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
7b70: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
7b80: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
7b90: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
7ba0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
7bb0: 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  ;..  releaseMemA
7bc0: 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
7bd0: 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
7be0: 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a 20  COLNAME_N, 1);. 
7bf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
7c00: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
7c10: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
7c20: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
7c30: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
7c40: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
7c50: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
7c60: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
7c70: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 2d 3e 64 62  MallocZero(p->db
7c80: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
7c90: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
7ca0: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
7cb0: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
7cc0: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
7cd0: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
7ce0: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
7cf0: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
7d00: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
7d10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
7d20: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
7d30: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
7d40: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
7d50: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
7d60: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
7d70: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
7d80: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
7d90: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
7da0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
7db0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
7dc0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
7dd0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
7de0: 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 34 5f  .**.** If N==P4_
7df0: 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73  STATIC  it means
7e00: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61   that zName is a
7e10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f   pointer to a co
7e20: 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a  nstant static.**
7e30: 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63   string and we c
7e40: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65  an just copy the
7e50: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20   pointer. If it 
7e60: 69 73 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 74  is P4_DYNAMIC, t
7e70: 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69  hen .** the stri
7e80: 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e  ng is freed usin
7e90: 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  g sqlite3_free()
7ea0: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
7eb0: 73 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a  s finished with.
7ec0: 2a 2a 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65  ** it. Otherwise
7ed0: 2c 20 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61  , N bytes of zNa
7ee0: 6d 65 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a  me are copied..*
7ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
7f00: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65  eSetColName(Vdbe
7f10: 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e   *p, int idx, in
7f20: 74 20 76 61 72 2c 20 63 6f 6e 73 74 20 63 68 61  t var, const cha
7f30: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e 29  r *zName, int N)
7f40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
7f50: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
7f60: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
7f70: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
7f80: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
7f90: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
7fa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7fb0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7fc0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 61 73 73 65 72 74  _NOMEM;.  assert
7fd0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30  ( p->aColName!=0
7fe0: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d   );.  pColName =
7ff0: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69   &(p->aColName[i
8000: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f  dx+var*p->nResCo
8010: 6c 75 6d 6e 5d 29 3b 0a 20 20 69 66 28 20 4e 3d  lumn]);.  if( N=
8020: 3d 50 34 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e  =P4_DYNAMIC || N
8030: 3d 3d 50 34 5f 53 54 41 54 49 43 20 29 7b 0a 20  ==P4_STATIC ){. 
8040: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
8050: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
8060: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
8070: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
8080: 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
8090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
80a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
80b0: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
80c0: 7a 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45  zName, N, SQLITE
80d0: 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41  _UTF8,SQLITE_TRA
80e0: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69  NSIENT);.  }.  i
80f0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8100: 20 26 26 20 4e 3d 3d 50 34 5f 44 59 4e 41 4d 49   && N==P4_DYNAMI
8110: 43 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  C ){.    pColNam
8120: 65 2d 3e 66 6c 61 67 73 20 26 3d 20 28 7e 4d 45  e->flags &= (~ME
8130: 4d 5f 53 74 61 74 69 63 29 3b 0a 20 20 20 20 70  M_Static);.    p
8140: 43 6f 6c 4e 61 6d 65 2d 3e 7a 4d 61 6c 6c 6f 63  ColName->zMalloc
8150: 20 3d 20 70 43 6f 6c 4e 61 6d 65 2d 3e 7a 3b 0a   = pColName->z;.
8160: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
8180: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
8190: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
81a0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
81b0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
81c0: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
81d0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
81e0: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
81f0: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
8200: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
8210: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
8220: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
8230: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
8240: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
8250: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
8260: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
8270: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
8280: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
8290: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
82a0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73   i;.  int nTrans
82b0: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   = 0;  /* Number
82c0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
82d0: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69  th an active wri
82e0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  te-transaction *
82f0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
8300: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
8310: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
8320: 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e    /* Before doin
8330: 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c  g anything else,
8340: 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28   call the xSync(
8350: 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  ) callback for a
8360: 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  ny.  ** virtual 
8370: 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72  module tables wr
8380: 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72  itten in this tr
8390: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
83a0: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64  has to.  ** be d
83b0: 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72  one before deter
83c0: 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61  mining whether a
83d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
83e0: 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65  file is .  ** re
83f0: 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53  quired, as an xS
8400: 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d  ync() callback m
8410: 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68  ay add an attach
8420: 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  ed database.  **
8430: 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
8440: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
8450: 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63   sqlite3VtabSync
8460: 28 64 62 2c 20 72 63 29 3b 0a 20 20 69 66 28 20  (db, rc);.  if( 
8470: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8480: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8490: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c    }..  /* This l
84a0: 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
84b0: 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
84c0: 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
84d0: 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
84e0: 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
84f0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
8500: 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
8510: 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
8520: 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
8530: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
8540: 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
8550: 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
8560: 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
8570: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
8580: 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
8590: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
85a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
85b0: 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
85c0: 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
85d0: 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
85e0: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64   .  for(i=0; i<d
85f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
8600: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
8610: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
8620: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
8630: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
8640: 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
8650: 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
8660: 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
8670: 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  rans++;.    }.  
8680: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
8690: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
86a0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
86b0: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
86c0: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
86d0: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
86e0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
86f0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 28 76  llback ){.    (v
8700: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
8710: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
8720: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
8730: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
8740: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
8750: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
8760: 6e 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  n(db);.    if( r
8770: 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
8780: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
8790: 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  INT;.    }.  }..
87a0: 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
87b0: 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
87c0: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
87d0: 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
87e0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
87f0: 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
8800: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
8810: 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
8820: 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
8830: 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
8840: 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
8850: 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
8860: 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
8870: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
8880: 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
8890: 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
88a0: 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
88b0: 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
88c0: 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
88d0: 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
88e0: 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
88f0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
8900: 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
8910: 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
8920: 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
8930: 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
8940: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 72 6c  */.  if( 0==strl
8950: 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  en(sqlite3BtreeG
8960: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
8970: 44 62 5b 30 5d 2e 70 42 74 29 29 20 7c 7c 20 6e  Db[0].pBt)) || n
8980: 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20  Trans<=1 ){.    
8990: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
89a0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
89b0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
89c0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
89d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
89e0: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
89f0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8a00: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
8a10: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
8a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
8a30: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
8a40: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
8a50: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
8a60: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
8a70: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
8a80: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
8a90: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
8aa0: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
8ab0: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
8ac0: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
8ad0: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
8ae0: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
8af0: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
8b00: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
8b10: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
8b20: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
8b30: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
8b40: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
8b50: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
8b60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
8b70: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
8b80: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
8b90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
8ba0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8bb0: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
8bc0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
8bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
8be0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
8bf0: 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d  wo(pBt);.      }
8c00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
8c10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
8c30: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
8c40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
8c50: 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
8c60: 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
8c70: 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
8c80: 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
8c90: 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
8ca0: 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
8cb0: 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
8cc0: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
8cd0: 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
8ce0: 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20  tted atomicly.. 
8cf0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
8d00: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
8d10: 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
8d20: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
8d30: 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  b->pVfs;.    int
8d40: 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20   needSync = 0;. 
8d50: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
8d60: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
8d70: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
8d80: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
8d90: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
8da0: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
8db0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
8dc0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
8dd0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
8de0: 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
8df0: 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
8e00: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
8e10: 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  es;..    /* Sele
8e20: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
8e30: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
8e40: 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
8e50: 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20  u32 random;.    
8e60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8e70: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
8e80: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
8e90: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29  s(sizeof(random)
8ea0: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20  , &random);.    
8eb0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69    zMaster = sqli
8ec0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
8ed0: 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69  %s-mj%08X", zMai
8ee0: 6e 46 69 6c 65 2c 20 72 61 6e 64 6f 6d 26 30 78  nFile, random&0x
8ef0: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20  7fffffff);.     
8f00: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b   if( !zMaster ){
8f10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8f20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
8f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
8f40: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
8f50: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
8f60: 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
8f70: 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
8f80: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
8f90: 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
8fa0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8fb0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8fc0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
8fd0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
8fe0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
8ff0: 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
9000: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
9010: 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
9020: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
9030: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
9040: 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
9050: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
9060: 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
9070: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
9080: 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
9090: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
90a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
90b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
90c0: 66 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  free(zMaster);. 
90d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
90e0: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
90f0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
9100: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
9110: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
9120: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
9130: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
9140: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
9150: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
9160: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
9170: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
9180: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
9190: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
91a0: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
91b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
91c0: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
91d0: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
91e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
91f0: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
9200: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
9210: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
9220: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
9230: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
9240: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9250: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9260: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
9270: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
9280: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
9290: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
92a0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
92b0: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
92c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
92d0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
92e0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
92f0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
9300: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
9310: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
9320: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
9330: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
9340: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
9350: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
9360: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
9370: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
9380: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
9390: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
93a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
93b0: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
93c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
93d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
93e0: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
93f0: 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29  e, strlen(zFile)
9400: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
9410: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
9420: 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b 31 3b 0a  trlen(zFile)+1;.
9430: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
9460: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
9470: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
9480: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
9490: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
94a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
94b0: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 29  e3_free(zMaster)
94c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
94d0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
94e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
94f0: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
9500: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9510: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
9520: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
9530: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
9540: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
9550: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
9560: 20 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c   */.    zMainFil
9570: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
9580: 47 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61  GetDirname(db->a
9590: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
95a0: 69 66 28 20 28 6e 65 65 64 53 79 6e 63 20 0a 20  if( (needSync . 
95b0: 20 20 20 20 26 26 20 28 30 3d 3d 28 73 71 6c 69      && (0==(sqli
95c0: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
95d0: 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
95e0: 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
95f0: 5f 53 45 51 55 45 4e 54 49 41 4c 29 29 0a 20 20  _SEQUENTIAL)).  
9600: 20 20 20 26 26 20 28 72 63 3d 73 71 6c 69 74 65     && (rc=sqlite
9610: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
9620: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
9630: 4d 41 4c 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  MAL))!=SQLITE_OK
9640: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
9650: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
9660: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
9670: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
9680: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
9690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
96a0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
96b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
96c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
96d0: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
96e0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
96f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
9700: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
9710: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
9720: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
9730: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
9740: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
9750: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
9760: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
9770: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
9780: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9790: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
97a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
97b0: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
97c0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
97d0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
97e0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
97f0: 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
9800: 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
9810: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
9820: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9830: 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
9840: 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
9850: 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
9860: 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
9870: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9880: 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
9890: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
98a0: 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
98b0: 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
98c0: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 2e 0a 20  ilure occured.. 
98d0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
98e0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
98f0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
9900: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
9910: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
9920: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
9930: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
9940: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
9950: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
9960: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
9970: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9980: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9990: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
99a0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
99b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
99c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73  qlite3_free(zMas
99d0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
99e0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
99f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
9a00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
9a10: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74  ile. This commit
9a20: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
9a30: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20  n. After.    ** 
9a40: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64  doing this the d
9a50: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63  irectory is sync
9a60: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20  ed again before 
9a70: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20  any individual. 
9a80: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
9a90: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65  n files are dele
9aa0: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
9ab0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
9ac0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
9ad0: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  er, 1);.    sqli
9ae0: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
9af0: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
9b00: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
9b10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
9b20: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
9b30: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
9b40: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
9b50: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
9b60: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
9b70: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
9b80: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
9b90: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
9ba0: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
9bb0: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
9bc0: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
9bd0: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
9be0: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
9bf0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
9c00: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
9c10: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
9c20: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
9c30: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
9c40: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
9c50: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
9c60: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
9c70: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
9c80: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
9c90: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
9ca0: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
9cb0: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
9cc0: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
9cd0: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
9ce0: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
9cf0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
9d00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
9d10: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
9d20: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
9d30: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
9d40: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
9d50: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
9d60: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
9d70: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
9d80: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
9d90: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
9da0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9db0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
9dc0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
9dd0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
9de0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
9df0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
9e00: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
9e10: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
9e20: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
9e30: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
9e40: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
9e50: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
9e60: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
9e70: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
9e80: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
9e90: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
9ea0: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
9eb0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
9ec0: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
9ed0: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
9ee0: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
9ef0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
9f00: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
9f10: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
9f20: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
9f30: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
9f40: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
9f50: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
9f60: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
9f70: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
9f80: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
9f90: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
9fa0: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
9fb0: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
9fc0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
9fd0: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62  ;.  p = db->pVdb
9fe0: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  e;.  while( p ){
9ff0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  .    if( p->magi
a000: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
a010: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b  N && p->pc>=0 ){
a020: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
a030: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
a040: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  Next;.  }.  asse
a050: 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74  rt( cnt==db->act
a060: 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a  iveVdbeCnt );.}.
a070: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
a080: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
a090: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
a0a0: 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 72 65  * For every Btre
a0b0: 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 62 61  e that in databa
a0c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
a0d0: 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 62   which .** has b
a0e0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 22 74  een modified, "t
a0f0: 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 64 61  rip" or invalida
a100: 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 20 69  te each cursor i
a110: 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 65 20  n.** that Btree 
a120: 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
a130: 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 61 74  modified so that
a140: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
a150: 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  an never be used
a160: 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 68 61   again.  This ha
a170: 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c  ppens when a rol
a180: 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73  lback.*** occurs
a190: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 74 72  .  We have to tr
a1a0: 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72  ip all the other
a1b0: 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a   cursors, even.*
a1c0: 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74  * cursor from ot
a1d0: 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 66 65  her VMs in diffe
a1e0: 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 63 6f  rent database co
a1f0: 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f  nnections,.** so
a200: 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
a210: 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  em try to use th
a220: 65 20 64 61 74 61 20 61 74 20 77 68 69 63 68 20  e data at which 
a230: 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69  they.** were poi
a240: 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 68 20  nting and which 
a250: 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 65 65  now may have bee
a260: 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a  n changed due.**
a270: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
a280: 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ..**.** Remember
a290: 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b   that a rollback
a2a0: 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 62 6c   can delete tabl
a2b0: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a  es complete and.
a2c0: 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f 74 70  ** reorder rootp
a2d0: 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 73 20  ages.  So it is 
a2e0: 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 6a  not sufficient j
a2f0: 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74  ust to save.** t
a300: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a310: 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 76 65  cursor.  We have
a320: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74   to invalidate t
a330: 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20  he cursor.** so 
a340: 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65 72  that it is never
a350: 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a   used again..*/.
a360: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
a370: 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d  lidateCursorsOnM
a380: 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 73 71  odifiedBtrees(sq
a390: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
a3a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
a3b0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a3c0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
a3d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
a3e0: 20 20 20 20 69 66 28 20 70 20 26 26 20 73 71 6c      if( p && sql
a3f0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a400: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 73  ns(p) ){.      s
a410: 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
a420: 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 51 4c  llCursors(p, SQL
a430: 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20  ITE_ABORT);.    
a440: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
a450: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a460: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
a470: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
a480: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
a490: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
a4a0: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
a4b0: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
a4c0: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
a4d0: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
a4e0: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
a4f0: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
a500: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
a510: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a520: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
a530: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
a540: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
a550: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
a560: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
a570: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
a580: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
a590: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
a5a0: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
a5b0: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
a5c0: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
a5d0: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
a5e0: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
a5f0: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
a600: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
a610: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
a620: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
a630: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
a640: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
a650: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
a660: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
a670: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
a680: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
a690: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
a6a0: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
a6b0: 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
a6c0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
a6d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28    int i;.  int (
a6e0: 2a 78 46 75 6e 63 29 28 42 74 72 65 65 20 2a 70  *xFunc)(Btree *p
a6f0: 42 74 29 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e  Bt) = 0;  /* Fun
a700: 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e  ction to call on
a710: 20 65 61 63 68 20 62 74 72 65 65 20 62 61 63 6b   each btree back
a720: 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  end */.  int isS
a730: 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
a740: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
a750: 6f 20 74 72 75 65 20 69 66 20 53 51 4c 49 54 45  o true if SQLITE
a760: 5f 4e 4f 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20  _NOMEM or IOERR 
a770: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  */..  /* This fu
a780: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
a790: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
a7a0: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
a7b0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
a7c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
a7d0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
a7e0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
a7f0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
a800: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
a810: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
a820: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
a830: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
a840: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
a850: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
a860: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
a870: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
a880: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
a890: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
a8a0: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
a8b0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
a8c0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
a8d0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
a8e0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
a8f0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
a900: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
a910: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
a920: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
a930: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
a940: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
a950: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
a960: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
a970: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
a980: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
a990: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
a9a0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
a9b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
a9c0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
a9d0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
a9e0: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
a9f0: 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a  ActiveVtabs(p);.
aa00: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
aa10: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
aa20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
aa30: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
aa40: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
aa50: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
aa60: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
aa70: 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
aa80: 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
aa90: 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  arted */.  if( p
aaa0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
aab0: 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
aac0: 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
aad0: 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20  from p->rc */.. 
aae0: 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62     /* Lock all b
aaf0: 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68  trees used by th
ab00: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
ab10: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d     sqlite3BtreeM
ab20: 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 26  utexArrayEnter(&
ab30: 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20  p->aMutex);..   
ab40: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
ab50: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
ab60: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
ab70: 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
ab80: 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
ab90: 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
aba0: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
abb0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
abe0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
abf0: 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
ac00: 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
ac10: 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
ac20: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64    /* This loop d
ac30: 6f 65 73 20 73 74 61 74 69 63 20 61 6e 61 6c 79  oes static analy
ac40: 73 69 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  sis of the query
ac50: 20 74 6f 20 73 65 65 20 77 68 69 63 68 20 6f 66   to see which of
ac60: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f   the.      ** fo
ac70: 6c 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 63 61  llowing three ca
ac80: 74 65 67 6f 72 69 65 73 20 69 74 20 66 61 6c 6c  tegories it fall
ac90: 73 20 69 6e 74 6f 3a 0a 20 20 20 20 20 20 2a 2a  s into:.      **
aca0: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65  .      **     Re
acb0: 61 64 2d 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a  ad-only.      **
acc0: 20 20 20 20 20 51 75 65 72 79 20 77 69 74 68 20       Query with 
acd0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
ace0: 6c 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 51  l.      **     Q
acf0: 75 65 72 79 20 77 69 74 68 6f 75 74 20 73 74 61  uery without sta
ad00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  tement journal. 
ad10: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ad20: 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 73 6f 6d   We could do som
ad30: 65 74 68 69 6e 67 20 6d 6f 72 65 20 65 6c 65 67  ething more eleg
ad40: 61 6e 74 20 74 68 61 6e 20 74 68 69 73 20 73 74  ant than this st
ad50: 61 74 69 63 20 61 6e 61 6c 79 73 69 73 20 28 69  atic analysis (i
ad60: 2e 65 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 6f  .e..      ** sto
ad70: 72 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 71  re the type of q
ad80: 75 65 72 79 20 61 73 20 70 61 72 74 20 6f 66 20  uery as part of 
ad90: 74 68 65 20 63 6f 6d 70 6c 69 61 74 69 6f 6e 20  the compliation 
ada0: 70 68 61 73 65 29 2c 20 62 75 74 20 0a 20 20 20  phase), but .   
adb0: 20 20 20 2a 2a 20 68 61 6e 64 6c 69 6e 67 20 6d     ** handling m
adc0: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66 61  alloc() or IO fa
add0: 69 6c 75 72 65 20 69 73 20 61 20 66 61 69 72 6c  ilure is a fairl
ade0: 79 20 6f 62 73 63 75 72 65 20 65 64 67 65 20 63  y obscure edge c
adf0: 61 73 65 20 73 6f 20 0a 20 20 20 20 20 20 2a 2a  ase so .      **
ae00: 20 74 68 69 73 20 69 73 20 70 72 6f 62 61 62 6c   this is probabl
ae10: 79 20 65 61 73 69 65 72 2e 20 54 6f 64 6f 3a 20  y easier. Todo: 
ae20: 4d 69 67 68 74 20 62 65 20 61 6e 20 6f 70 70 6f  Might be an oppo
ae30: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 64 75 63  rtunity to reduc
ae40: 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  e .      ** code
ae50: 20 73 69 7a 65 20 61 20 76 65 72 79 20 73 6d 61   size a very sma
ae60: 6c 6c 20 61 6d 6f 75 6e 74 20 74 68 6f 75 67 68  ll amount though
ae70: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
ae80: 20 20 20 69 6e 74 20 6e 6f 74 52 65 61 64 4f 6e     int notReadOn
ae90: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  ly = 0;.      in
aea0: 74 20 69 73 53 74 61 74 65 6d 65 6e 74 20 3d 20  t isStatement = 
aeb0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  0;.      assert(
aec0: 70 2d 3e 61 4f 70 20 7c 7c 20 70 2d 3e 6e 4f 70  p->aOp || p->nOp
aed0: 3d 3d 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ==0);.      for(
aee0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
aef0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 73 77  ++){ .        sw
af00: 69 74 63 68 28 20 70 2d 3e 61 4f 70 5b 69 5d 2e  itch( p->aOp[i].
af10: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
af20: 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e      case OP_Tran
af30: 73 61 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20  saction:.       
af40: 20 20 20 20 20 6e 6f 74 52 65 61 64 4f 6e 6c 79       notReadOnly
af50: 20 7c 3d 20 70 2d 3e 61 4f 70 5b 69 5d 2e 70 32   |= p->aOp[i].p2
af60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
af70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
af80: 61 73 65 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74  ase OP_Statement
af90: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  :.            is
afa0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 31 3b 0a 20  Statement = 1;. 
afb0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
afc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
afd0: 20 20 7d 0a 0a 20 20 20 0a 20 20 20 20 20 20 2f    }..   .      /
afe0: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
aff0: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
b000: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
b010: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
b020: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
b030: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
b040: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
b050: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
b060: 20 20 20 69 66 28 20 6e 6f 74 52 65 61 64 4f 6e     if( notReadOn
b070: 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
b080: 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
b090: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
b0a0: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ==SQLITE_IOERR_B
b0b0: 4c 4f 43 4b 45 44 20 26 26 20 69 73 53 74 61 74  LOCKED && isStat
b0c0: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ement ){.       
b0d0: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74     xFunc = sqlit
b0e0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
b0f0: 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  tmt;.          p
b100: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55  ->rc = SQLITE_BU
b110: 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  SY;.        } el
b120: 73 65 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c  se if( (mrc==SQL
b130: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
b140: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
b150: 26 20 69 73 53 74 61 74 65 6d 65 6e 74 20 29 7b  & isStatement ){
b160: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
b170: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
b180: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
b190: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b1a0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
b1b0: 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
b1c0: 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
b1d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
b1e0: 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
b1f0: 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
b200: 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
b210: 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
b220: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
b230: 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
b240: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
b250: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
b260: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
b270: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
b280: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
b290: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
b2a0: 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
b2b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
b2c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
b2d0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
b2e0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
b2f0: 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
b300: 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
b310: 65 20 76 64 62 65 2c 20 74 68 65 6e 0a 20 20 20  e vdbe, then.   
b320: 20 2a 2a 20 77 65 20 64 6f 20 65 69 74 68 65 72   ** we do either
b330: 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
b340: 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
b350: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
b360: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
b370: 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
b380: 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
b390: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
b3a0: 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
b3b0: 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
b3c0: 61 73 20 6f 63 63 75 72 65 64 2e 20 0a 20 20 20  as occured. .   
b3d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   */.    if( db->
b3e0: 61 75 74 6f 43 6f 6d 6d 69 74 20 26 26 20 64 62  autoCommit && db
b3f0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3d  ->activeVdbeCnt=
b400: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
b410: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b420: 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74   || (p->errorAct
b430: 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20  ion==OE_Fail && 
b440: 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29  !isSpecialError)
b450: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
b460: 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
b470: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e 64  lag is true, and
b480: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
b490: 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20 2a  m was .        *
b4a0: 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20  * successful or 
b4b0: 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
b4c0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68 69   constraint. Thi
b4d0: 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
b4e0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20   .        ** is 
b4f0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
b500: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
b510: 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74   rc = vdbeCommit
b520: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  (db);.        if
b530: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
b540: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
b550: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
b560: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
b570: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
b580: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b590: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
b5a0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
b5b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
b5c0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
b5d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b5e0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
b5f0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b600: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b610: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
b620: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
b630: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
b640: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
b650: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
b660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
b670: 65 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20  else if( !xFunc 
b680: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
b690: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b6a0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
b6b0: 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
b6c0: 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65      if( p->opene
b6d0: 64 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  dStatement ){.  
b6e0: 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20          xFunc = 
b6f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
b700: 69 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  itStmt;.        
b710: 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  } .      }else i
b720: 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
b730: 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
b740: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
b750: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b760: 61 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d  ackStmt;.      }
b770: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
b780: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
b790: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
b7a0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  db);.        sql
b7b0: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
b7c0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
b7d0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
b7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b7f0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 78 46 75 6e   .    /* If xFun
b800: 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  c is not NULL, t
b810: 68 65 6e 20 69 74 20 69 73 20 6f 6e 65 20 6f 66  hen it is one of
b820: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
b830: 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a 20 20 20  lbackStmt or.   
b840: 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
b850: 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c  CommitStmt. Call
b860: 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68   it once on each
b870: 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 6e 20   backend. If an 
b880: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 20  error occurs.   
b890: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 74 75   ** and the retu
b8a0: 72 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c  rn code is still
b8b0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20   SQLITE_OK, set 
b8c0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
b8d0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
b8e0: 2a 20 65 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20  * error value.. 
b8f0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
b900: 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20 20 20 20  (!xFunc ||.     
b910: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42   xFunc==sqlite3B
b920: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 7c  treeCommitStmt |
b930: 7c 0a 20 20 20 20 20 20 78 46 75 6e 63 3d 3d 73  |.      xFunc==s
b940: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
b950: 61 63 6b 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20  ackStmt.    );. 
b960: 20 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e     for(i=0; xFun
b970: 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  c && i<db->nDb; 
b980: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
b990: 20 72 63 3b 0a 20 20 20 20 20 20 42 74 72 65 65   rc;.      Btree
b9a0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
b9b0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
b9c0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
b9d0: 20 72 63 20 3d 20 78 46 75 6e 63 28 70 42 74 29   rc = xFunc(pBt)
b9e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
b9f0: 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49   && (p->rc==SQLI
ba00: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
ba10: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba20: 54 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  T) ){.          
ba30: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
ba40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ba50: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  ee(p->zErrMsg);.
ba60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
ba70: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
ba80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ba90: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
baa0: 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
bab0: 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
bac0: 45 54 45 20 61 6e 64 20 74 68 65 20 73 74 61 74  ETE and the stat
bad0: 65 6d 65 6e 74 20 77 61 73 20 63 6f 6d 6d 69 74  ement was commit
bae0: 74 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  ted, .    ** set
baf0: 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
bb00: 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
bb10: 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
bb20: 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  tOn && p->pc>=0 
bb30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 78 46  ){.      if( !xF
bb40: 75 6e 63 20 7c 7c 20 78 46 75 6e 63 3d 3d 73 71  unc || xFunc==sq
bb50: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
bb60: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
bb70: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
bb80: 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
bb90: 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
bba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
bbb0: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
bbc0: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
bbd0: 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
bbe0: 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
bbf0: 0a 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  .    /* Rollback
bc00: 20 6f 72 20 63 6f 6d 6d 69 74 20 61 6e 79 20 73   or commit any s
bc10: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 74 68  chema changes th
bc20: 61 74 20 6f 63 63 75 72 72 65 64 2e 20 2a 2f 0a  at occurred. */.
bc30: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
bc40: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 62 2d 3e  QLITE_OK && db->
bc50: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
bc60: 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 20  ernChanges ){.  
bc70: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
bc80: 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64  InternalSchema(d
bc90: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 62 2d  b, 0);.      db-
bca0: 3e 66 6c 61 67 73 20 3d 20 28 64 62 2d 3e 66 6c  >flags = (db->fl
bcb0: 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 49 6e 74  ags | SQLITE_Int
bcc0: 65 72 6e 43 68 61 6e 67 65 73 29 3b 0a 20 20 20  ernChanges);.   
bcd0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
bce0: 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
bcf0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
bd00: 4d 75 74 65 78 41 72 72 61 79 4c 65 61 76 65 28  MutexArrayLeave(
bd10: 26 70 2d 3e 61 4d 75 74 65 78 29 3b 0a 20 20 7d  &p->aMutex);.  }
bd20: 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73  ..  /* We have s
bd30: 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74  uccessfully halt
bd40: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68  ed and closed th
bd50: 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68  e VM.  Record th
bd60: 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66  is fact. */.  if
bd70: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
bd80: 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65    db->activeVdbe
bd90: 43 6e 74 2d 2d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Cnt--;.  }.  p->
bda0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
bdb0: 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
bdc0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
bdd0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
bde0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
bdf0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
be00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
be10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
be20: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  K;.}.../*.** Eac
be30: 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
be40: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
be50: 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
be60: 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
be70: 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
be80: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
be90: 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
bea0: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
beb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bec0: 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
bed0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
bee0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  }../*.** Clean u
bf00: 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
bf10: 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
bf20: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
bf30: 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
bf40: 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
bf50: 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
bf60: 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
bf70: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
bf80: 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
bf90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
bfa0: 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
bfb0: 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
bfc0: 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
bfd0: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
bfe0: 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
bff0: 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
c000: 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
c010: 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
c020: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
c030: 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
c040: 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
c050: 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
c060: 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
c070: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c080: 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
c090: 70 2c 20 69 6e 74 20 66 72 65 65 62 75 66 66 65  p, int freebuffe
c0a0: 72 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rs){.  sqlite3 *
c0b0: 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
c0c0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
c0d0: 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
c0e0: 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
c0f0: 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
c100: 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
c110: 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
c120: 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
c130: 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
c140: 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
c150: 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  w..  */.  (void)
c160: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
c170: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  db);.  sqlite3Vd
c180: 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28 76 6f  beHalt(p);.  (vo
c190: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
c1a0: 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49  Off(db);..  /* I
c1b0: 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
c1c0: 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
c1d0: 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
c1e0: 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
c1f0: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
c200: 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
c210: 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
c220: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
c230: 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
c240: 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
c250: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
c260: 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
c270: 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
c280: 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
c290: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
c2a0: 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
c2b0: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
c2c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
c2d0: 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
c2e0: 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
c2f0: 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
c300: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c310: 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d  3ValueSetStr(db-
c320: 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72  >pErr,-1,p->zErr
c330: 4d 73 67 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c  Msg,SQLITE_UTF8,
c340: 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20  sqlite3_free);. 
c350: 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65       db->errCode
c360: 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 20   = p->rc;.      
c370: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
c380: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
c390: 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >rc ){.      sql
c3a0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d  ite3Error(db, p-
c3b0: 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  >rc, 0);.    }el
c3c0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c3d0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
c3e0: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  E_OK, 0);.    }.
c3f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
c400: 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
c410: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
c420: 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
c430: 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
c440: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
c450: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
c460: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
c470: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
c480: 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
c490: 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
c4a0: 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
c4b0: 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
c4c0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
c4d0: 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
c4e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c4f0: 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20  , p->rc, 0);.   
c500: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
c510: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
c520: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51  , p->zErrMsg, SQ
c530: 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
c540: 65 33 5f 66 72 65 65 29 3b 0a 20 20 20 20 70 2d  e3_free);.    p-
c550: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
c560: 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20  }..  /* Reclaim 
c570: 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  all memory used 
c580: 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f  by the VDBE.  */
c590: 0a 20 20 43 6c 65 61 6e 75 70 28 70 2c 20 66 72  .  Cleanup(p, fr
c5a0: 65 65 62 75 66 66 65 72 73 29 3b 0a 0a 20 20 2f  eebuffers);..  /
c5b0: 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
c5c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
c5d0: 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
c5e0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
c5f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
c600: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
c610: 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
c620: 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
c630: 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
c640: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
c650: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
c660: 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
c670: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
c680: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
c690: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
c6a0: 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
c6b0: 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
c6c0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
c6d0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f   "\n");.      fo
c6e0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
c6f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
c700: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 36 64  printf(out, "%6d
c710: 20 25 31 30 6c 6c 64 20 25 38 6c 6c 64 20 22 2c   %10lld %8lld ",
c720: 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
c730: 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20  Op[i].cnt,.     
c740: 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
c750: 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 20  cycles,.        
c760: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
c770: 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  >0 ? p->aOp[i].c
c780: 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e  ycles/p->aOp[i].
c790: 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 20  cnt : 0.        
c7a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c7b0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75  e3VdbePrintOp(ou
c7c0: 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d  t, i, &p->aOp[i]
c7d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c7e0: 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
c7f0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
c800: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
c810: 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70  _MAGIC_INIT;.  p
c820: 2d 3e 61 62 6f 72 74 65 64 20 3d 20 30 3b 0a 20  ->aborted = 0;. 
c830: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
c840: 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
c850: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
c860: 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
c870: 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
c880: 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
c890: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
c8a0: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
c8b0: 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
c8c0: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
c8d0: 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
c8e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
c8f0: 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
c900: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
c910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
c920: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
c930: 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
c940: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
c950: 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
c960: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
c970: 65 73 65 74 28 70 2c 20 31 29 3b 0a 20 20 20 20  eset(p, 1);.    
c980: 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d  assert( (rc & p-
c990: 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72  >db->errMask)==r
c9a0: 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  c );.  }else if(
c9b0: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
c9c0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20  MAGIC_INIT ){.  
c9d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c9e0: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 72 65  MISUSE;.  }.  re
c9f0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70  leaseMemArray(&p
ca00: 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d  ->aMem[1], p->nM
ca10: 65 6d 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  em, 1);.  sqlite
ca20: 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
ca30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ca40: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64  /*.** Call the d
ca50: 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61  estructor for ea
ca60: 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79  ch auxdata entry
ca70: 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f   in pVdbeFunc fo
ca80: 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63  r which.** the c
ca90: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
caa0: 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61   in mask is clea
cab0: 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72  r.  Auxdata entr
cac0: 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a  ies beyond 31.**
cad0: 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74   are always dest
cae0: 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72  royed.  To destr
caf0: 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65  oy all auxdata e
cb00: 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69  ntries, call thi
cb10: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74  s.** routine wit
cb20: 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f  h mask==0..*/.vo
cb30: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  id sqlite3VdbeDe
cb40: 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65  leteAuxData(Vdbe
cb50: 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c  Func *pVdbeFunc,
cb60: 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e   int mask){.  in
cb70: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
cb80: 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75  i<pVdbeFunc->nAu
cb90: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  x; i++){.    str
cba0: 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75  uct AuxData *pAu
cbb0: 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e  x = &pVdbeFunc->
cbc0: 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66  apAux[i];.    if
cbd0: 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73  ( (i>31 || !(mas
cbe0: 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 20 70 41  k&(1<<i))) && pA
cbf0: 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20  ux->pAux ){.    
cc00: 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c    if( pAux->xDel
cc10: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ete ){.        p
cc20: 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75  Aux->xDelete(pAu
cc30: 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20  x->pAux);.      
cc40: 7d 0a 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41  }.      pAux->pA
cc50: 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ux = 0;.    }.  
cc60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
cc70: 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45  e an entire VDBE
cc80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cc90: 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65  3VdbeDelete(Vdbe
cca0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
ccb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
ccc0: 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 28 70 2c  rn;.  Cleanup(p,
ccd0: 20 31 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50   1);.  if( p->pP
cce0: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  rev ){.    p->pP
ccf0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
cd00: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
cd10: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
cd20: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
cd30: 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20     p->db->pVdbe 
cd40: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  = p->pNext;.  }.
cd50: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
cd60: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e  {.    p->pNext->
cd70: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
cd80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
cd90: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
cda0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20  p = p->aOp;.    
cdb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
cdc0: 70 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  p; i++, pOp++){.
cdd0: 20 20 20 20 20 20 66 72 65 65 50 34 28 70 4f 70        freeP4(pOp
cde0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
cdf0: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
ce00: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
ce10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f 70  sqlite3_free(pOp
ce20: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
ce30: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
ce40: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ce50: 70 2d 3e 61 4f 70 29 3b 0a 20 20 7d 0a 20 20 72  p->aOp);.  }.  r
ce60: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
ce70: 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 2c  ->aVar, p->nVar,
ce80: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   1);.  sqlite3_f
ce90: 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a  ree(p->aLabel);.
cea0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
ceb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
cec0: 65 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 29 3b 0a  e(&p->aMem[1]);.
ced0: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
cee0: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
cef0: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
cf00: 2a 43 4f 4c 4e 41 4d 45 5f 4e 2c 20 31 29 3b 0a  *COLNAME_N, 1);.
cf10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cf20: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
cf30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a  qlite3_free(p->z
cf40: 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69 63  Sql);.  p->magic
cf50: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45   = VDBE_MAGIC_DE
cf60: 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  AD;.  sqlite3_fr
cf70: 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ee(p);.}../*.** 
cf80: 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
cf90: 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
cfa0: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
cfb0: 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
cfc0: 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
cfd0: 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
cfe0: 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20  or code.  If no 
cff0: 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 6e  MoveTo is pendin
d000: 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  g, this.** routi
d010: 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20  ne does nothing 
d020: 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49  and returns SQLI
d030: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
d040: 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
d050: 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 29  oveto(Cursor *p)
d060: 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72  {.  if( p->defer
d070: 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
d080: 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
d090: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
d0a0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
d0b0: 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
d0c0: 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ount;.#endif.   
d0d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
d0e0: 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ble );.    rc = 
d0f0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
d100: 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  to(p->pCursor, 0
d110: 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61  , 0, p->movetoTa
d120: 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a  rget, 0, &res);.
d130: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
d140: 75 72 6e 20 72 63 3b 0a 20 20 20 20 2a 70 2d 3e  urn rc;.    *p->
d150: 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a 20 20  pIncrKey = 0;.  
d160: 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d    p->lastRowid =
d170: 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76   keyToInt(p->mov
d180: 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 20 20  etoTarget);.    
d190: 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
d1a0: 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 69 66  = res==0;.    if
d1b0: 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20  ( res<0 ){.     
d1c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
d1d0: 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 6f  eeNext(p->pCurso
d1e0: 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20 20  r, &res);.      
d1f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
d200: 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  rc;.    }.#ifdef
d210: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20   SQLITE_TEST.   
d220: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
d230: 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
d240: 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d      p->deferredM
d250: 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70  oveto = 0;.    p
d260: 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
d270: 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d  CACHE_STALE;.  }
d280: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d290: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
d2a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63  e following func
d2b0: 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c  tions:.**.** sql
d2c0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d2d0: 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  pe().** sqlite3V
d2e0: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
d2f0: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
d300: 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a  eSerialRead().**
d310: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
d320: 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
d330: 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 69 74  e3VdbeSerialWrit
d340: 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  e().**.** encaps
d350: 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
d360: 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
d370: 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
d380: 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
d390: 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
d3a0: 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
d3b0: 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
d3c0: 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
d3d0: 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
d3e0: 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
d3f0: 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
d400: 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
d410: 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
d420: 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
d430: 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
d440: 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
d450: 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
d460: 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
d470: 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
d480: 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
d490: 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
d4a0: 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
d4b0: 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
d4c0: 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
d4d0: 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
d4e0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
d4f0: 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
d500: 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
d510: 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
d520: 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
d530: 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
d540: 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
d550: 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
d560: 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
d570: 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a  b seperately..**
d580: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
d590: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
d5a0: 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
d5b0: 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
d5c0: 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
d5d0: 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
d5e0: 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
d5f0: 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
d600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
d610: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
d620: 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
d630: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d660: 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d680: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
d690: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
d6a0: 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
d6c0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
d6d0: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
d6e0: 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
d6f0: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
d700: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
d710: 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
d720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d730: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
d740: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
d750: 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
d760: 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
d770: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
d780: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
d790: 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
d7a0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
d7b0: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
d7c0: 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
d7f0: 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
d800: 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
d810: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
d820: 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
d830: 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
d860: 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
d870: 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
d8a0: 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
d8b0: 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
d8c0: 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
d8d0: 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
d8e0: 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
d8f0: 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
d900: 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
d910: 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
d920: 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
d930: 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
d940: 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
d950: 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
d960: 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
d970: 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
d980: 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
d990: 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
d9a0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
d9b0: 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
d9c0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
d9d0: 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
d9e0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
d9f0: 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
da00: 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
da10: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
da20: 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74  em->flags;.  int
da30: 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
da40: 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
da50: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
da60: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
da70: 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
da80: 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
da90: 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
daa0: 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
dab0: 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
dac0: 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
dad0: 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
dae0: 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
daf0: 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
db00: 20 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65   u;.    if( file
db10: 5f 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69  _format>=4 && (i
db20: 26 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  &1)==i ){.      
db30: 72 65 74 75 72 6e 20 38 2b 69 3b 0a 20 20 20 20  return 8+i;.    
db40: 7d 0a 20 20 20 20 75 20 3d 20 69 3c 30 20 3f 20  }.    u = i<0 ? 
db50: 2d 69 20 3a 20 69 3b 0a 20 20 20 20 69 66 28 20  -i : i;.    if( 
db60: 75 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20  u<=127 ) return 
db70: 31 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32  1;.    if( u<=32
db80: 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
db90: 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
dba0: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
dbb0: 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
dbc0: 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
dbd0: 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
dbe0: 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
dbf0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
dc00: 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
dc10: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
dc20: 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
dc30: 61 73 73 65 72 74 28 20 66 6c 61 67 73 26 28 4d  assert( flags&(M
dc40: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
dc50: 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e   );.  n = pMem->
dc60: 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
dc70: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
dc80: 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b   n += pMem->u.i;
dc90: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
dca0: 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
dcb0: 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
dcc0: 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
dcd0: 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  0));.}../*.** Re
dce0: 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
dcf0: 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
dd00: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
dd10: 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
dd20: 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -type..*/.int sq
dd30: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
dd40: 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
dd50: 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
dd60: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
dd70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65  {.    return (se
dd80: 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b  rial_type-12)/2;
dd90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
dda0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53  atic const u8 aS
ddb0: 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20  ize[] = { 0, 1, 
ddc0: 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38  2, 3, 4, 6, 8, 8
ddd0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
dde0: 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65      return aSize
ddf0: 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
de00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77   }.}../*.** If w
de10: 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68  e are on an arch
de20: 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69  itecture with mi
de30: 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74  xed-endian float
de40: 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28  ing .** points (
de50: 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73  ex: ARM7) then s
de60: 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20  wap the lower 4 
de70: 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a  bytes with the .
de80: 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73  ** upper 4 bytes
de90: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  .  Return the re
dea0: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  sult..**.** For 
deb0: 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72  most architectur
dec0: 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  es, this is a no
ded0: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65  -op..**.** (late
dee0: 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72  r):  It is repor
def0: 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74  ted to me that t
df00: 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  he mixed-endian 
df10: 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52  problem.** on AR
df20: 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77  M7 is an issue w
df30: 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74  ith GCC, not wit
df40: 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e  h the ARM7 chip.
df50: 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68    It seems.** th
df60: 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e  at early version
df70: 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20  s of GCC stored 
df80: 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66  the two words of
df90: 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f   a 64-bit.** flo
dfa0: 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20  at in the wrong 
dfb0: 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74  order.  And that
dfc0: 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
dfd0: 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76  propagated.** ev
dfe0: 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62  er since.  The b
dff0: 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  lame is not nece
e000: 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43  ssarily with GCC
e010: 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43  , though..** GCC
e020: 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74   might have just
e030: 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f   copying the pro
e040: 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f  blem from a prio
e050: 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49  r compiler..** I
e060: 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68   am also told th
e070: 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  at newer version
e080: 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f  s of GCC that fo
e090: 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74  llow a different
e0a0: 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20  .** ABI get the 
e0b0: 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74  byte order right
e0c0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65  ..**.** Develope
e0d0: 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20  rs using SQLite 
e0e0: 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c  on an ARM7 shoul
e0f0: 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75  d compile and ru
e100: 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69  n their.** appli
e110: 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53  cation using -DS
e120: 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74  QLITE_DEBUG=1 at
e130: 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69   least once.  Wi
e140: 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62  th DEBUG.** enab
e150: 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74  led, some assert
e160: 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73  s below will ens
e170: 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74  ure that the byt
e180: 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c  e order of.** fl
e190: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
e1a0: 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ues is correct..
e1b0: 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33  **.** (2007-08-3
e1c0: 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75  0)  Frank van Vu
e1d0: 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74  gt has studied t
e1e0: 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73  his problem clos
e1f0: 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73  ely.** and has s
e200: 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73  end his findings
e210: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64   to the SQLite d
e220: 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e  evelopers.  Fran
e230: 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74  k.** writes that
e240: 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e   some Linux kern
e250: 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69  els offer floati
e260: 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72  ng point hardwar
e270: 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74  e.** emulation t
e280: 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32  hat uses only 32
e290: 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69  -bit mantissas i
e2a0: 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c  nstead of a full
e2b0: 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20   .** 48-bits as 
e2c0: 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20  required by the 
e2d0: 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20  IEEE standard.  
e2e0: 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20  (This is the.** 
e2f0: 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46  CONFIG_FPE_FASTF
e300: 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20  PE option.)  On 
e310: 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c  such systems, fl
e320: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
e330: 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65  byte swapping be
e340: 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c  comes very compl
e350: 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69  icated.  To avoi
e360: 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74  d problems,.** t
e370: 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74  he necessary byt
e380: 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61  e swapping is ca
e390: 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20  rried out using 
e3a0: 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  a 64-bit integer
e3b0: 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20  .** rather than 
e3c0: 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20  a 64-bit float. 
e3d0: 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75   Frank assures u
e3e0: 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  s that the code 
e3f0: 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f  here.** works fo
e400: 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20  r him.  We, the 
e410: 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65  developers, have
e420: 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70   no way to indep
e430: 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69  endently.** veri
e440: 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61  fy this, but Fra
e450: 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77  nk seems to know
e460: 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b   what he is talk
e470: 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20  ing about.** so 
e480: 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f  we trust him..*/
e490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
e4a0: 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
e4b0: 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75  T_FLOAT.static u
e4c0: 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34  64 floatSwap(u64
e4d0: 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a   in){.  union {.
e4e0: 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75      u64 r;.    u
e4f0: 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a  32 i[2];.  } u;.
e500: 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20    u32 t;..  u.r 
e510: 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b  = in;.  t = u.i[
e520: 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75  0];.  u.i[0] = u
e530: 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20  .i[1];.  u.i[1] 
e540: 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e  = t;.  return u.
e550: 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77  r;.}.# define sw
e560: 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
e570: 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74  at(X)  X = float
e580: 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20  Swap(X).#else.# 
e590: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
e5a0: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23  EndianFloat(X).#
e5b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
e5c0: 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65  te the serialize
e5d0: 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20  d data blob for 
e5e0: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
e5f0: 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a   in pMem into .*
e600: 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73  * buf. It is ass
e610: 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
e620: 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74  ller has allocat
e630: 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  ed sufficient sp
e640: 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ace..** Return t
e650: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
e660: 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a  es written..**.*
e670: 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d  * nBuf is the am
e680: 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65  ount of space le
e690: 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 6e 42  ft in buf[].  nB
e6a0: 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  uf must always b
e6b0: 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67  e.** large enoug
e6c0: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e  h to hold the en
e6d0: 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45 78 63  tire field.  Exc
e6e0: 65 70 74 2c 20 69 66 20 74 68 65 20 66 69 65 6c  ept, if the fiel
e6f0: 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62 20 77  d is.** a blob w
e700: 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c 6c 65  ith a zero-fille
e710: 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62 75 66  d tail, then buf
e720: 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75 73 74  [] might be just
e730: 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20 73 69   the right.** si
e740: 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65 72 79  ze to hold every
e750: 74 68 69 6e 67 20 65 78 63 65 70 74 20 66 6f 72  thing except for
e760: 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64   the zero-filled
e770: 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66 5b 5d   tail.  If buf[]
e780: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69 67 20  .** is only big 
e790: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74  enough to hold t
e7a0: 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 65 66  he non-zero pref
e7b0: 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ix, then only wr
e7c0: 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72 65 66  ite that.** pref
e7d0: 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  ix into buf[].  
e7e0: 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69 73 20  But if buf[] is 
e7f0: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
e800: 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a 2a 2a  hold both the.**
e810: 20 70 72 65 66 69 78 20 61 6e 64 20 74 68 65 20   prefix and the 
e820: 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74 65 20  tail then write 
e830: 74 68 65 20 70 72 65 66 69 78 20 61 6e 64 20 73  the prefix and s
e840: 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f 20 61  et the tail to a
e850: 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a  ll.** zeros..**.
e860: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
e870: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
e880: 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
e890: 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
e8a0: 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
e8b0: 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
e8c0: 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
e8d0: 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
e8e0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
e8f0: 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
e900: 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
e910: 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e 74 20   buf[]..*/ .int 
e920: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
e930: 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 69 6e  lPut(u8 *buf, in
e940: 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  t nBuf, Mem *pMe
e950: 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d  m, int file_form
e960: 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72 69 61  at){.  u32 seria
e970: 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74 65 33  l_type = sqlite3
e980: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 70  VdbeSerialType(p
e990: 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d 61 74  Mem, file_format
e9a0: 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20  );.  int len;.. 
e9b0: 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
e9c0: 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
e9d0: 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
e9e0: 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
e9f0: 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
ea00: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73  int i;.    if( s
ea10: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
ea20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
ea30: 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
ea40: 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
ea50: 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
ea60: 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
ea70: 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
ea80: 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
ea90: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
eaa0: 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
eab0: 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
eac0: 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
ead0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
eae0: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
eaf0: 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c 3d 6e    assert( len<=n
eb00: 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65  Buf );.    while
eb10: 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62  ( i-- ){.      b
eb20: 75 66 5b 69 5d 20 3d 20 28 76 26 30 78 46 46 29  uf[i] = (v&0xFF)
eb30: 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
eb40: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
eb50: 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
eb60: 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
eb70: 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
eb80: 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
eb90: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
eba0: 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
ebb0: 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
ebc0: 2d 3e 75 2e 69 3a 30 29 0a 20 20 20 20 20 20 20  ->u.i:0).       
ebd0: 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65 33        == sqlite3
ebe0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
ebf0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
ec00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
ec10: 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20  em->n<=nBuf );. 
ec20: 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
ec30: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66  ;.    memcpy(buf
ec40: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b  , pMem->z, len);
ec50: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66  .    if( pMem->f
ec60: 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
ec70: 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  ){.      len += 
ec80: 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pMem->u.i;.     
ec90: 20 69 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b   if( len>nBuf ){
eca0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e  .        len = n
ecb0: 42 75 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Buf;.      }.   
ecc0: 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70     memset(&buf[p
ecd0: 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d  Mem->n], 0, len-
ece0: 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a  pMem->n);.    }.
ecf0: 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
ed00: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
ed10: 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
ed20: 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
ed30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72  ;.}../*.** Deser
ed40: 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20  ialize the data 
ed50: 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20  blob pointed to 
ed60: 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c  by buf as serial
ed70: 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70   type serial_typ
ed80: 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74  e.** and store t
ed90: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65  he result in pMe
eda0: 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  m.  Return the n
edb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
edc0: 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ead..*/ .int sql
edd0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
ede0: 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
edf0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
ee00: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
ee10: 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
ee20: 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
ee30: 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
ee40: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
ee50: 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
ee60: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
ee90: 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
eea0: 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
eeb0: 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
eec0: 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
eed0: 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
eee0: 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
eef0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
ef00: 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
ef10: 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
ef20: 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
ef30: 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  /* NULL */.     
ef40: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ef50: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
ef60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ef70: 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
ef80: 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
ef90: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
efa0: 2d 3e 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20  ->u.i = (signed 
efb0: 63 68 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20  char)buf[0];.   
efc0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
efd0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
efe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
eff0: 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
f000: 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
f010: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
f020: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73  pMem->u.i = (((s
f030: 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30  igned char)buf[0
f040: 5d 29 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b  ])<<8) | buf[1];
f050: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
f060: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
f070: 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
f080: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
f090: 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
f0a0: 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
f0b0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
f0c0: 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
f0d0: 75 66 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62  uf[0])<<16) | (b
f0e0: 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b  uf[1]<<8) | buf[
f0f0: 32 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  2];.      pMem->
f100: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
f110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b  .      return 3;
f120: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f130: 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
f140: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
f150: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
f160: 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20   = (buf[0]<<24) 
f170: 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c  | (buf[1]<<16) |
f180: 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62   (buf[2]<<8) | b
f190: 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65  uf[3];.      pMe
f1a0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
f1b0: 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
f1c0: 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
f1d0: 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
f1e0: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
f1f0: 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20   */.      u64 x 
f200: 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72  = (((signed char
f210: 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62  )buf[0])<<8) | b
f220: 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32  uf[1];.      u32
f230: 20 79 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34   y = (buf[2]<<24
f240: 29 20 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29  ) | (buf[3]<<16)
f250: 20 7c 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c   | (buf[4]<<8) |
f260: 20 62 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78   buf[5];.      x
f270: 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a   = (x<<32) | y;.
f280: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
f290: 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
f2a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
f2b0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
f2c0: 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
f2d0: 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
f2e0: 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
f2f0: 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
f300: 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
f310: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
f320: 2f 0a 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20  /.      u64 x;. 
f330: 20 20 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20       u32 y;.#if 
f340: 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
f350: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
f360: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
f370: 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f  G_POINT).      /
f380: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e  * Verify that in
f390: 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74  tegers and float
f3a0: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
f3b0: 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20   use the same.  
f3c0: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
f3d0: 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
f3e0: 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
f3f0: 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
f400: 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69  is.      ** defi
f410: 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
f420: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
f430: 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
f440: 20 6d 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20   mixed.      ** 
f450: 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f  endian..      */
f460: 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
f470: 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
f480: 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
f490: 33 32 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63  32;.      static
f4a0: 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
f4b0: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36   = 1.0;.      u6
f4c0: 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20  4 t2 = t1;.     
f4d0: 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
f4e0: 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20  Float(t2);.     
f4f0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f500: 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
f510: 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
f520: 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
f530: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  =0 );.#endif..  
f540: 20 20 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c      x = (buf[0]<
f550: 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
f560: 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
f570: 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
f580: 20 20 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32    y = (buf[4]<<2
f590: 34 29 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36  4) | (buf[5]<<16
f5a0: 29 20 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20  ) | (buf[6]<<8) 
f5b0: 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20  | buf[7];.      
f5c0: 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b  x = (x<<32) | y;
f5d0: 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
f5e0: 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20  l_type==6 ){.   
f5f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
f600: 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
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 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f640: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
f650: 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70  )==8 && sizeof(p
f660: 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20  Mem->r)==8 );.  
f670: 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
f680: 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
f690: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
f6a0: 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65  Mem->r, &x, size
f6b0: 6f 66 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20  of(x));.        
f6c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
f6d0: 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
f6e0: 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  >r) ? MEM_Null :
f6f0: 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20   MEM_Real;.     
f700: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
f710: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  8;.    }.    cas
f720: 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
f730: 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
f740: 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
f750: 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  r 1 */.      pMe
f760: 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
f770: 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
f780: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
f790: 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
f7a0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
f7b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
f7c0: 69 6e 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61  int len = (seria
f7d0: 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
f7e0: 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63      pMem->z = (c
f7f0: 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20  har *)buf;.     
f800: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a   pMem->n = len;.
f810: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c        pMem->xDel
f820: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
f830: 73 65 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31  serial_type&0x01
f840: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
f850: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
f860: 72 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20  r | MEM_Ephem;. 
f870: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f880: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
f890: 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d  = MEM_Blob | MEM
f8a0: 5f 45 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a  _Ephem;.      }.
f8b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e        return len
f8c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f8d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn 0;.}.../*.*
f8e0: 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79  * Given the nKey
f8f0: 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f  -byte encoding o
f900: 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b  f a record in pK
f910: 65 79 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a  ey[], parse the.
f920: 2a 2a 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61  ** record into a
f930: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
f940: 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75  structure.  Retu
f950: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
f960: 2a 2a 20 74 68 61 74 20 73 74 72 75 63 74 75 72  ** that structur
f970: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  e..**.** The cal
f980: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69  ling function mi
f990: 67 68 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70  ght provide szSp
f9a0: 61 63 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  ace bytes of mem
f9b0: 6f 72 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20  ory.** space at 
f9c0: 70 53 70 61 63 65 2e 20 20 54 68 69 73 20 73 70  pSpace.  This sp
f9d0: 61 63 65 20 63 61 6e 20 62 65 20 75 73 65 64 20  ace can be used 
f9e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
f9f0: 72 6e 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73  rned.** VDbePars
fa00: 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
fa10: 72 65 20 69 66 20 69 74 20 69 73 20 6c 61 72 67  re if it is larg
fa20: 65 20 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74  e enough.  If it
fa30: 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65   is.** not big e
fa40: 6e 6f 75 67 68 2c 20 73 70 61 63 65 20 69 73 20  nough, space is 
fa50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
fa60: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
fa70: 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
fa80: 65 64 20 73 74 72 75 63 74 75 72 65 20 73 68 6f  ed structure sho
fa90: 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79  uld be closed by
faa0: 20 61 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71   a call to.** sq
fab0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55  lite3VdbeDeleteU
fac0: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e  npackedRecord().
fad0: 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63  .*/ .UnpackedRec
fae0: 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
faf0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
fb00: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
fb10: 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
fb20: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
fb30: 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
fb40: 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
fb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
fb60: 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
fb70: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
fb80: 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
fb90: 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
fba0: 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 76 6f 69   record */.  voi
fbb0: 64 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20  d *pSpace,      
fbc0: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
fbd0: 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72  ilable to hold r
fbe0: 65 73 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20  esulting object 
fbf0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
fc00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fc10: 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
fc20: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
fc30: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
fc40: 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
fc50: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
fc60: 72 20 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61  r *)pKey;.  Unpa
fc70: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20  ckedRecord *p;. 
fc80: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
fc90: 74 20 69 2c 20 69 64 78 2c 20 64 3b 0a 20 20 75  t i, idx, d;.  u
fca0: 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
fcb0: 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65  *pMem;.  .  asse
fcc0: 72 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e  rt( sizeof(Mem)>
fcd0: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
fce0: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d  nByte = sizeof(M
fcf0: 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
fd00: 46 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20  Field+2);.  if( 
fd10: 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
fd20: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
fd30: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
fd40: 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
fd50: 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
fd60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
fd70: 2d 3e 6e 65 65 64 46 72 65 65 20 3d 20 31 3b 0a  ->needFree = 1;.
fd80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
fd90: 20 70 53 70 61 63 65 3b 0a 20 20 20 20 70 2d 3e   pSpace;.    p->
fda0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
fdb0: 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  }.  p->pKeyInfo 
fdc0: 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
fdd0: 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
fde0: 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
fdf0: 20 20 70 2d 3e 6e 65 65 64 44 65 73 74 72 6f 79    p->needDestroy
fe00: 20 3d 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20   = 1;.  p->aMem 
fe10: 3d 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d 2a  = pMem = &((Mem*
fe20: 29 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d 20  )p)[1];.  idx = 
fe30: 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
fe40: 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
fe50: 73 7a 48 64 72 3b 0a 20 20 69 20 3d 20 30 3b 0a  szHdr;.  i = 0;.
fe60: 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
fe70: 64 72 20 26 26 20 69 3c 70 2d 3e 6e 46 69 65 6c  dr && i<p->nFiel
fe80: 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  d ){.    u32 ser
fe90: 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
fea0: 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
feb0: 32 28 20 61 4b 65 79 2b 69 64 78 2c 20 73 65 72  2( aKey+idx, ser
fec0: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
fed0: 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20 73 71  f( d>=nKey && sq
fee0: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
fef0: 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
ff00: 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 20  pe)>0 ) break;. 
ff10: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
ff20: 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
ff30: 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
ff40: 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 70  yInfo->db;.    p
ff50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a  Mem->flags = 0;.
ff60: 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f      pMem->zMallo
ff70: 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  c = 0;.    d += 
ff80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ff90: 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
ffa0: 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
ffb0: 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
ffc0: 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d     i++;.  }.  p-
ffd0: 3e 6e 46 69 65 6c 64 20 3d 20 69 3b 0a 20 20 72  >nField = i;.  r
ffe0: 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a  eturn (void*)p;.
fff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
10000 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61  utine destroys a
10010 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
10020 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
10030 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
10040 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 55  UnpackedRecord(U
10050 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
10060 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
10070 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 44 65 73    if( p->needDes
10080 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  troy ){.      in
10090 74 20 69 3b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  t i;.      Mem *
100a0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28  pMem;.      for(
100b0 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e 61 4d 65  i=0, pMem=p->aMe
100c0 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20  m; i<p->nField; 
100d0 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20  i++, pMem++){.  
100e0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
100f0 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
10100 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10110 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
10120 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10130 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10140 28 20 70 2d 3e 6e 65 65 64 46 72 65 65 20 29 7b  ( p->needFree ){
10150 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
10160 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  ree(p);.    }.  
10170 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
10180 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
10190 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
101a0 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
101b0 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
101c0 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
101d0 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
101e0 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
101f0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
10200 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
10210 65 67 65 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20  eger if {nKey1, 
10220 70 4b 65 79 31 7d 20 69 73 20 6c 65 73 73 20 74  pKey1} is less t
10230 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
10240 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
10250 6e 20 70 50 4b 65 79 32 2e 20 20 54 68 65 20 7b  n pPKey2.  The {
10260 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65  nKey1, pKey1} ke
10270 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62  y must be a blob
10280 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
10290 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  h OP_MakeRecord 
102a0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
102b0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
102c0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
102d0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
102e0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
102f0 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
10300 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
10310 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
10320 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
10330 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
10340 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
10350 73 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65  s..** But if the
10360 20 6c 65 6e 67 74 68 73 20 64 69 66 66 65 72 2c   lengths differ,
10370 20 4b 65 79 32 20 6d 75 73 74 20 62 65 20 74 68   Key2 must be th
10380 65 20 73 68 6f 72 74 65 72 20 6f 66 20 74 68 65  e shorter of the
10390 20 74 77 6f 2e 0a 2a 2a 0a 2a 2a 20 48 69 73 74   two..**.** Hist
103a0 6f 72 69 63 61 6c 20 6e 6f 74 65 3a 20 49 6e 20  orical note: In 
103b0 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  earlier versions
103c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
103d0 20 62 6f 74 68 20 4b 65 79 31 0a 2a 2a 20 61 6e   both Key1.** an
103e0 64 20 4b 65 79 32 20 77 65 72 65 20 62 6c 6f 62  d Key2 were blob
103f0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
10400 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 20 20  OP_MakeRecord.  
10410 42 75 74 20 77 65 20 66 6f 75 6e 64 0a 2a 2a 20  But we found.** 
10420 74 68 61 74 20 69 6e 20 74 79 70 69 63 61 6c 20  that in typical 
10430 75 73 65 20 74 68 65 20 73 61 6d 65 20 4b 65 79  use the same Key
10440 32 20 77 6f 75 6c 64 20 62 65 20 73 75 62 6d 69  2 would be submi
10450 74 74 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69  tted multiple ti
10460 6d 65 73 0a 2a 2a 20 69 6e 20 61 20 72 6f 77 2e  mes.** in a row.
10470 20 20 53 6f 20 61 6e 20 6f 70 74 69 6d 69 7a 61    So an optimiza
10480 74 69 6f 6e 20 77 61 73 20 61 64 64 65 64 20 74  tion was added t
10490 6f 20 70 61 72 73 65 20 74 68 65 20 4b 65 79 32  o parse the Key2
104a0 20 6b 65 79 0a 2a 2a 20 73 65 70 61 72 61 74 65   key.** separate
104b0 6c 79 20 61 6e 64 20 73 75 62 6d 69 74 20 74 68  ly and submit th
104c0 65 20 70 61 72 73 65 64 20 76 65 72 73 69 6f 6e  e parsed version
104d0 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20  .  In this way, 
104e0 77 65 20 61 76 6f 69 64 0a 2a 2a 20 70 61 72 73  we avoid.** pars
104f0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 4b 65 79  ing the same Key
10500 32 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  2 multiple times
10510 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2f 0a 69 6e   in a row..*/.in
10520 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  t sqlite3VdbeRec
10530 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e  ordCompare(.  in
10540 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
10550 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 55  oid *pKey1, .  U
10560 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
10570 50 4b 65 79 32 0a 29 7b 0a 20 20 75 33 32 20 64  PKey2.){.  u32 d
10580 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
10590 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
105a0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
105b0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
105c0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
105d0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
105e0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
105f0 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
10600 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
10610 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10620 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
10630 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
10640 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  0;.  int nField;
10650 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
10660 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
10670 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
10680 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10690 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
106a0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
106b0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
106c0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
106d0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d  2->pKeyInfo;.  m
106e0 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
106f0 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
10700 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
10710 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20  b;.  mem1.flags 
10720 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a 4d 61 6c  = 0;.  mem1.zMal
10730 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69 64  loc = 0;.  .  id
10740 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
10750 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
10760 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
10770 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49    nField = pKeyI
10780 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77  nfo->nField;.  w
10790 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
107a0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
107b0 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75 33 32  Field ){.    u32
107c0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a   serial_type1;..
107d0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
107e0 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72  serial types for
107f0 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e   the next elemen
10800 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a  t in each key. *
10810 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65  /.    idx1 += ge
10820 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31  tVarint32( aKey1
10830 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79  +idx1, serial_ty
10840 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28 20 64  pe1 );.    if( d
10850 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71 6c 69  1>=nKey1 && sqli
10860 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
10870 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
10880 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  1)>0 ) break;.. 
10890 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
108a0 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
108b0 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
108c0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
108d0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
108e0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
108f0 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
10900 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
10910 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
10920 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
10930 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
10940 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
10950 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  m[i],.          
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b 65 79   i<nField ? pKey
10980 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3a  Info->aColl[i] :
10990 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
109a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
109b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  k;.    }.    i++
109c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65 6d 31  ;.  }.  if( mem1
109d0 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  .zMalloc ) sqlit
109e0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
109f0 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a 20 4f  (&mem1);..  /* O
10a00 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
10a10 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
10a20 2c 20 62 75 74 20 61 6c 6c 20 74 68 65 20 66 69  , but all the fi
10a30 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
10a40 70 6f 69 6e 74 0a 20 20 2a 2a 20 77 65 72 65 20  point.  ** were 
10a50 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 69 6e  equal. If the in
10a60 63 72 4b 65 79 20 66 6c 61 67 20 69 73 20 74 72  crKey flag is tr
10a70 75 65 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  ue, then the sec
10a80 6f 6e 64 20 6b 65 79 20 69 73 0a 20 20 2a 2a 20  ond key is.  ** 
10a90 74 72 65 61 74 65 64 20 61 73 20 6c 61 72 67 65  treated as large
10aa0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
10ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
10ac0 4b 65 79 49 6e 66 6f 2d 3e 69 6e 63 72 4b 65 79  KeyInfo->incrKey
10ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d   ){.      rc = -
10ae0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
10af0 20 21 70 4b 65 79 49 6e 66 6f 2d 3e 70 72 65 66   !pKeyInfo->pref
10b00 69 78 49 73 45 71 75 61 6c 20 29 7b 0a 20 20 20  ixIsEqual ){.   
10b10 20 20 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 20     if( d1<nKey1 
10b20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10b30 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
10b40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65  .  }else if( pKe
10b50 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
10b60 72 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d  r && i<pKeyInfo-
10b70 3e 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20  >nField.        
10b80 20 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e         && pKeyIn
10b90 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
10ba0 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72  ] ){.    rc = -r
10bb0 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  c;.  }..  return
10bc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10bd0 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  e argument is an
10be0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d   index entry com
10bf0 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20  posed using the 
10c00 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
10c10 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73  code..** The las
10c20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  t entry in this 
10c30 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
10c40 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65   an integer (spe
10c50 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20  cifically.** an 
10c60 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20  integer rowid). 
10c70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
10c80 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
10c90 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20   of bytes in.** 
10ca0 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  that integer..*/
10cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10cc0 49 64 78 52 6f 77 69 64 4c 65 6e 28 63 6f 6e 73  IdxRowidLen(cons
10cd0 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
10ce0 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
10cf0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10d00 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
10d10 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
10d20 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
10d30 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20  the rowid */..  
10d40 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
10d50 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
10d60 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
10d70 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d  t32(&aKey[szHdr-
10d80 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
10d90 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
10da0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
10db0 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a  n(typeRowid);.}.
10dc0 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70    ../*.** pCur p
10dd0 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65  oints at an inde
10de0 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20  x entry created 
10df0 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b  using the OP_Mak
10e00 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a  eRecord opcode..
10e10 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69  ** Read the rowi
10e20 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c  d (the last fiel
10e30 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29  d in the record)
10e40 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e   and store it in
10e50 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75   *rowid..** Retu
10e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
10e70 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73  everything works
10e80 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  , or an error co
10e90 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
10ea0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
10eb0 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f  IdxRowid(BtCurso
10ec0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
10ed0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
10ee0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
10ef0 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
10f00 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10f10 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
10f20 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
10f30 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
10f40 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
10f50 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
10f60 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
10f70 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
10f80 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73    Mem m, v;..  s
10f90 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
10fa0 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b  ze(pCur, &nCellK
10fb0 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c  ey);.  if( nCell
10fc0 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  Key<=0 ){.    re
10fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
10fe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
10ff0 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
11000 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61  .db = 0;.  m.zMa
11010 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d  lloc = 0;.  rc =
11020 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
11030 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
11040 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  , nCellKey, 1, &
11050 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
11060 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11070 20 7d 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61   }.  (void)getVa
11080 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
11090 20 73 7a 48 64 72 29 3b 0a 20 20 28 76 6f 69 64   szHdr);.  (void
110a0 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
110b0 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c  *)&m.z[szHdr-1],
110c0 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 6c   typeRowid);.  l
110d0 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
110e0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
110f0 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  en(typeRowid);. 
11100 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
11110 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
11120 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
11130 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
11140 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
11150 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
11160 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
11170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
11190 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
111a0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
111b0 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
111c0 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74  point to against
111d0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69  .** the key stri
111e0 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c  ng in pKey (of l
111f0 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72  ength nKey).  Wr
11200 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
11210 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
11220 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
11230 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
11240 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
11250 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
11260 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
11270 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51  pKey.  Return SQ
11280 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
11290 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69  ss..**.** pKey i
112a0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
112b0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
112c0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
112d0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
112e0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
112f0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
11300 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
11310 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
11320 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
11330 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e  d as well..*/.in
11340 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
11350 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75  KeyCompare(.  Cu
11360 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
11370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
11380 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
11390 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
113a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
113b0 70 55 6e 70 61 63 6b 65 64 2c 0a 20 20 69 6e 74  pUnpacked,.  int
113c0 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20   nKey, const u8 
113d0 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
113e0 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  key to compare *
113f0 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d  /* Write the com
11420 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68  parison result h
11430 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20  ere */.){.  i64 
11440 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20  nCellKey = 0;.  
11450 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73  int rc;.  BtCurs
11460 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70  or *pCur = pC->p
11470 43 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65  Cursor;.  int le
11480 6e 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b  nRowid;.  Mem m;
11490 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
114a0 64 20 2a 70 52 65 63 3b 0a 20 20 63 68 61 72 20  d *pRec;.  char 
114b0 7a 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a 20 20  zSpace[200];..  
114c0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
114d0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
114e0 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  Key);.  if( nCel
114f0 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a  lKey<=0 ){.    *
11500 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
11510 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11520 20 7d 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20   }.  m.db = 0;. 
11530 20 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20   m.flags = 0;.  
11540 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  m.zMalloc = 0;. 
11550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
11560 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
11570 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 6e 43  ->pCursor, 0, nC
11580 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
11590 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
115a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
115b0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
115c0 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 4c  te3VdbeIdxRowidL
115d0 65 6e 28 28 75 38 2a 29 6d 2e 7a 29 3b 0a 20 20  en((u8*)m.z);.  
115e0 69 66 28 20 21 70 55 6e 70 61 63 6b 65 64 20 29  if( !pUnpacked )
115f0 7b 0a 20 20 20 20 70 52 65 63 20 3d 20 73 71 6c  {.    pRec = sql
11600 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
11610 70 61 63 6b 28 70 43 2d 3e 70 4b 65 79 49 6e 66  pack(pC->pKeyInf
11620 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20  o, nKey, pKey,. 
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
11650 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 7a 53  Space, sizeof(zS
11660 70 61 63 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pace));.  }else{
11670 0a 20 20 20 20 70 52 65 63 20 3d 20 70 55 6e 70  .    pRec = pUnp
11680 61 63 6b 65 64 3b 0a 20 20 7d 0a 20 20 69 66 28  acked;.  }.  if(
11690 20 70 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   pRec==0 ){.    
116a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
116b0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20  MEM;.  }.  *res 
116c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
116d0 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2d 6c  ordCompare(m.n-l
116e0 65 6e 52 6f 77 69 64 2c 20 6d 2e 7a 2c 20 70 52  enRowid, m.z, pR
116f0 65 63 29 3b 0a 20 20 69 66 28 20 21 70 55 6e 70  ec);.  if( !pUnp
11700 61 63 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  acked ){.    sql
11710 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
11720 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 52 65  packedRecord(pRe
11730 63 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  c);.  }.  sqlite
11740 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
11750 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
11760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11770 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
11780 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
11790 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
117a0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
117b0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
117c0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
117d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
117e0 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
117f0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
11800 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
11810 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
11820 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11830 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
11840 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
11850 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
11860 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
11870 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
11880 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
11890 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
118a0 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
118b0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
118c0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
118d0 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
118e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
118f0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
11900 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
11910 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
11920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
11930 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
11940 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
11950 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
11960 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
11970 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
11980 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
11990 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
119a0 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
119b0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
119c0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
119d0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
119e0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
119f0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
11a00 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
11a10 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
11a20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
11a30 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
11a40 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
11a50 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
11a60 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
11a70 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
11a80 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
11a90 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
11aa0 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
11ab0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
11ac0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
11ad0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
11ae0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
11af0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
11b00 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
11b10 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
11b20 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
11b30 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
11b40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
11b50 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
11b60 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
11b70 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
11b80 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
11b90 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
11ba0 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.