/ Hex Artifact Content
Login

Artifact 5b7be22daa71fbe13cd2536a1b5447b3073b4b39:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74  ld.)  Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c  o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77   all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f  as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20  ce file..** But 
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65  that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f  tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74  s were split out
02a0: 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 64 62  ..**.** $Id: vdb
02b0: 65 61 75 78 2e 63 2c 76 20 31 2e 34 34 30 20 32  eaux.c,v 1.440 2
02c0: 30 30 39 2f 30 33 2f 30 35 20 30 33 3a 34 38 3a  009/03/05 03:48:
02d0: 30 37 20 73 68 61 6e 65 20 45 78 70 20 24 0a 2a  07 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 22 76 64 62 65 49 6e 74 2e 68 22 0a 0a 0a  e "vdbeInt.h"...
0310: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 65 62 75  ./*.** When debu
0320: 67 67 69 6e 67 20 74 68 65 20 63 6f 64 65 20 67  gging the code g
0330: 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 20 73 79  enerator in a sy
0340: 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 65 72 2c  mbolic debugger,
0350: 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 65 74 20   one can.** set 
0360: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 41  the sqlite3VdbeA
0370: 64 64 6f 70 54 72 61 63 65 20 74 6f 20 31 20 61  ddopTrace to 1 a
0380: 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 77  nd all opcodes w
0390: 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 64 0a 2a  ill be printed.*
03a0: 2a 20 61 73 20 74 68 65 79 20 61 72 65 20 61 64  * as they are ad
03b0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 73 74 72  ded to the instr
03c0: 75 63 74 69 6f 6e 20 73 74 72 65 61 6d 2e 0a 2a  uction stream..*
03d0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
03e0: 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
03f0: 33 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  3VdbeAddopTrace 
0400: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  = 0;.#endif.../*
0410: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
0420: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
0430: 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a 56 64 62  e engine..*/.Vdb
0440: 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 43 72  e *sqlite3VdbeCr
0450: 65 61 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  eate(sqlite3 *db
0460: 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
0470: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
0480: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
0490: 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 69 66  of(Vdbe) );.  if
04a0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
04b0: 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  0;.  p->db = db;
04c0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
04d0: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   ){.    db->pVdb
04e0: 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  e->pPrev = p;.  
04f0: 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64  }.  p->pNext = d
0500: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70  b->pVdbe;.  p->p
0510: 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Prev = 0;.  db->
0520: 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  pVdbe = p;.  p->
0530: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
0540: 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
0550: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
0560: 6d 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73  member the SQL s
0570: 74 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70  tring for a prep
0580: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
0590: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
05a0: 64 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a  dbeSetSql(Vdbe *
05b0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
05c0: 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50  , int n, int isP
05d0: 72 65 70 61 72 65 56 32 29 7b 0a 20 20 69 66 28  repareV2){.  if(
05e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
05f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
0600: 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20 21  IT_TRACE.  if( !
0610: 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72 65  isPrepareV2 ) re
0620: 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61  turn;.#endif.  a
0630: 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d  ssert( p->zSql==
0640: 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d  0 );.  p->zSql =
0650: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
0660: 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a  p(p->db, z, n);.
0670: 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56 32    p->isPrepareV2
0680: 20 3d 20 69 73 50 72 65 70 61 72 65 56 32 20 3f   = isPrepareV2 ?
0690: 20 31 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   1 : 0;.}../*.**
06a0: 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c 20   Return the SQL 
06b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
06c0: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
06d0: 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ment.*/.const ch
06e0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28  ar *sqlite3_sql(
06f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
0700: 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 20  tmt){.  Vdbe *p 
0710: 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b  = (Vdbe *)pStmt;
0720: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 69 73  .  return (p->is
0730: 50 72 65 70 61 72 65 56 32 20 3f 20 70 2d 3e 7a  PrepareV2 ? p->z
0740: 53 71 6c 20 3a 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Sql : 0);.}../*.
0750: 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74  ** Swap all cont
0760: 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20  ent between two 
0770: 56 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e  VDBE structures.
0780: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0790: 56 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70  VdbeSwap(Vdbe *p
07a0: 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20  A, Vdbe *pB){.  
07b0: 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b  Vdbe tmp, *pTmp;
07c0: 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20  .  char *zTmp;. 
07d0: 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70   tmp = *pA;.  *p
07e0: 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d  A = *pB;.  *pB =
07f0: 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70   tmp;.  pTmp = p
0800: 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e  A->pNext;.  pA->
0810: 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78  pNext = pB->pNex
0820: 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d  t;.  pB->pNext =
0830: 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20   pTmp;.  pTmp = 
0840: 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d  pA->pPrev;.  pA-
0850: 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72  >pPrev = pB->pPr
0860: 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20  ev;.  pB->pPrev 
0870: 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d  = pTmp;.  zTmp =
0880: 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d   pA->zSql;.  pA-
0890: 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c  >zSql = pB->zSql
08a0: 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a  ;.  pB->zSql = z
08b0: 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65  Tmp;.  pB->isPre
08c0: 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50  pareV2 = pA->isP
08d0: 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66  repareV2;.}..#if
08e0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
08f0: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63  ./*.** Turn trac
0900: 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f  ing on or off.*/
0910: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
0920: 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20  eTrace(Vdbe *p, 
0930: 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20  FILE *trace){.  
0940: 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65  p->trace = trace
0950: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
0960: 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62  * Resize the Vdb
0970: 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74  e.aOp array so t
0980: 68 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61  hat it is at lea
0990: 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72  st one op larger
09a0: 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73   than .** it was
09b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75  ..**.** If an ou
09c0: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f  t-of-memory erro
09d0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
09e0: 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61  esizing the arra
09f0: 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  y, return.** SQL
0a00: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68  ITE_NOMEM. In th
0a10: 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70  is case Vdbe.aOp
0a20: 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c   and Vdbe.nOpAll
0a30: 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e  oc remain .** un
0a40: 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73  changed (this is
0a50: 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63   so that any opc
0a60: 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c  odes already all
0a70: 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a  ocated can be .*
0a80: 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c  * correctly deal
0a90: 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
0aa0: 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  th the rest of t
0ab0: 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61  he Vdbe)..*/.sta
0ac0: 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72  tic int growOpAr
0ad0: 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ray(Vdbe *p){.  
0ae0: 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20  VdbeOp *pNew;.  
0af0: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
0b00: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
0b10: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
0b20: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
0b30: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0b40: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0b50: 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, p->aOp, nNew
0b60: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0b70: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0b80: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71  p->nOpAlloc = sq
0b90: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0ba0: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73  e(p->db, pNew)/s
0bb0: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70  izeof(Op);.    p
0bc0: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
0bd0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77  }.  return (pNew
0be0: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
0bf0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a  QLITE_NOMEM);.}.
0c00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
0c10: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
0c20: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74  the list of inst
0c30: 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74  ructions current
0c40: 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e   in the.** VDBE.
0c50: 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64    Return the add
0c60: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20  ress of the new 
0c70: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a  instruction..**.
0c80: 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a  ** Parameters:.*
0c90: 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20  *.**    p       
0ca0: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20          Pointer 
0cb0: 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a  to the VDBE.**.*
0cc0: 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20  *    op         
0cd0: 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20       The opcode 
0ce0: 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63  for this instruc
0cf0: 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31  tion.**.**    p1
0d00: 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70  , p2, p3      Op
0d10: 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65  erands.**.** Use
0d20: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
0d30: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66  ResolveLabel() f
0d40: 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61  unction to fix a
0d50: 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a  n address and.**
0d60: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
0d70: 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74  ChangeP4() funct
0d80: 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68  ion to change th
0d90: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
0da0: 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f  4.** operand..*/
0db0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
0dc0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
0dd0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
0de0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
0df0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0e00: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
0e10: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
0e20: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
0e30: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
0e40: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26   assert( op>0 &&
0e50: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66   op<0xff );.  if
0e60: 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69  ( p->nOpAlloc<=i
0e70: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77   ){.    if( grow
0e80: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20  OpArray(p) ){.  
0e90: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0ea0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70    }.  }.  p->nOp
0eb0: 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  ++;.  pOp = &p->
0ec0: 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f  aOp[i];.  pOp->o
0ed0: 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a  pcode = (u8)op;.
0ee0: 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20    pOp->p5 = 0;. 
0ef0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20   pOp->p1 = p1;. 
0f00: 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20   pOp->p2 = p2;. 
0f10: 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20   pOp->p3 = p3;. 
0f20: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
0f30: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
0f40: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 2d  P4_NOTUSED;.  p-
0f50: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 23 69  >expired = 0;.#i
0f60: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
0f70: 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  G.  pOp->zCommen
0f80: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  t = 0;.  if( sql
0f90: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61  ite3VdbeAddopTra
0fa0: 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  ce ) sqlite3Vdbe
0fb0: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
0fc0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e 64 69  ->aOp[i]);.#endi
0fd0: 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  f.#ifdef VDBE_PR
0fe0: 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63  OFILE.  pOp->cyc
0ff0: 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e  les = 0;.  pOp->
1000: 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  cnt = 0;.#endif.
1010: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e    return i;.}.in
1020: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1030: 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op0(Vdbe *p, int
1040: 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   op){.  return s
1050: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1060: 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29  (p, op, 0, 0, 0)
1070: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1080: 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a  dbeAddOp1(Vdbe *
1090: 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70  p, int op, int p
10a0: 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  1){.  return sql
10b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
10c0: 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b  , op, p1, 0, 0);
10d0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
10e0: 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70  beAddOp2(Vdbe *p
10f0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1100: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74  , int p2){.  ret
1110: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1120: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1130: 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a   p2, 0);.}.../*.
1140: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1150: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1160: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1170: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1180: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1190: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
11b0: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
11c0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
11d0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
11e0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
11f0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
1200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1210: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1220: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1240: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1250: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1260: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1270: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1280: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1290: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
12a0: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
12b0: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
12c0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
12d0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
12e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
12f0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
1300: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1310: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1320: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1330: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1340: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1350: 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61   new symbolic la
1360: 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72  bel for an instr
1370: 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  uction that has 
1380: 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64  yet to be.** cod
1390: 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69  ed.  The symboli
13a0: 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c  c label is reall
13b0: 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76  y just a negativ
13c0: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a  e number.  The.*
13d0: 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75  * label can be u
13e0: 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61  sed as the P2 va
13f0: 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  lue of an operat
1400: 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65  ion.  Later, whe
1410: 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  n.** the label i
1420: 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  s resolved to a 
1430: 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73  specific address
1440: 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20  , the VDBE will 
1450: 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20  scan.** through 
1460: 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69  its operation li
1470: 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c  st and change al
1480: 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77  l values of P2 w
1490: 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68  hich match.** th
14a0: 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65  e label into the
14b0: 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73   resolved addres
14c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  s..**.** The VDB
14d0: 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50  E knows that a P
14e0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
14f0: 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c  el because label
1500: 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20  s are.** always 
1510: 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20  negative and P2 
1520: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
1530: 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67  se to be non-neg
1540: 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  ative..** Hence,
1550: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
1560: 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20  alue is a label 
1570: 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20  that has yet to 
1580: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  be resolved..**.
1590: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
15a0: 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ned if a malloc(
15b0: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  ) fails..*/.int 
15c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
15d0: 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  abel(Vdbe *p){. 
15e0: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d   int i;.  i = p-
15f0: 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73  >nLabel++;.  ass
1600: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
1610: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
1620: 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c  ;.  if( i>=p->nL
1630: 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  abelAlloc ){.   
1640: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 62   int n = p->nLab
1650: 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a 20  elAlloc*2 + 5;. 
1660: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73     p->aLabel = s
1670: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
1680: 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  rFree(p->db, p->
1690: 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  aLabel,.        
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
16c0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
16d0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e 6e  l[0]));.    p->n
16e0: 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 6c  LabelAlloc = sql
16f0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
1700: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65  (p->db, p->aLabe
1710: 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61  l)/sizeof(p->aLa
1720: 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69  bel[0]);.  }.  i
1730: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
1740: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d      p->aLabel[i]
1750: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74   = -1;.  }.  ret
1760: 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a  urn -1-i;.}../*.
1770: 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c  ** Resolve label
1780: 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61   "x" to be the a
1790: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
17a0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
17b0: 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64  o.** be inserted
17c0: 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  .  The parameter
17d0: 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62   "x" must have b
17e0: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
17f0: 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c  m.** a prior cal
1800: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
1810: 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a  MakeLabel()..*/.
1820: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1830: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62  ResolveLabel(Vdb
1840: 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20  e *p, int x){.  
1850: 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20  int j = -1-x;.  
1860: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
1870: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
1880: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
1890: 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 62  >=0 && j<p->nLab
18a0: 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  el );.  if( p->a
18b0: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
18c0: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e 6e  aLabel[j] = p->n
18d0: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Op;.  }.}../*.**
18e0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
18f0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
1900: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
1910: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
1920: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
1930: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
1940: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
1950: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
1960: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
1970: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
1980: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
1990: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
19a0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
19b0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19c0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
19d0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
19e0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
19f0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
1a00: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
1a10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
1a20: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
1a30: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
1a40: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
1a50: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
1a60: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
1a70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
1a80: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
1a90: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
1aa0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
1ab0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
1ac0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
1ad0: 6c 73 6f 20 64 6f 65 73 20 74 68 65 20 66 6f 6c  lso does the fol
1ae0: 6c 6f 77 69 6e 67 20 6f 70 74 69 6d 69 7a 61 74  lowing optimizat
1af0: 69 6f 6e 3a 20 20 49 74 20 73 63 61 6e 73 20 66  ion:  It scans f
1b00: 6f 72 0a 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  or.** instructio
1b10: 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 63 61  ns that might ca
1b20: 75 73 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  use a statement 
1b30: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 75 63 68 20  rollback.  Such 
1b40: 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 2a 2a 20  instructions.** 
1b50: 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  are:.**.**   *  
1b60: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
1b70: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1b80: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
1b90: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65  t..**   *  OP_De
1ba0: 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50  stroy.**   *  OP
1bb0: 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20  _VUpdate.**   * 
1bc0: 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 0a 2a   OP_VRename.**.*
1bd0: 2a 20 49 66 20 6e 6f 20 73 75 63 68 20 69 6e 73  * If no such ins
1be0: 74 72 75 63 74 69 6f 6e 20 69 73 20 66 6f 75 6e  truction is foun
1bf0: 64 2c 20 74 68 65 6e 20 65 76 65 72 79 20 53 74  d, then every St
1c00: 61 74 65 6d 65 6e 74 20 69 6e 73 74 72 75 63 74  atement instruct
1c10: 69 6f 6e 20 0a 2a 2a 20 69 73 20 63 68 61 6e 67  ion .** is chang
1c20: 65 64 20 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 49  ed to a Noop.  I
1c30: 6e 20 74 68 69 73 20 77 61 79 2c 20 77 65 20 61  n this way, we a
1c40: 76 6f 69 64 20 63 72 65 61 74 69 6e 67 20 74 68  void creating th
1c50: 65 20 73 74 61 74 65 6d 65 6e 74 20 0a 2a 2a 20  e statement .** 
1c60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 6e  journal file unn
1c70: 65 63 65 73 73 61 72 69 6c 79 2e 0a 2a 2f 0a 73  ecessarily..*/.s
1c80: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
1c90: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
1ca0: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
1cb0: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
1cc0: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
1cd0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  = 0;.  Op *pOp;.
1ce0: 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20    int *aLabel = 
1cf0: 70 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 69 6e 74  p->aLabel;.  int
1d00: 20 64 6f 65 73 53 74 61 74 65 6d 65 6e 74 52 6f   doesStatementRo
1d10: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  llback = 0;.  in
1d20: 74 20 68 61 73 53 74 61 74 65 6d 65 6e 74 42 65  t hasStatementBe
1d30: 67 69 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 72 65  gin = 0;.  p->re
1d40: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
1d50: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
1d60: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d   = 0;.  for(pOp=
1d70: 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70  p->aOp, i=p->nOp
1d80: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  -1; i>=0; i--, p
1d90: 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70  Op++){.    u8 op
1da0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
1db0: 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 63  de;..    if( opc
1dc0: 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e  ode==OP_Function
1dd0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 41   || opcode==OP_A
1de0: 67 67 53 74 65 70 20 29 7b 0a 20 20 20 20 20 20  ggStep ){.      
1df0: 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78  if( pOp->p5>nMax
1e00: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
1e10: 3d 20 70 4f 70 2d 3e 70 35 3b 0a 23 69 66 6e 64  = pOp->p5;.#ifnd
1e20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1e30: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1e40: 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 65  }else if( opcode
1e50: 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 29 7b 0a  ==OP_VUpdate ){.
1e60: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
1e70: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
1e80: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
1e90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1ea0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
1eb0: 5f 48 61 6c 74 20 29 7b 0a 20 20 20 20 20 20 69  _Halt ){.      i
1ec0: 66 28 20 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49  f( pOp->p1==SQLI
1ed0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
1ee0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
1ef0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  rt ){.        do
1f00: 65 73 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62  esStatementRollb
1f10: 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
1f20: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1f30: 70 63 6f 64 65 3d 3d 4f 50 5f 53 74 61 74 65 6d  pcode==OP_Statem
1f40: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 68 61 73  ent ){.      has
1f50: 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20 3d  StatementBegin =
1f60: 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 75 73 65   1;.      p->use
1f70: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 31  sStmtJournal = 1
1f80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1f90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72  opcode==OP_Destr
1fa0: 6f 79 20 29 7b 0a 20 20 20 20 20 20 64 6f 65 73  oy ){.      does
1fb0: 53 74 61 74 65 6d 65 6e 74 52 6f 6c 6c 62 61 63  StatementRollbac
1fc0: 6b 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  k = 1;.    }else
1fd0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
1fe0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 26 26 20 70  Transaction && p
1ff0: 4f 70 2d 3e 70 32 21 3d 30 20 29 7b 0a 20 20 20  Op->p2!=0 ){.   
2000: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d     p->readOnly =
2010: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2020: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2030: 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69  ABLE.    }else i
2040: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  f( opcode==OP_VU
2050: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
2060: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 29 7b 0a 20  =OP_VRename ){. 
2070: 20 20 20 20 20 64 6f 65 73 53 74 61 74 65 6d 65       doesStateme
2080: 6e 74 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ntRollback = 1;.
2090: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
20a0: 63 6f 64 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72  code==OP_VFilter
20b0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b   ){.      int n;
20c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20d0: 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29  ->nOp - i >= 3 )
20e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20f0: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  pOp[-1].opcode==
2100: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20  OP_Integer );.  
2110: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
2120: 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e  p1;.      if( n>
2130: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
2140: 72 67 73 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a  rgs = n;.#endif.
2150: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73      }..    if( s
2160: 71 6c 69 74 65 33 56 64 62 65 4f 70 63 6f 64 65  qlite3VdbeOpcode
2170: 48 61 73 50 72 6f 70 65 72 74 79 28 6f 70 63 6f  HasProperty(opco
2180: 64 65 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20  de, OPFLG_JUMP) 
2190: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
21a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
21b0: 2d 70 4f 70 2d 3e 70 32 3c 70 2d 3e 6e 4c 61 62  -pOp->p2<p->nLab
21c0: 65 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d  el );.      pOp-
21d0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d  >p2 = aLabel[-1-
21e0: 70 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a  pOp->p2];.    }.
21f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
2200: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c  ree(p->db, p->aL
2210: 61 62 65 6c 29 3b 0a 20 20 70 2d 3e 61 4c 61 62  abel);.  p->aLab
2220: 65 6c 20 3d 20 30 3b 0a 0a 20 20 2a 70 4d 61 78  el = 0;..  *pMax
2230: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
2240: 72 67 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  rgs;..  /* If we
2250: 20 6e 65 76 65 72 20 72 6f 6c 6c 62 61 63 6b 20   never rollback 
2260: 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
2270: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 73 74  saction, then st
2280: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
2290: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
22a0: 74 20 6e 65 65 64 65 64 2e 20 20 53 6f 20 63 68  t needed.  So ch
22b0: 61 6e 67 65 20 65 76 65 72 79 20 4f 50 5f 53 74  ange every OP_St
22c0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6f 70 63  atement.  ** opc
22d0: 6f 64 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e  ode into an OP_N
22e0: 6f 6f 70 2e 20 20 54 68 69 73 20 61 76 6f 69 64  oop.  This avoid
22f0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
2300: 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
2310: 65 28 29 0a 20 20 2a 2a 20 77 68 69 63 68 20 63  e().  ** which c
2320: 61 6e 20 62 65 20 65 78 70 65 6e 73 69 76 65 20  an be expensive 
2330: 6f 6e 20 73 6f 6d 65 20 70 6c 61 74 66 6f 72 6d  on some platform
2340: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61  s..  */.  if( ha
2350: 73 53 74 61 74 65 6d 65 6e 74 42 65 67 69 6e 20  sStatementBegin 
2360: 26 26 20 21 64 6f 65 73 53 74 61 74 65 6d 65 6e  && !doesStatemen
2370: 74 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tRollback ){.   
2380: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
2390: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  nal = 0;.    for
23a0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
23b0: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
23c0: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
23d0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
23e0: 65 3d 3d 4f 50 5f 53 74 61 74 65 6d 65 6e 74 20  e==OP_Statement 
23f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  ){.        pOp->
2400: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
2410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2420: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
2430: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
2440: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
2450: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  ruction to be in
2460: 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
2470: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2480: 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a  tAddr(Vdbe *p){.
2490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
24a0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
24b0: 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  NIT );.  return 
24c0: 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  p->nOp;.}../*.**
24d0: 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73   Add a whole lis
24e0: 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20  t of operations 
24f0: 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2500: 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20   stack.  Return 
2510: 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f  the.** address o
2520: 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  f the first oper
2530: 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a  ation added..*/.
2540: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
2550: 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70  ddOpList(Vdbe *p
2560: 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f  , int nOp, VdbeO
2570: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70  pList const *aOp
2580: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  ){.  int addr;. 
2590: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
25a0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
25b0: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  IT );.  if( p->n
25c0: 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f  Op + nOp > p->nO
25d0: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
25e0: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20  Array(p) ){.    
25f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2600: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  addr = p->nOp;. 
2610: 20 69 66 28 20 6e 4f 70 3e 30 20 29 7b 0a 20 20   if( nOp>0 ){.  
2620: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64 62    int i;.    Vdb
2630: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 70  eOpList const *p
2640: 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66 6f  In = aOp;.    fo
2650: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
2660: 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20 20  +, pIn++){.     
2670: 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e 70   int p2 = pIn->p
2680: 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20  2;.      VdbeOp 
2690: 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b  *pOut = &p->aOp[
26a0: 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20 70  i+addr];.      p
26b0: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70 49  Out->opcode = pI
26c0: 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 20  n->opcode;.     
26d0: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e 2d   pOut->p1 = pIn-
26e0: 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70  >p1;.      if( p
26f0: 32 3c 30 20 26 26 20 73 71 6c 69 74 65 33 56 64  2<0 && sqlite3Vd
2700: 62 65 4f 70 63 6f 64 65 48 61 73 50 72 6f 70 65  beOpcodeHasPrope
2710: 72 74 79 28 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty(pOut->opcode
2720: 2c 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 20 29 7b  , OPFLG_JUMP) ){
2730: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  .        pOut->p
2740: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28  2 = addr + ADDR(
2750: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  p2);.      }else
2760: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  {.        pOut->
2770: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d  p2 = p2;.      }
2780: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20  .      pOut->p3 
2790: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20  = pIn->p3;.     
27a0: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20   pOut->p4type = 
27b0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20  P4_NOTUSED;.    
27c0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30    pOut->p4.p = 0
27d0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35  ;.      pOut->p5
27e0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
27f0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20  ITE_DEBUG.      
2800: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
2810: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
2820: 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72  lite3VdbeAddopTr
2830: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ace ){.        s
2840: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
2850: 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d  p(0, i+addr, &p-
2860: 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20  >aOp[i+addr]);. 
2870: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2880: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b    }.    p->nOp +
2890: 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74  = nOp;.  }.  ret
28a0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
28b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
28c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 6f 70  lue of the P1 op
28d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
28e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
28f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
2900: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
2910: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
2920: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
2930: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
2940: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
2950: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
2960: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
2970: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
2980: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
2990: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
29a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
29b0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP1(Vdbe *p, int
29c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
29d0: 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
29e0: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
29f0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2a00: 20 20 69 66 28 20 70 20 26 26 20 61 64 64 72 3e    if( p && addr>
2a10: 3d 30 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64  =0 && p->nOp>add
2a20: 72 20 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20  r && p->aOp ){. 
2a30: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
2a40: 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p1 = val;.  }.}.
2a50: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2a60: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
2a70: 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  2 operand for a 
2a80: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
2a90: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
2aa0: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
2ab0: 66 6f 72 20 73 65 74 74 69 6e 67 20 61 20 6a 75  for setting a ju
2ac0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a  mp destination..
2ad0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2ae0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65  dbeChangeP2(Vdbe
2af0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69   *p, int addr, i
2b00: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
2b10: 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61  t( p==0 || p->ma
2b20: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
2b30: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20  INIT );.  if( p 
2b40: 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d  && addr>=0 && p-
2b50: 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e  >nOp>addr && p->
2b60: 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  aOp ){.    p->aO
2b70: 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c  p[addr].p2 = val
2b80: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
2b90: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
2ba0: 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 6e  of the P3 operan
2bb0: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
2bc0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
2bd0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2be0: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a  eChangeP3(Vdbe *
2bf0: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74  p, int addr, int
2c00: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28   val){.  assert(
2c10: 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67 69   p==0 || p->magi
2c20: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
2c30: 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  IT );.  if( p &&
2c40: 20 61 64 64 72 3e 3d 30 20 26 26 20 70 2d 3e 6e   addr>=0 && p->n
2c50: 4f 70 3e 61 64 64 72 20 26 26 20 70 2d 3e 61 4f  Op>addr && p->aO
2c60: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  p ){.    p->aOp[
2c70: 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a  addr].p3 = val;.
2c80: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
2c90: 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
2ca0: 20 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20   the P5 operand 
2cb0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
2cc0: 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f  ently.** added o
2cd0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  peration..*/.voi
2ce0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
2cf0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
2d00: 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74  8 val){.  assert
2d10: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6d 61 67  ( p==0 || p->mag
2d20: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
2d30: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 20 26  NIT );.  if( p &
2d40: 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20  & p->aOp ){.    
2d50: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
2d60: 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70   );.    p->aOp[p
2d70: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61  ->nOp-1].p5 = va
2d80: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
2d90: 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70  Change the P2 op
2da0: 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63  erand of instruc
2db0: 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61  tion addr so tha
2dc0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  t it points to.*
2dd0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
2de0: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2df0: 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65  ction to be code
2e00: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2e10: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56  e3VdbeJumpHere(V
2e20: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
2e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
2e40: 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72  ChangeP2(p, addr
2e50: 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f  , p->nOp);.}.../
2e60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75  *.** If the inpu
2e70: 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  t FuncDef struct
2e80: 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ure is ephemeral
2e90: 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20  , then free it. 
2ea0: 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44   If.** the FuncD
2eb0: 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d  ef is not epherm
2ec0: 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68  al, then do noth
2ed0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2ee0: 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61  oid freeEphemera
2ef0: 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65  lFunction(sqlite
2f00: 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a  3 *db, FuncDef *
2f10: 70 44 65 66 29 7b 0a 20 20 69 66 28 20 70 44 65  pDef){.  if( pDe
2f20: 66 20 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67  f && (pDef->flag
2f30: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
2f40: 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20  EPHEM)!=0 ){.   
2f50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2f60: 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a  b, pDef);.  }.}.
2f70: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
2f80: 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65  P4 value if nece
2f90: 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssary..*/.static
2fa0: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c   void freeP4(sql
2fb0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34  ite3 *db, int p4
2fc0: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b  type, void *p4){
2fd0: 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20  .  if( p4 ){.   
2fe0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
2ff0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
3000: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73  _REAL:.      cas
3010: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20  e P4_INT64:.    
3020: 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54    case P4_MPRINT
3030: 46 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  F:.      case P4
3040: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
3050: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
3060: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
3070: 4e 54 41 52 52 41 59 3a 0a 20 20 20 20 20 20 63  NTARRAY:.      c
3080: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48  ase P4_KEYINFO_H
3090: 41 4e 44 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20  ANDOFF: {.      
30a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
30b0: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
30c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
30d0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 44        case P4_VD
30e0: 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20  BEFUNC: {.      
30f0: 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62    VdbeFunc *pVdb
3100: 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 6e  eFunc = (VdbeFun
3110: 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  c *)p4;.        
3120: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e  freeEphemeralFun
3130: 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 46  ction(db, pVdbeF
3140: 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20  unc->pFunc);.   
3150: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
3160: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 56  DeleteAuxData(pV
3170: 64 62 65 46 75 6e 63 2c 20 30 29 3b 0a 20 20 20  dbeFunc, 0);.   
3180: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3190: 65 65 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63  ee(db, pVdbeFunc
31a0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
31b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31c0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
31d0: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
31e0: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
31f0: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
3200: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
3210: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3220: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
3230: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
3240: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
3250: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
3260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
3280: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
3290: 4e 20 6f 70 63 6f 64 65 73 20 73 74 61 72 74 69  N opcodes starti
32a0: 6e 67 20 61 74 20 61 64 64 72 20 74 6f 20 4e 6f  ng at addr to No
32b0: 2d 6f 70 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  -ops..*/.void sq
32c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
32d0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
32e0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 4e 29 7b  nt addr, int N){
32f0: 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 61  .  if( p && p->a
3300: 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70  Op ){.    VdbeOp
3310: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
3320: 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74  addr];.    sqlit
3330: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
3340: 20 20 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20 29      while( N-- )
3350: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
3360: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
3370: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20  pOp->p4.p);.    
3380: 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c    memset(pOp, 0,
3390: 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29   sizeof(pOp[0]))
33a0: 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63  ;.      pOp->opc
33b0: 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20  ode = OP_Noop;. 
33c0: 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 20 20 20       pOp++;.    
33d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
33e0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
33f0: 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  of the P4 operan
3400: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
3410: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
3420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3430: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c   useful when a l
3440: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20  arge program is 
3450: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a  loaded from a.**
3460: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73   static array us
3470: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41  ing sqlite3VdbeA
3480: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20  ddOpList but we 
3490: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a  want to make a.*
34a0: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e  * few minor chan
34b0: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72  ges to the progr
34c0: 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d  am..**.** If n>=
34d0: 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f 70  0 then the P4 op
34e0: 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69 63  erand is dynamic
34f0: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 61  , meaning that a
3500: 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20   copy of.** the 
3510: 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20 69  string is made i
3520: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
3530: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3540: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20  _malloc()..** A 
3550: 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65  value of n==0 me
3560: 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20 6f  ans copy bytes o
3570: 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64 20  f zP4 up to and 
3580: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a  including the.**
3590: 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74 65   first null byte
35a0: 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20 63  .  If n>0 then c
35b0: 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f 66  opy n+1 bytes of
35c0: 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e   zP4..**.** If n
35d0: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 69 74 20  ==P4_KEYINFO it 
35e0: 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 34 20 69  means that zP4 i
35f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
3600: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
3610: 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 20 69 73  re..** A copy is
3620: 20 6d 61 64 65 20 6f 66 20 74 68 65 20 4b 65 79   made of the Key
3630: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
3640: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
3650: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
3660: 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 6f 20 62  te3_malloc, to b
3670: 65 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65  e freed when the
3680: 20 56 64 62 65 20 69 73 20 66 69 6e 61 6c 69 7a   Vdbe is finaliz
3690: 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f 4b 45 59  ed..** n==P4_KEY
36a0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 69 6e 64  INFO_HANDOFF ind
36b0: 69 63 61 74 65 73 20 74 68 61 74 20 7a 50 34 20  icates that zP4 
36c0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b 65 79 49  points to a KeyI
36d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  nfo structure.**
36e0: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
36f0: 79 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  y that the calle
3700: 72 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 66  r has obtained f
3710: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
3720: 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 61 6c 6c  oc. The .** call
3730: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 66 72  er should not fr
3740: 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  ee the allocatio
3750: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  n, it will be fr
3760: 65 65 64 20 77 68 65 6e 20 74 68 65 20 56 64 62  eed when the Vdb
3770: 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65  e is.** finalize
3780: 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  d..** .** Other 
3790: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
37a0: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
37b0: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
37c0: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
37d0: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
37e0: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
37f0: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
3800: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
3810: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
3820: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
3830: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
3840: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
3850: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
3860: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
3870: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
3880: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
3890: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
38a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
38b0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64  3VdbeChangeP4(Vd
38c0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c  be *p, int addr,
38d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34   const char *zP4
38e0: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a  , int n){.  Op *
38f0: 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pOp;.  sqlite3 *
3900: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21  db;.  assert( p!
3910: 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  =0 );.  db = p->
3920: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
3930: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
3940: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
3950: 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62   p->aOp==0 || db
3960: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
3970: 7b 0a 20 20 20 20 69 66 20 28 6e 20 21 3d 20 50  {.    if (n != P
3980: 34 5f 4b 45 59 49 4e 46 4f 29 20 7b 0a 20 20 20  4_KEYINFO) {.   
3990: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c     freeP4(db, n,
39a0: 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a   (void*)*(char**
39b0: 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20  )&zP4);.    }.  
39c0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
39d0: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
39e0: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
39f0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
3a00: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
3a10: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 20 72    if( addr<0 ) r
3a20: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 4f 70  eturn;.  }.  pOp
3a30: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
3a40: 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c 20 70  ;.  freeP4(db, p
3a50: 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d  Op->p4type, pOp-
3a60: 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70  >p4.p);.  pOp->p
3a70: 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e  4.p = 0;.  if( n
3a80: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
3a90: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
3aa0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
3ab0: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
3ac0: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
3ad0: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
3ae0: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
3af0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
3b00: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
3b10: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
3b20: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
3b30: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
3b40: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
3b50: 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20  if( zP4==0 ){.  
3b60: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
3b70: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3b80: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20   = P4_NOTUSED;. 
3b90: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
3ba0: 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20  _KEYINFO ){.    
3bb0: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
3bc0: 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c  o;.    int nFiel
3bd0: 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  d, nByte;..    n
3be0: 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66  Field = ((KeyInf
3bf0: 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b  o*)zP4)->nField;
3c00: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  .    nByte = siz
3c10: 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b  eof(*pKeyInfo) +
3c20: 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65   (nField-1)*size
3c30: 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  of(pKeyInfo->aCo
3c40: 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b  ll[0]) + nField;
3c50: 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  .    pKeyInfo = 
3c60: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
3c70: 42 79 74 65 20 29 3b 0a 20 20 20 20 70 4f 70 2d  Byte );.    pOp-
3c80: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  >p4.pKeyInfo = p
3c90: 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 69 66 28  KeyInfo;.    if(
3ca0: 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20   pKeyInfo ){.   
3cb0: 20 20 20 75 38 20 2a 61 53 6f 72 74 4f 72 64 65     u8 *aSortOrde
3cc0: 72 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  r;.      memcpy(
3cd0: 70 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e  pKeyInfo, zP4, n
3ce0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 53 6f  Byte);.      aSo
3cf0: 72 74 4f 72 64 65 72 20 3d 20 70 4b 65 79 49 6e  rtOrder = pKeyIn
3d00: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 3b 0a  fo->aSortOrder;.
3d10: 20 20 20 20 20 20 69 66 28 20 61 53 6f 72 74 4f        if( aSortO
3d20: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
3d30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3d40: 72 64 65 72 20 3d 20 28 75 6e 73 69 67 6e 65 64  rder = (unsigned
3d50: 20 63 68 61 72 2a 29 26 70 4b 65 79 49 6e 66 6f   char*)&pKeyInfo
3d60: 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 6c 64 5d 3b  ->aColl[nField];
3d70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
3d80: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
3d90: 72 64 65 72 2c 20 61 53 6f 72 74 4f 72 64 65 72  rder, aSortOrder
3da0: 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  , nField);.     
3db0: 20 7d 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34   }.      pOp->p4
3dc0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
3dd0: 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  O;.    }else{.  
3de0: 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f      p->db->mallo
3df0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
3e00: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
3e10: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
3e20: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e   }.  }else if( n
3e30: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  ==P4_KEYINFO_HAN
3e40: 44 4f 46 46 20 29 7b 0a 20 20 20 20 70 4f 70 2d  DOFF ){.    pOp-
3e50: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
3e60: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
3e70: 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f  ype = P4_KEYINFO
3e80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
3e90: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
3ea0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
3eb0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
3ec0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
3ed0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
3ee0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
3ef0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
3f00: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
3f10: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
3f20: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
3f30: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
3f40: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
3f50: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  IC;.  }.}..#ifnd
3f60: 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
3f70: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
3f80: 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 20 6d 6f  nt on the the mo
3f90: 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 65  st recently code
3fa0: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20  d instruction.  
3fb0: 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 4e  Or.** insert a N
3fc0: 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 65  o-op and add the
3fd0: 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 74   comment to that
3fe0: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
3ff0: 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 73  .  This.** makes
4000: 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 72   the code easier
4010: 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 20   to read during 
4020: 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e 65  debugging.  None
4030: 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   of this happens
4040: 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 74  .** in a product
4050: 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 76 6f  ion build..*/.vo
4060: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
4070: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
4080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
4090: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
40a0: 69 73 74 20 61 70 3b 0a 20 20 61 73 73 65 72 74  ist ap;.  assert
40b0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
40c0: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
40d0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
40e0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
40f0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
4100: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
4110: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
4120: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 63 68 61  ->nOp ){.    cha
4130: 72 20 2a 2a 70 7a 20 3d 20 26 70 2d 3e 61 4f 70  r **pz = &p->aOp
4140: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d  [p->nOp-1].zComm
4150: 65 6e 74 3b 0a 20 20 20 20 76 61 5f 73 74 61 72  ent;.    va_star
4160: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
4170: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4180: 65 28 70 2d 3e 64 62 2c 20 2a 70 7a 29 3b 0a 20  e(p->db, *pz);. 
4190: 20 20 20 2a 70 7a 20 3d 20 73 71 6c 69 74 65 33     *pz = sqlite3
41a0: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
41b0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
41c0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
41d0: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
41e0: 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
41f0: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
4200: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
4210: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
4220: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4230: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
4240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
4250: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
4260: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4270: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
4280: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
4290: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
42a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
42b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
42c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70   ){.    char **p
42d0: 7a 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  z = &p->aOp[p->n
42e0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a  Op-1].zComment;.
42f0: 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c      va_start(ap,
4300: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73   zFormat);.    s
4310: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
4320: 64 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70  db, *pz);.    *p
4330: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
4340: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
4350: 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f  at, ap);.    va_
4360: 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23  end(ap);.  }.}.#
4370: 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 55 47  endif  /* NDEBUG
4380: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
4390: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
43a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
43b0: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
43c0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
43d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
43e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  {.  assert( p->m
43f0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
4400: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
4410: 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61  t( (addr>=0 && a
4420: 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70  ddr<p->nOp) || p
4430: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
4440: 65 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  ed );.  return (
4450: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
4460: 3c 70 2d 3e 6e 4f 70 29 3f 28 26 70 2d 3e 61 4f  <p->nOp)?(&p->aO
4470: 70 5b 61 64 64 72 5d 29 3a 30 29 3b 0a 7d 0a 0a  p[addr]):0);.}..
4480: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4490: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
44a0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44  ) || !defined(ND
44b0: 45 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20  EBUG) \.     || 
44c0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
44d0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
44e0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
44f0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
4500: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
4510: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
4520: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
4530: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
4540: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
4550: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
4560: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
4570: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
4580: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
4590: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
45a0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
45b0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
45c0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
45d0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
45e0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
45f0: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  case P4_KEYINFO_
4600: 53 54 41 54 49 43 3a 0a 20 20 20 20 63 61 73 65  STATIC:.    case
4610: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
4620: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
4630: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
4640: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34  eyInfo = pOp->p4
4650: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20  .pKeyInfo;.     
4660: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4670: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4680: 22 6b 65 79 69 6e 66 6f 28 25 64 22 2c 20 70 4b  "keyinfo(%d", pK
4690: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
46a0: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
46b0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
46c0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
46d0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
46e0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
46f0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
4700: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
4710: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
4720: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
4730: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
4740: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4750: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
4760: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e           if( i+n
4770: 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  >nTemp-6 ){.    
4780: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
4790: 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c  zTemp[i],",...",
47a0: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
47b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
47c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65   }.          zTe
47d0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
47e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65           if( pKe
47f0: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
4800: 72 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  r && pKeyInfo->a
4810: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a  SortOrder[j] ){.
4820: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
4830: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20  p[i++] = '-';.  
4840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4850: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
4860: 70 5b 69 5d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p[i], pColl->zNa
4870: 6d 65 2c 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  me,n+1);.       
4880: 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20     i += n;.     
4890: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b 34     }else if( i+4
48a0: 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20  <nTemp-6 ){.    
48b0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
48c0: 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 2c 34 29  emp[i],",nil",4)
48d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d  ;.          i +=
48e0: 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
48f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
4900: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
4910: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
4920: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4930: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
4940: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4950: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
4960: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
4970: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
4980: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
4990: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
49a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
49b0: 22 63 6f 6c 6c 73 65 71 28 25 2e 32 30 73 29 22  "collseq(%.20s)"
49c0: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
49d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
49e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
49f0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
4a00: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
4a10: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
4a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4a30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4a40: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
4a50: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
4a60: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
4a70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4a80: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
4a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4aa0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
4ab0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  Temp, "%lld", *p
4ac0: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
4ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ae0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
4af0: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
4b00: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
4b10: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
4b20: 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20   pOp->p4.i);.   
4b30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4b40: 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c      case P4_REAL
4b50: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4b60: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
4b70: 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22  , zTemp, "%.16g"
4b80: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c  , *pOp->p4.pReal
4b90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4ba0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
4bb0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d  4_MEM: {.      M
4bc0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e  em *pMem = pOp->
4bd0: 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 61  p4.pMem;.      a
4be0: 73 73 65 72 74 28 20 28 70 4d 65 6d 2d 3e 66 6c  ssert( (pMem->fl
4bf0: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 3d  ags & MEM_Null)=
4c00: 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
4c10: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4c20: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
4c30: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
4c40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
4c50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
4c60: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
4c70: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4c80: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
4c90: 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e  "%lld", pMem->u.
4ca0: 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  i);.      }else 
4cb0: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
4cc0: 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
4cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4ce0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4cf0: 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  emp, "%.16g", pM
4d00: 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20 7d 0a  em->r);.      }.
4d10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4d20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4d30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4d40: 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BLE.    case P4_
4d50: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
4d60: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
4d70: 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61  b = pOp->p4.pVta
4d80: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
4d90: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
4da0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
4db0: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74  :%p", pVtab, pVt
4dc0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20  ab->pModule);.  
4dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
4df0: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
4e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4e10: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
4e20: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
4e30: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4e40: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
4e50: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
4e60: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
4e70: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
4e80: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
4e90: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
4ea0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
4eb0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
4ec0: 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a  sert( zP4!=0 );.
4ed0: 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a    return zP4;.}.
4ee0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
4ef0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
4f00: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
4f10: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
4f20: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
4f30: 2a 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  *.*/.void sqlite
4f40: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
4f50: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
4f60: 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 61 73    int mask;.  as
4f70: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
4f80: 70 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  p->db->nDb );.  
4f90: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
4fa0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
4fb0: 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61 73 6b 20  sk)*8 );.  mask 
4fc0: 3d 20 31 3c 3c 69 3b 0a 20 20 69 66 28 20 28 70  = 1<<i;.  if( (p
4fd0: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 26 20 6d 61  ->btreeMask & ma
4fe0: 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  sk)==0 ){.    p-
4ff0: 3e 62 74 72 65 65 4d 61 73 6b 20 7c 3d 20 6d 61  >btreeMask |= ma
5000: 73 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  sk;.    sqlite3B
5010: 74 72 65 65 4d 75 74 65 78 41 72 72 61 79 49 6e  treeMutexArrayIn
5020: 73 65 72 74 28 26 70 2d 3e 61 4d 75 74 65 78 2c  sert(&p->aMutex,
5030: 20 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70   p->db->aDb[i].p
5040: 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66  Bt);.  }.}...#if
5050: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
5060: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
5070: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
5080: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
5090: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
50a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
50b0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
50c0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
50d0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
50e0: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
50f0: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
5100: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
5110: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
5120: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
5130: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
5140: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
5150: 20 25 34 64 20 25 2d 34 73 20 25 2e 32 58 20 25   %4d %-4s %.2X %
5160: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74  s\n";.  if( pOut
5170: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64  ==0 ) pOut = std
5180: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73  out;.  zP4 = dis
5190: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72  playP4(pOp, zPtr
51a0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b  , sizeof(zPtr));
51b0: 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c  .  fprintf(pOut,
51c0: 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a   zFormat1, pc, .
51d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63        sqlite3Opc
51e0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
51f0: 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70  ode), pOp->p1, p
5200: 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c  Op->p2, pOp->p3,
5210: 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23   zP4, pOp->p5,.#
5220: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5230: 55 47 0a 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43  UG.      pOp->zC
5240: 6f 6d 6d 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43  omment ? pOp->zC
5250: 6f 6d 6d 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73  omment : "".#els
5260: 65 0a 20 20 20 20 20 20 22 22 0a 23 65 6e 64 69  e.      "".#endi
5270: 66 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28  f.  );.  fflush(
5280: 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  pOut);.}.#endif.
5290: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
52a0: 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d  n array of N Mem
52b0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61   elements.*/.sta
52c0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
52d0: 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c  MemArray(Mem *p,
52e0: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70   int N){.  if( p
52f0: 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d   && N ){.    Mem
5300: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69   *pEnd;.    sqli
5310: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
5320: 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66  .    u8 malloc_f
5330: 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c  ailed = db->mall
5340: 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 66 6f  ocFailed;.    fo
5350: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c  r(pEnd=&p[N]; p<
5360: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20  pEnd; p++){.    
5370: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
5380: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
5390: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a  db==p[1].db );..
53a0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
53b0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
53c0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
53d0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
53e0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
53f0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
5400: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
5410: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
5420: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
5430: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
5440: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
5450: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
5460: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
5470: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
5480: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
5490: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
54a0: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
54b0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
54c0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
54d0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
54e0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
54f0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
5500: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
5510: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
5520: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
5530: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
5540: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
5550: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
5560: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
5570: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
5580: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
5590: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
55a0: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
55b0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
55c0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
55d0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
55e0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
55f0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
5600: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
5610: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
5620: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
5630: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
5640: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
5650: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
5660: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
5670: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5680: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f  ( p->flags&(MEM_
5690: 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 7b 0a  Agg|MEM_Dyn) ){.
56a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
56b0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29  dbeMemRelease(p)
56c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
56d0: 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a  ( p->zMalloc ){.
56e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
56f0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
5700: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70  lloc);.        p
5710: 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  ->zMalloc = 0;. 
5720: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
5730: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
5740: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  l;.    }.    db-
5750: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5760: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20  malloc_failed;. 
5770: 20 7d 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c   }.}..#ifdef SQL
5780: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
5790: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74  Y_MANAGEMENT.int
57a0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 6c 65   sqlite3VdbeRele
57b0: 61 73 65 42 75 66 66 65 72 73 28 56 64 62 65 20  aseBuffers(Vdbe 
57c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  *p){.  int ii;. 
57d0: 20 69 6e 74 20 6e 46 72 65 65 20 3d 20 30 3b 0a   int nFree = 0;.
57e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
57f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
5800: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
5810: 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 3d 70 2d  for(ii=1; ii<=p-
5820: 3e 6e 4d 65 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20  >nMem; ii++){.  
5830: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
5840: 2d 3e 61 4d 65 6d 5b 69 69 5d 3b 0a 20 20 20 20  ->aMem[ii];.    
5850: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
5860: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b 0a  & MEM_RowSet ){.
5870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 77        sqlite3Row
5880: 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d 3e 75  SetClear(pMem->u
5890: 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20 20 7d  .pRowSet);.    }
58a0: 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a  .    if( pMem->z
58b0: 20 26 26 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 26   && pMem->flags&
58c0: 4d 45 4d 5f 44 79 6e 20 29 7b 0a 20 20 20 20 20  MEM_Dyn ){.     
58d0: 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 2d 3e   assert( !pMem->
58e0: 78 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 6e 46  xDel );.      nF
58f0: 72 65 65 20 2b 3d 20 73 71 6c 69 74 65 33 44 62  ree += sqlite3Db
5900: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 4d 65 6d 2d  MallocSize(pMem-
5910: 3e 64 62 2c 20 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  >db, pMem->z);. 
5920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5930: 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29  MemRelease(pMem)
5940: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5950: 74 75 72 6e 20 6e 46 72 65 65 3b 0a 7d 0a 23 65  turn nFree;.}.#e
5960: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
5970: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
5980: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
5990: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
59a0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
59b0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
59c0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
59d0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
59e0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
59f0: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
5a00: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
5a10: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
5a20: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
5a30: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
5a40: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
5a50: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
5a60: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
5a70: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
5a80: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
5a90: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
5aa0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
5ab0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
5ac0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
5ad0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
5ae0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
5af0: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
5b00: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
5b10: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
5b20: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
5b30: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
5b40: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
5b50: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2f 0a 69 6e  UERY PLAN..*/.in
5b60: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
5b70: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5b90: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
5ba0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5bb0: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b   p->db;.  int i;
5bc0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
5bd0: 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 20 2a 70 4d  TE_OK;.  Mem *pM
5be0: 65 6d 20 3d 20 70 2d 3e 70 52 65 73 75 6c 74 53  em = p->pResultS
5bf0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  et = &p->aMem[1]
5c00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
5c10: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  explain );.  if(
5c20: 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f   p->magic!=VDBE_
5c30: 4d 41 47 49 43 5f 52 55 4e 20 29 20 72 65 74 75  MAGIC_RUN ) retu
5c40: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
5c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
5c60: 6d 61 67 69 63 3d 3d 53 51 4c 49 54 45 5f 4d 41  magic==SQLITE_MA
5c70: 47 49 43 5f 42 55 53 59 20 29 3b 0a 20 20 61 73  GIC_BUSY );.  as
5c80: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
5c90: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
5ca0: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
5cb0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  p->rc==SQLITE_NO
5cc0: 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65  MEM );..  /* Eve
5cd0: 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70  n though this op
5ce0: 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73  code does not us
5cf0: 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67  e dynamic string
5d00: 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72  s for.  ** the r
5d10: 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f  esult, result co
5d20: 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65  lumns may become
5d30: 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20   dynamic if the 
5d40: 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20  user calls.  ** 
5d50: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
5d60: 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67  ext16(), causing
5d70: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74   a translation t
5d80: 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e  o UTF-16 encodin
5d90: 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73  g..  */.  releas
5da0: 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20  eMemArray(pMem, 
5db0: 70 2d 3e 6e 4d 65 6d 29 3b 0a 0a 20 20 69 66 28  p->nMem);..  if(
5dc0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
5dd0: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  OMEM ){.    /* T
5de0: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
5df0: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
5e00: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
5e10: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
5e20: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
5e30: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
5e40: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
5e50: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
5e60: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  led = 1;.    ret
5e70: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
5e80: 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  ;.  }..  do{.   
5e90: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
5ea0: 7d 77 68 69 6c 65 28 20 69 3c 70 2d 3e 6e 4f 70  }while( i<p->nOp
5eb0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
5ec0: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
5ed0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
5ee0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d  n );.  if( i>=p-
5ef0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e 72  >nOp ){.    p->r
5f00: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5f10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
5f20: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
5f30: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
5f40: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
5f50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
5f60: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
5f70: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5f80: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
5f90: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
5fa0: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
5fb0: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
5fc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
5fd0: 61 72 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70  ar *z;.    Op *p
5fe0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
5ff0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
6000: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
6010: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
6020: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
6030: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
6040: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
6050: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
6060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6080: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
6090: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
60a0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
60b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
60c0: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
60d0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
60e0: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
60f0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
6100: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a  Op->opcode);  /*
6110: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
6120: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
6130: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
6140: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
6150: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
6160: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
6170: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6180: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
6190: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
61a0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
61b0: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
61c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
61d0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
61e0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
6210: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49  Mem->type = SQLI
6220: 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  TE_INTEGER;.    
6230: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
6240: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
6250: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
6260: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
6290: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20     pMem->type = 
62a0: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a  SQLITE_INTEGER;.
62b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
62c0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
62d0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
62e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
62f0: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
6300: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20  .i = pOp->p3;   
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
6330: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65        pMem->type
6340: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45   = SQLITE_INTEGE
6350: 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  R;.      pMem++;
6360: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
6370: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
6380: 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20  ow(pMem, 32, 0) 
6390: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){            /*
63a0: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e   P4 */.      p->
63b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
63c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
63d0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
63e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
63f0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
6400: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
6410: 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c  m;.    z = displ
6420: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
6430: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
6440: 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  z!=pMem->z ){.  
6450: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
6460: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
6470: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
6480: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
6490: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
64a0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
64b0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
64c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
64d0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
64e0: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
64f0: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
6500: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6510: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
6520: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
6530: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
6540: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6550: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
6560: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
6570: 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c       p->db->mall
6580: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
6590: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
65a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
65b0: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
65c0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d  lags = MEM_Dyn|M
65d0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
65e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
65f0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
6600: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
6610: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
6620: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
6630: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
6640: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45  type = SQLITE_TE
6650: 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  XT;.      pMem->
6660: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6670: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
6680: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
6690: 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 69 66  E_DEBUG.      if
66a0: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
66b0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  ){.        pMem-
66c0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
66d0: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
66e0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 4f 70     pMem->z = pOp
66f0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20  ->zComment;.    
6700: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
6710: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
6720: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20  em->z);.        
6730: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6740: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20  TE_UTF8;.       
6750: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6760: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
6770: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6780: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 4d      {.        pM
6790: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
67a0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
67c0: 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  omment */.      
67d0: 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53    pMem->type = S
67e0: 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 20 20  QLITE_NULL;.    
67f0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
6800: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
6810: 20 2d 20 35 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 5*(p->explain
6820: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  -1);.    p->rc =
6830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6840: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
6850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6860: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
6870: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
6880: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
6890: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
68a0: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
68b0: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
68c0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
68d0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
68e0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
68f0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
6900: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
6910: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
6920: 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72  .  if( nOp<1 ) r
6930: 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26  eturn;.  pOp = &
6940: 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28  p->aOp[0];.  if(
6950: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
6960: 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70  _Trace && pOp->p
6970: 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  4.z!=0 ){.    co
6980: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 4f  nst char *z = pO
6990: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 68 69  p->p4.z;.    whi
69a0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
69b0: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
69c0: 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b    printf("SQL: [
69d0: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a  %s]\n", z);.  }.
69e0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
69f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6a00: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
6a10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6a20: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
6a30: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
6a40: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
6a50: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
6a60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6a70: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
6a80: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
6a90: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
6aa0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
6ab0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
6ac0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6ad0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
6ae0: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
6af0: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
6b00: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61  ->opcode==OP_Tra
6b10: 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  ce && pOp->p4.z!
6b20: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
6b30: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
6b40: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
6b50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6b60: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
6b70: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
6b80: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
6b90: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
6ba0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
6bb0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
6bc0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
6bd0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
6be0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
6bf0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
6c00: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
6c10: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
6c20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6c30: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
6c40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c50: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
6c60: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
6c70: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
6c80: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
6c90: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
6ca0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
6cb0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
6cc0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
6cd0: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
6ce0: 64 20 73 69 7a 65 20 62 75 66 66 65 72 2e 20 20  d size buffer.  
6cf0: 4d 61 6b 65 20 2a 70 70 20 70 6f 69 6e 74 20 74  Make *pp point t
6d00: 6f 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  o the.** allocat
6d10: 65 64 20 73 70 61 63 65 2e 20 20 28 4e 6f 74 65  ed space.  (Note
6d20: 3a 20 20 70 70 20 69 73 20 61 20 63 68 61 72 2a  :  pp is a char*
6d30: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 76   rather than a v
6d40: 6f 69 64 2a 2a 20 74 6f 0a 2a 2a 20 77 6f 72 6b  oid** to.** work
6d50: 20 61 72 6f 75 6e 64 20 74 68 65 20 70 6f 69 6e   around the poin
6d60: 74 65 72 20 61 6c 69 61 73 69 6e 67 20 72 75 6c  ter aliasing rul
6d70: 65 73 20 6f 66 20 43 2e 29 20 20 2a 70 70 20 73  es of C.)  *pp s
6d80: 68 6f 75 6c 64 20 69 6e 69 74 69 61 6c 6c 79 0a  hould initially.
6d90: 2a 2a 20 62 65 20 7a 65 72 6f 2e 20 20 49 66 20  ** be zero.  If 
6da0: 2a 70 70 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c  *pp is not zero,
6db0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
6dc0: 20 74 68 65 20 73 70 61 63 65 20 68 61 73 20 61   the space has a
6dd0: 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61  lready.** been a
6de0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 69  llocated and thi
6df0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
6e00: 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  oop..**.** nByte
6e10: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6e20: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
6e30: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a   needed..**.** *
6e40: 70 70 46 72 6f 6d 20 70 6f 69 6e 74 20 74 6f 20  ppFrom point to 
6e50: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20  available space 
6e60: 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20  and pEnd points 
6e70: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
6e80: 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73  e.** available s
6e90: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
6ea0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
6eb0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
6ec0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
6ed0: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
6ee0: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
6ef0: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
6f00: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
6f10: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
6f20: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
6f30: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
6f40: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
6f50: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
6f60: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
6f70: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
6f80: 63 53 70 61 63 65 28 0a 20 20 63 68 61 72 20 2a  cSpace(.  char *
6f90: 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  pp,            /
6fa0: 2a 20 49 4e 2f 4f 55 54 3a 20 53 65 74 20 2a 70  * IN/OUT: Set *p
6fb0: 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 6c  p to point to al
6fc0: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 2a  located buffer *
6fd0: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
6fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6ff0: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
7000: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20  llocate */.  u8 
7010: 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20  **ppFrom,       
7020: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c    /* IN/OUT: All
7030: 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72  ocate from *ppFr
7040: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  om */.  u8 *pEnd
7050: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7060: 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74  Pointer to 1 byt
7070: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
7080: 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72  f *ppFrom buffer
7090: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74   */.  int *pnByt
70a0: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e          /* If
70b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e   allocation cann
70c0: 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72  ot be made, incr
70d0: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f  ement *pnByte */
70e0: 0a 29 7b 0a 20 20 69 66 28 20 28 2a 28 76 6f 69  .){.  if( (*(voi
70f0: 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b 0a 20 20  d**)pp)==0 ){.  
7100: 20 20 6e 42 79 74 65 20 3d 20 28 6e 42 79 74 65    nByte = (nByte
7110: 2b 37 29 26 7e 37 3b 0a 20 20 20 20 69 66 28 20  +7)&~7;.    if( 
7120: 28 70 45 6e 64 20 2d 20 2a 70 70 46 72 6f 6d 29  (pEnd - *ppFrom)
7130: 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  >=nByte ){.     
7140: 20 2a 28 76 6f 69 64 2a 2a 29 70 70 20 3d 20 28   *(void**)pp = (
7150: 76 6f 69 64 20 2a 29 2a 70 70 46 72 6f 6d 3b 0a  void *)*ppFrom;.
7160: 20 20 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d        *ppFrom +=
7170: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65 6c 73   nByte;.    }els
7180: 65 7b 0a 20 20 20 20 20 20 2a 70 6e 42 79 74 65  e{.      *pnByte
7190: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d   += nByte;.    }
71a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
71b0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20  epare a virtual 
71c0: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63  machine for exec
71d0: 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76  ution.  This inv
71e0: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
71f0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
7200: 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61  ng stack space a
7210: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
7220: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
7230: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
7240: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
7250: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
7260: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
7270: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
7280: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
7290: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
72a0: 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  This is the only
72b0: 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56   way to move a V
72c0: 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41  DBE from VDBE_MA
72d0: 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56  GIC_INIT to.** V
72e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a  DBE_MAGIC_RUN..*
72f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7300: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
7310: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
7320: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74  on a single virt
7330: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
7340: 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69  The first call i
7350: 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d  s made while com
7360: 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73  piling the SQL s
7370: 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71  tatement. Subseq
7380: 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72  uent.** calls ar
7390: 65 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f  e made as part o
73a0: 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  f the process of
73b0: 20 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61   resetting a sta
73c0: 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20  tement to be.** 
73d0: 72 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f  re-executed (fro
73e0: 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  m a call to sqli
73f0: 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68  te3_reset()). Th
7400: 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43  e nVar, nMem, nC
7410: 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73  ursor .** and is
7420: 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65  Explain paramete
7430: 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73  rs are only pass
7440: 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  ed correct value
7450: 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
7460: 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  .** the function
7470: 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73   is called. On s
7480: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c  ubsequent calls,
7490: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
74a0: 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69  set(), nVar.** i
74b0: 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20  s passed -1 and 
74c0: 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e  nMem, nCursor an
74d0: 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20  d isExplain are 
74e0: 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e  all passed zero.
74f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7500: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20  VdbeMakeReady(. 
7510: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7530: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20  /* The VDBE */. 
7540: 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20   int nVar,      
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27  /* Number of '?'
7570: 20 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20   see in the SQL 
7580: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
7590: 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20  nt nMem,        
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75b0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72   Number of memor
75c0: 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63  y cells to alloc
75d0: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ate */.  int nCu
75e0: 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rsor,           
75f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7600: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20  r of cursors to 
7610: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e  allocate */.  in
7620: 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20 20 20  t isExplain     
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7640: 54 72 75 65 20 69 66 20 74 68 65 20 45 58 50 4c  True if the EXPL
7650: 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69 73 20  AIN keywords is 
7660: 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  present */.){.  
7670: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
7680: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
7690: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
76a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
76b0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
76c0: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
76d0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
76e0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
76f0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
7700: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
7710: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
7720: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
7730: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
7740: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
7750: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
7760: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 20  BE_MAGIC_RUN;.. 
7770: 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72   /* For each cur
7780: 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c  sor required, al
7790: 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65  so allocate a me
77a0: 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72  mory cell. Memor
77b0: 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d  y.  ** cells (nM
77c0: 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e  em+1-nCursor)..n
77d0: 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20  Mem, inclusive, 
77e0: 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
77f0: 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76  ed by.  ** the v
7800: 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73  dbe program. Ins
7810: 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 73  tead they are us
7820: 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
7830: 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64  pace for.  ** Vd
7840: 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f  beCursor/BtCurso
7850: 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68  r structures. Th
7860: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
7870: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7880: 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20   .  ** cursor 0 
7890: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d  is stored in mem
78a0: 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d  ory cell nMem. M
78b0: 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d  emory cell (nMem
78c0: 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20  -1).  ** stores 
78d0: 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  the blob of memo
78e0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
78f0: 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63  th cursor 1, etc
7900: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20  ..  **.  ** See 
7910: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
7920: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
7930: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
7940: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
7950: 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
7960: 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76  registers, SQL v
7970: 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63  ariables, VDBE c
7980: 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a  ursors and .  **
7990: 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72   an array to mar
79a0: 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f  shal SQL functio
79b0: 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 20  n arguments in. 
79c0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e  This is only don
79d0: 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  e the.  ** first
79e0: 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e 63 74   time this funct
79f0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ion is called fo
7a00: 72 20 61 20 67 69 76 65 6e 20 56 44 42 45 2c 20  r a given VDBE, 
7a10: 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73 0a 20  not when it is. 
7a20: 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   ** being called
7a30: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65   from sqlite3_re
7a40: 73 65 74 28 29 20 74 6f 20 72 65 73 65 74 20 74  set() to reset t
7a50: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
7a60: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ne..  */.  if( n
7a70: 56 61 72 3e 3d 30 20 26 26 20 21 64 62 2d 3e 6d  Var>=0 && !db->m
7a80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
7a90: 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75     u8 *zCsr = (u
7aa0: 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  8 *)&p->aOp[p->n
7ab0: 4f 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a 45 6e  Op];.    u8 *zEn
7ac0: 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e 61 4f  d = (u8 *)&p->aO
7ad0: 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 0a  p[p->nOpAlloc];.
7ae0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20      int nByte;. 
7af0: 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20     int nArg;    
7b00: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
7b10: 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70 61 73  mber of args pas
7b20: 73 65 64 20 74 6f 20 61 20 75 73 65 72 20 66 75  sed to a user fu
7b30: 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 72  nction. */.    r
7b40: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
7b50: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20 69 66  , &nArg);.    if
7b60: 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 6e  ( isExplain && n
7b70: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 20  Mem<10 ){.      
7b80: 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 7d  nMem = 10;.    }
7b90: 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ..    do {.     
7ba0: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
7bb0: 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 20   zEnd-zCsr);.   
7bc0: 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20     nByte = 0;.  
7bd0: 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28      allocSpace((
7be0: 63 68 61 72 2a 29 26 70 2d 3e 61 4d 65 6d 2c 20  char*)&p->aMem, 
7bf0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
7c00: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
7c10: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c  nByte);.      al
7c20: 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29  locSpace((char*)
7c30: 26 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73  &p->aVar, nVar*s
7c40: 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73  izeof(Mem), &zCs
7c50: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29  r, zEnd, &nByte)
7c60: 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53 70 61  ;.      allocSpa
7c70: 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e 61 70  ce((char*)&p->ap
7c80: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66  Arg, nArg*sizeof
7c90: 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  (Mem*), &zCsr, z
7ca0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
7cb0: 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28      allocSpace((
7cc0: 63 68 61 72 2a 29 26 70 2d 3e 61 7a 56 61 72 2c  char*)&p->azVar,
7cd0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
7ce0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
7cf0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  , &nByte);.     
7d00: 20 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61   allocSpace((cha
7d10: 72 2a 29 26 70 2d 3e 61 70 43 73 72 2c 20 0a 20  r*)&p->apCsr, . 
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
7d40: 64 62 65 43 75 72 73 6f 72 2a 29 2c 20 26 7a 43  dbeCursor*), &zC
7d50: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
7d60: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
7d70: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
7d80: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
7d90: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7da0: 61 77 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  aw(db, nByte);. 
7db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43 73       }.      zCs
7dc0: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
7dd0: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
7de0: 5b 6e 42 79 74 65 5d 3b 0a 20 20 20 20 7d 77 68  [nByte];.    }wh
7df0: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
7e00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7e10: 29 3b 0a 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73  );..    p->nCurs
7e20: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
7e30: 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b    if( p->aVar ){
7e40: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  .      p->nVar =
7e50: 20 6e 56 61 72 3b 0a 20 20 20 20 20 20 66 6f 72   nVar;.      for
7e60: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
7e70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  +){.        p->a
7e80: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Var[n].flags = M
7e90: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20  EM_Null;.       
7ea0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
7eb0: 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   db;.      }.   
7ec0: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4d   }.    if( p->aM
7ed0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  em ){.      p->a
7ee0: 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20  Mem--;          
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
7f00: 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20  Mem[] goes from 
7f10: 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 20  1..nMem */.     
7f20: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
7f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f40: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
7f50: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
7f60: 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e        for(n=1; n
7f70: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
7f80: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
7f90: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  .flags = MEM_Nul
7fa0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 4d  l;.        p->aM
7fb0: 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20  em[n].db = db;. 
7fc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7fd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7fe0: 45 42 55 47 0a 20 20 66 6f 72 28 6e 3d 31 3b 20  EBUG.  for(n=1; 
7ff0: 6e 3c 70 2d 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b  n<p->nMem; n++){
8000: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
8010: 61 4d 65 6d 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29  aMem[n].db==db )
8020: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
8030: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
8040: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
8050: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
8060: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
8070: 70 2d 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73  p->explain |= is
8080: 45 78 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61  Explain;.  p->ma
8090: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
80a0: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
80b0: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
80c0: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
80d0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
80e0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 6f  at = 255;.  p->o
80f0: 70 65 6e 65 64 53 74 61 74 65 6d 65 6e 74 20 3d  penedStatement =
8100: 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f   0;.#ifdef VDBE_
8110: 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
8120: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
8130: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
8140: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70  +){.      p->aOp
8150: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
8160: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
8170: 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  les = 0;.    }. 
8180: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
8190: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
81a0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
81b0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
81c0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
81d0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
81e0: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
81f0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
8200: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
8210: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
8220: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
8230: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8240: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
8250: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
8260: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
8270: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
8280: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
8290: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
82a0: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
82b0: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
82c0: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
82d0: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
82e0: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
82f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
8300: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
8310: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
8320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8330: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
8340: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
8350: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
8360: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
8370: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
8380: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
8390: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
83a0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
83b0: 6c 65 20 3d 20 70 43 78 2d 3e 70 4d 6f 64 75 6c  le = pCx->pModul
83c0: 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  e;.    p->inVtab
83d0: 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20  Method = 1;.    
83e0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
83f0: 65 74 79 4f 66 66 28 70 2d 3e 64 62 29 3b 0a 20  etyOff(p->db);. 
8400: 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f     pModule->xClo
8410: 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b  se(pVtabCursor);
8420: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
8430: 65 33 53 61 66 65 74 79 4f 6e 28 70 2d 3e 64 62  e3SafetyOn(p->db
8440: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
8450: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
8460: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 43  #endif.  if( !pC
8470: 78 2d 3e 65 70 68 65 6d 50 73 65 75 64 6f 54 61  x->ephemPseudoTa
8480: 62 6c 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ble ){.    sqlit
8490: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
84a0: 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 7d  pCx->pData);.  }
84b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
84c0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
84d0: 70 74 20 66 6f 72 20 56 54 61 62 20 63 75 72 73  pt for VTab curs
84e0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ors that are cur
84f0: 72 65 6e 74 6c 79 0a 2a 2a 20 69 6e 20 75 73 65  rently.** in use
8500: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8510: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
8520: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
8530: 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  s(Vdbe *p){.  in
8540: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
8550: 43 73 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Csr==0 ) return;
8560: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
8570: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
8580: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a      VdbeCursor *
8590: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d  pC = p->apCsr[i]
85a0: 3b 0a 20 20 20 20 69 66 28 20 70 43 20 26 26 20  ;.    if( pC && 
85b0: 28 21 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f  (!p->inVtabMetho
85c0: 64 20 7c 7c 20 21 70 43 2d 3e 70 56 74 61 62 43  d || !pC->pVtabC
85d0: 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
85e0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
85f0: 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20  ursor(p, pC);.  
8600: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
8610: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
8620: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
8630: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
8640: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
8650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
8660: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
8670: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
8680: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
8690: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
86a0: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
86b0: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
86c0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
86d0: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
86e0: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
86f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8700: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
8710: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
8720: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
8730: 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20  ;.  Mem *pMem;. 
8740: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
8750: 45 78 63 65 70 74 41 63 74 69 76 65 56 74 61 62  ExceptActiveVtab
8760: 73 28 70 29 3b 0a 20 20 66 6f 72 28 70 4d 65 6d  s(p);.  for(pMem
8770: 3d 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 69 3d  =&p->aMem[1], i=
8780: 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69  1; i<=p->nMem; i
8790: 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b 0a 20 20 20  ++, pMem++){.   
87a0: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
87b0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 7b   & MEM_RowSet ){
87c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f  .      sqlite3Ro
87d0: 77 53 65 74 43 6c 65 61 72 28 70 4d 65 6d 2d 3e  wSetClear(pMem->
87e0: 75 2e 70 52 6f 77 53 65 74 29 3b 0a 20 20 20 20  u.pRowSet);.    
87f0: 7d 0a 20 20 20 20 4d 65 6d 53 65 74 54 79 70 65  }.    MemSetType
8800: 46 6c 61 67 28 70 4d 65 6d 2c 20 4d 45 4d 5f 4e  Flag(pMem, MEM_N
8810: 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ull);.  }.  rele
8820: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
8830: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
8840: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 63 6f 6e 74  );.  if( p->cont
8850: 65 78 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  extStack ){.    
8860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8870: 2c 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63  , p->contextStac
8880: 6b 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 6f 6e  k);.  }.  p->con
8890: 74 65 78 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20  textStack = 0;. 
88a0: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
88b0: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e  Depth = 0;.  p->
88c0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 54 6f 70 20  contextStackTop 
88d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
88e0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
88f0: 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
8900: 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65  sg = 0;.  p->pRe
8910: 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a  sultSet = 0;.}..
8920: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75  /*.** Set the nu
8930: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
8940: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c  olumns that will
8950: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
8960: 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74  this SQL.** stat
8970: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e  ement. This is n
8980: 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  ow set at compil
8990: 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74  e time, rather t
89a0: 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78  han during.** ex
89b0: 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76  ecution of the v
89c0: 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74  dbe program so t
89d0: 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  hat sqlite3_colu
89e0: 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a  mn_count() can.*
89f0: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61  * be called on a
8a00: 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
8a10: 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73  before sqlite3_s
8a20: 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tep()..*/.void s
8a30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
8a40: 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e  Cols(Vdbe *p, in
8a50: 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20  t nResColumn){. 
8a60: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
8a70: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
8a80: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
8a90: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
8aa0: 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
8ab0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
8ac0: 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69  LNAME_N);.  sqli
8ad0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
8ae0: 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20  >aColName);.  n 
8af0: 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  = nResColumn*COL
8b00: 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65  NAME_N;.  p->nRe
8b10: 73 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f  sColumn = nResCo
8b20: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
8b30: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
8b40: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
8b50: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
8b60: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
8b70: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
8b80: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
8b90: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
8ba0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
8bb0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
8bc0: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
8bd0: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
8be0: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
8bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
8c00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
8c10: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
8c20: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
8c30: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
8c40: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
8c50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
8c60: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
8c70: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
8c80: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
8c90: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
8ca0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
8cb0: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
8cc0: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
8cd0: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
8ce0: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
8cf0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
8d00: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
8d10: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
8d20: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
8d30: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
8d40: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
8d50: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
8d60: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
8d70: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
8d80: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
8d90: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
8da0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
8db0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
8dc0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
8dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8de0: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
8df0: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
8e00: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
8e30: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
8e40: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
8e50: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
8e70: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
8e80: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
8e90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8ea0: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
8eb0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
8ec0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
8ed0: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
8ee0: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f00: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
8f10: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
8f20: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
8f30: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
8f40: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
8f50: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
8f60: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
8f70: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
8f80: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
8f90: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
8fa0: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
8fb0: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
8fc0: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
8fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
8fe0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  MEM;.  }.  asser
8ff0: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d  t( p->aColName!=
9000: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20  0 );.  pColName 
9010: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b  = &(p->aColName[
9020: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43  idx+var*p->nResC
9030: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20  olumn]);.  rc = 
9040: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
9050: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a  tStr(pColName, z
9060: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
9070: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20  _UTF8, xDel);.  
9080: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c  assert( rc!=0 ||
9090: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c   !zName || (pCol
90a0: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  Name->flags&MEM_
90b0: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65  Term)!=0 );.  re
90c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
90d0: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74  * A read or writ
90e0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  e transaction ma
90f0: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
9100: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61  active on databa
9110: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
9120: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
9130: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d  n is active, com
9140: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65  mit it. If there
9150: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74   is a.** write-t
9160: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e  ransaction spann
9170: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ing more than on
9180: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
9190: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
91a0: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74   takes care of t
91b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
91c0: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73  l trickery..*/.s
91d0: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
91e0: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
91f0: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  , Vdbe *p){.  in
9200: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e  t i;.  int nTran
9210: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65  s = 0;  /* Numbe
9220: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77  r of databases w
9230: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72  ith an active wr
9240: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
9250: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
9260: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
9270: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
9280: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
9290: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
92a0: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
92b0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
92c0: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
92d0: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
92e0: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
92f0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
9300: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
9310: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
9320: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
9330: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9340: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
9350: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
9360: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
9370: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
9380: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
9390: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
93a0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
93b0: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
93c0: 63 28 64 62 2c 20 26 70 2d 3e 7a 45 72 72 4d 73  c(db, &p->zErrMs
93d0: 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
93e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
93f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
9400: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
9410: 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
9420: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
9430: 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
9440: 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
9450: 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
9460: 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
9470: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
9480: 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
9490: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
94a0: 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
94b0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
94c0: 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
94d0: 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
94e0: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
94f0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
9500: 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
9510: 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
9520: 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
9530: 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
9540: 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
9550: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
9560: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
9570: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
9580: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
9590: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
95a0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
95b0: 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69        needXcommi
95c0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
95d0: 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b   i!=1 ) nTrans++
95e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
95f0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
9600: 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ny write-transac
9610: 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e  tions at all, in
9620: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20  voke the commit 
9630: 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65  hook */.  if( ne
9640: 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d  edXcommit && db-
9650: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
9660: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9670: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
9680: 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 29 3d  ITE_CommitBusy)=
9690: 3d 30 20 29 3b 0a 20 20 20 20 64 62 2d 3e 66 6c  =0 );.    db->fl
96a0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 43 6f  ags |= SQLITE_Co
96b0: 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20 28 76  mmitBusy;.    (v
96c0: 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74  oid)sqlite3Safet
96d0: 79 4f 66 66 28 64 62 29 3b 0a 20 20 20 20 72 63  yOff(db);.    rc
96e0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
96f0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
9700: 69 74 41 72 67 29 3b 0a 20 20 20 20 28 76 6f 69  itArg);.    (voi
9710: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
9720: 6e 28 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 66  n(db);.    db->f
9730: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
9740: 43 6f 6d 6d 69 74 42 75 73 79 3b 0a 20 20 20 20  CommitBusy;.    
9750: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
9760: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9770: 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a  NSTRAINT;.    }.
9780: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
9790: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
97a0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
97b0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
97c0: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
97d0: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
97e0: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
97f0: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
9800: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
9810: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
9820: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
9830: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
9840: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
9850: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
9860: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
9870: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
9880: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
9890: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
98a0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
98b0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
98c0: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
98d0: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
98e0: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
98f0: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
9900: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
9910: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
9920: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
9930: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
9940: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
9950: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
9960: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
9970: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
9980: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
9990: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
99a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
99b0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
99c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
99d0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
99e0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
99f0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
9a00: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
9a10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9a20: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
9a30: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
9a40: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
9a50: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
9a60: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
9a70: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
9a80: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
9a90: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
9aa0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
9ab0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
9ac0: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
9ad0: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
9ae0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
9af0: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
9b00: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
9b10: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
9b20: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
9b30: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
9b40: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9b50: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
9b60: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
9b70: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
9b80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
9b90: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
9ba0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
9bb0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
9bc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9bd0: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
9be0: 65 54 77 6f 28 70 42 74 29 3b 0a 20 20 20 20 20  eTwo(pBt);.     
9bf0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9c00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9c10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9c20: 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
9c30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
9c40: 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20  he complex case 
9c50: 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c  - There is a mul
9c60: 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72  ti-file write-tr
9c70: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
9c80: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75  ..  ** This requ
9c90: 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  ires a master jo
9ca0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e  urnal file to en
9cb0: 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  sure the transac
9cc0: 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
9cd0: 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e  mitted atomicly.
9ce0: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
9cf0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
9d00: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
9d10: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
9d20: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
9d30: 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
9d40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
9d50: 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
9d60: 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
9d70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
9d80: 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
9d90: 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
9da0: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
9db0: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
9dc0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
9dd0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
9de0: 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
9df0: 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
9e00: 20 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65   res;..    /* Se
9e10: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
9e20: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
9e30: 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
9e40: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20    u32 iRandom;. 
9e50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9e60: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
9e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
9e80: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
9e90: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
9ea0: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73  dom);.      zMas
9eb0: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
9ec0: 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25  intf(db, "%s-mj%
9ed0: 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c  08X", zMainFile,
9ee0: 20 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66   iRandom&0x7ffff
9ef0: 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  fff);.      if( 
9f00: 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  !zMaster ){.    
9f10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9f20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
9f30: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9f40: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
9f50: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
9f60: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
9f70: 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
9f80: 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
9f90: 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
9fa0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9fb0: 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
9fc0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
9fd0: 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
9fe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
9ff0: 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
a000: 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
a010: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
a020: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
a030: 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
a040: 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
a050: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
a060: 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
a070: 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
a080: 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
a090: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
a0a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
a0b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a0c0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
a0d0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
a0e0: 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
a0f0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
a100: 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
a110: 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
a120: 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
a130: 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
a140: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a150: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
a160: 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
a170: 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
a180: 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
a190: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a1a0: 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
a1b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
a1c0: 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
a1d0: 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
a1e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a1f0: 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
a200: 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
a210: 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
a220: 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
a230: 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
a240: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
a250: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a260: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
a270: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
a280: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  Bt;.      if( i=
a290: 3d 31 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  =1 ) continue;  
a2a0: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 54   /* Ignore the T
a2b0: 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  EMP database */.
a2c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a2d0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
a2e0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
a2f0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
a300: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
a310: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
a320: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
a330: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63   zFile[0]==0 ) c
a340: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
a350: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  ore :memory: dat
a360: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
a370: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20    if( !needSync 
a380: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  && !sqlite3Btree
a390: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74  SyncDisabled(pBt
a3a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
a3b0: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
a3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
a3d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
a3e0: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
a3f0: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
a400: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
a410: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
a420: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
a430: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
a440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
a450: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a460: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a470: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
a480: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
a490: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
a4a0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
a4b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
a4c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
a4d0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
a4e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
a4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a500: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
a510: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
a520: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
a530: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
a540: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
a550: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
a560: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
a570: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
a580: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  f( needSync .   
a590: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33    && 0==(sqlite3
a5a0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
a5b0: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29  ristics(pMaster)
a5c0: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45  &SQLITE_IOCAP_SE
a5d0: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26  QUENTIAL).     &
a5e0: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
a5f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
a600: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45  (pMaster, SQLITE
a610: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20  _SYNC_NORMAL)). 
a620: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
a630: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
a640: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73  Master);.      s
a650: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
a660: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
a670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
a680: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
a690: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
a6a0: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
a6b0: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20  /* Sync all the 
a6c0: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65  db files involve
a6d0: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  d in the transac
a6e0: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63  tion. The same c
a6f0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  all.    ** sets 
a700: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a710: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61  al pointer in ea
a720: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ch individual jo
a730: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a  urnal. If.    **
a740: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
a750: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65   here, do not de
a760: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
a770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
a780: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
a790: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  he error occurs 
a7a0: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74  during the first
a7b0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a7c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
a7d0: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68  itPhaseOne(), th
a7e0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68  en there is a ch
a7f0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20  ance that the.  
a800: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72    ** master jour
a810: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  nal file will be
a820: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77   orphaned. But w
a830: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20  e cannot delete 
a840: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61  it,.    ** in ca
a850: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  se the master jo
a860: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
a870: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
a880: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
a890: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20   ** file before 
a8a0: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75  the failure occu
a8b0: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a8c0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
a8d0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
a8e0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
a8f0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
a900: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
a910: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
a920: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
a930: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
a940: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
a950: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
a960: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
a970: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
a980: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
a990: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a9a0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
a9b0: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
a9c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
a9d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
a9e0: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  Delete the maste
a9f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
aa00: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65  This commits the
aa10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66   transaction. Af
aa20: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ter.    ** doing
aa30: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74   this the direct
aa40: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67  ory is synced ag
aa50: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69  ain before any i
aa60: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a  ndividual.    **
aa70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c   transaction fil
aa80: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  es are deleted..
aa90: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
aaa0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
aab0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31  pVfs, zMaster, 1
aac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
aad0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
aae0: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
aaf0: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
ab00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ab10: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
ab20: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
ab30: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
ab40: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
ab50: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
ab60: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
ab70: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
ab80: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
ab90: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
aba0: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
abb0: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
abc0: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
abd0: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
abe0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
abf0: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
ac00: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
ac10: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
ac20: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
ac30: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
ac40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
ac50: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
ac60: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
ac70: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
ac80: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
ac90: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
aca0: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
acb0: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
acc0: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
acd0: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
ace0: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
acf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
ad00: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
ad10: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
ad20: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ad30: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
ad40: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
ad50: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
ad60: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
ad70: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ad80: 50 68 61 73 65 54 77 6f 28 70 42 74 29 3b 0a 20  PhaseTwo(pBt);. 
ad90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ada0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
adb0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
adc0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
add0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
ade0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
adf0: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
ae00: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
ae10: 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
ae20: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
ae30: 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
ae40: 2e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 63  .activeVdbeCnt c
ae50: 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
ae60: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
ae70: 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
ae80: 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
ae90: 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
aea0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
aeb0: 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
aec0: 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
aed0: 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
aee0: 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
aef0: 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
af00: 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
af10: 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
af20: 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
af30: 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
af40: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
af50: 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
af60: 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
af70: 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
af80: 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
af90: 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
afa0: 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
afb0: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
afc0: 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
afd0: 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
afe0: 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
aff0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61  ){.    if( p->ma
b000: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b010: 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  RUN && p->pc>=0 
b020: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
b030: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
b040: 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
b050: 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  e++;.    }.    p
b060: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
b070: 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
b080: 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e  db->activeVdbeCn
b090: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t );.  assert( n
b0a0: 57 72 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65  Write==db->write
b0b0: 56 64 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c  VdbeCnt );.}.#el
b0c0: 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
b0d0: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
b0e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
b0f0: 6f 72 20 65 76 65 72 79 20 42 74 72 65 65 20 74  or every Btree t
b100: 68 61 74 20 69 6e 20 64 61 74 61 62 61 73 65 20  hat in database 
b110: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68  connection db wh
b120: 69 63 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e  ich .** has been
b130: 20 6d 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70   modified, "trip
b140: 22 20 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20  " or invalidate 
b150: 65 61 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a  each cursor in.*
b160: 2a 20 74 68 61 74 20 42 74 72 65 65 20 6d 69 67  * that Btree mig
b170: 68 74 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  ht have been mod
b180: 69 66 69 65 64 20 73 6f 20 74 68 61 74 20 74 68  ified so that th
b190: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
b1a0: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 67  never be used ag
b1b0: 61 69 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65  ain.  This happe
b1c0: 6e 73 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61  ns when a rollba
b1d0: 63 6b 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ck.*** occurs.  
b1e0: 57 65 20 68 61 76 65 20 74 6f 20 74 72 69 70 20  We have to trip 
b1f0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75  all the other cu
b200: 72 73 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63  rsors, even.** c
b210: 75 72 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72  ursor from other
b220: 20 56 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e   VMs in differen
b230: 74 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  t database conne
b240: 63 74 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68  ctions,.** so th
b250: 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20  at none of them 
b260: 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20 64  try to use the d
b270: 61 74 61 20 61 74 20 77 68 69 63 68 20 74 68 65  ata at which the
b280: 79 0a 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69  y.** were pointi
b290: 6e 67 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77  ng and which now
b2a0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63   may have been c
b2b0: 68 61 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f  hanged due.** to
b2c0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
b2d0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
b2e0: 61 74 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61  at a rollback ca
b2f0: 6e 20 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20  n delete tables 
b300: 63 6f 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20  complete and.** 
b310: 72 65 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65  reorder rootpage
b320: 73 2e 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74  s.  So it is not
b330: 20 73 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74   sufficient just
b340: 20 74 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20   to save.** the 
b350: 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
b360: 73 6f 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f  sor.  We have to
b370: 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   invalidate the 
b380: 63 75 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61  cursor.** so tha
b390: 74 20 69 74 20 69 73 20 6e 65 76 65 72 20 75 73  t it is never us
b3a0: 65 64 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61  ed again..*/.sta
b3b0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
b3c0: 61 74 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69  ateCursorsOnModi
b3d0: 66 69 65 64 42 74 72 65 65 73 28 73 71 6c 69 74  fiedBtrees(sqlit
b3e0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
b3f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
b400: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
b410: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
b420: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
b430: 20 69 66 28 20 70 20 26 26 20 73 71 6c 69 74 65   if( p && sqlite
b440: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
b450: 70 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  p) ){.      sqli
b460: 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
b470: 75 72 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45  ursors(p, SQLITE
b480: 5f 41 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20  _ABORT);.    }. 
b490: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b4a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b4b0: 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
b4c0: 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
b4d0: 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
b4e0: 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
b4f0: 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
b500: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
b510: 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
b520: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
b530: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
b540: 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
b550: 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
b560: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
b570: 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
b580: 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
b590: 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
b5a0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
b5b0: 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
b5c0: 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
b5d0: 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
b5e0: 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
b5f0: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
b600: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
b610: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
b620: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
b630: 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
b640: 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
b650: 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
b660: 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
b670: 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
b680: 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
b690: 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
b6a0: 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
b6b0: 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
b6c0: 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
b6d0: 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
b6e0: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
b6f0: 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
b700: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
b710: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
b720: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46  nt i;.  int (*xF
b730: 75 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29  unc)(Btree *pBt)
b740: 20 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69   = 0;  /* Functi
b750: 6f 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61  on to call on ea
b760: 63 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64  ch btree backend
b770: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 70 65 63   */.  int isSpec
b780: 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
b790: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
b7a0: 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 4e 4f  rue if SQLITE_NO
b7b0: 4d 45 4d 20 6f 72 20 49 4f 45 52 52 20 2a 2f 0a  MEM or IOERR */.
b7c0: 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
b7d0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
b7e0: 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
b7f0: 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
b800: 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
b810: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
b820: 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
b830: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
b840: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
b850: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
b860: 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
b870: 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
b880: 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
b890: 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
b8a0: 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
b8b0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
b8c0: 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
b8d0: 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
b8e0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
b8f0: 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
b900: 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
b910: 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
b920: 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
b930: 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
b940: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
b950: 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
b960: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
b970: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
b980: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
b990: 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
b9a0: 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
b9b0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
b9c0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
b9d0: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
b9e0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
b9f0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ba00: 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
ba10: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ba20: 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c  ;.  }.  closeAll
ba30: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
ba40: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 69  iveVtabs(p);.  i
ba50: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
ba60: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
ba70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ba80: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
ba90: 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
baa0: 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
bab0: 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
bac0: 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
bad0: 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
bae0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  ed */.  if( p->p
baf0: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  c>=0 ){.    int 
bb00: 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
bb10: 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
bb20: 6d 20 70 2d 3e 72 63 20 2a 2f 0a 0a 20 20 20 20  m p->rc */..    
bb30: 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
bb40: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
bb50: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
bb60: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
bb70: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
bb80: 61 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  aMutex);..    /*
bb90: 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
bba0: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
bbb0: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
bbc0: 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
bbd0: 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
bbe0: 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
bbf0: 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
bc00: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc20: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
bc30: 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
bc40: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
bc50: 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
bc60: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
bc70: 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
bc80: 61 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65  as read-only, we
bc90: 20 6e 65 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c   need do no roll
bca0: 62 61 63 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68  back at all. Oth
bcb0: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
bcc0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 74 68   proceed with th
bcd0: 65 20 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69  e special handli
bce0: 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
bcf0: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
bd00: 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
bd10: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
bd20: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
bd30: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
bd40: 42 4c 4f 43 4b 45 44 20 26 26 20 70 2d 3e 75 73  BLOCKED && p->us
bd50: 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b  esStmtJournal ){
bd60: 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e 63  .          xFunc
bd70: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52   = sqlite3BtreeR
bd80: 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20 20  ollbackStmt;.   
bd90: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
bda0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
bdb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d      }else if( (m
bdc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
bdd0: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
bde0: 46 55 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20  FULL).          
bdf0: 20 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75           && p->u
be00: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
be10: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 46 75 6e  {.          xFun
be20: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
be30: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 3b 0a 20 20  RollbackStmt;.  
be40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
be50: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65         /* We are
be60: 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20   forced to roll 
be70: 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20  back the active 
be80: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66  transaction. Bef
be90: 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20  ore doing.      
bea0: 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74      ** so, abort
beb0: 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65   any other state
bec0: 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c  ments this handl
bed0: 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20  e currently has 
bee0: 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20  active..        
bef0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
bf00: 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73  nvalidateCursors
bf10: 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73  OnModifiedBtrees
bf20: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
bf30: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
bf40: 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ll(db);.        
bf50: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
bf60: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
bf70: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
bf80: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
bf90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bfa0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
bfb0: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
bfc0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
bfd0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
bfe0: 79 20 61 63 74 69 76 65 20 76 64 62 65 2c 20 74  y active vdbe, t
bff0: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 64 6f  hen.    ** we do
c000: 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
c010: 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
c020: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
c030: 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
c040: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
c050: 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
c060: 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
c070: 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
c080: 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
c090: 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
c0a0: 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
c0b0: 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
c0c0: 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
c0d0: 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
c0e0: 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
c0f0: 77 72 69 74 65 56 64 62 65 43 6e 74 3d 3d 28 70  writeVdbeCnt==(p
c100: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
c110: 20 20 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61       && (db->fla
c120: 67 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d 6d  gs & SQLITE_Comm
c130: 69 74 42 75 73 79 29 3d 3d 30 0a 20 20 20 20 29  itBusy)==0.    )
c140: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
c150: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
c160: 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
c170: 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
c180: 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
c190: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
c1a0: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
c1b0: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
c1c0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61   vdbe program wa
c1d0: 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  s .        ** su
c1e0: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20  ccessful or hit 
c1f0: 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
c200: 73 74 72 61 69 6e 74 2e 20 54 68 69 73 20 6d 65  straint. This me
c210: 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
c220: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
c230: 69 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ired..        */
c240: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
c250: 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
c260: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   p);.        if(
c270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
c280: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
c290: 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41  lite3BtreeMutexA
c2a0: 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d  rrayLeave(&p->aM
c2b0: 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
c2c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
c2d0: 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
c2e0: 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
c2f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c300: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
c310: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
c320: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a  ollbackAll(db);.
c330: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c340: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c350: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
c360: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
c370: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
c380: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c390: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29  3RollbackAll(db)
c3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
c3b0: 6c 73 65 20 69 66 28 20 21 78 46 75 6e 63 20 29  lse if( !xFunc )
c3c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
c3d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
c3e0: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
c3f0: 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
c400: 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 65 64     if( p->opened
c410: 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20  Statement ){.   
c420: 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73         xFunc = s
c430: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
c440: 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 7d  tStmt;.        }
c450: 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66   .      }else if
c460: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
c470: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
c480: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71        xFunc = sq
c490: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
c4a0: 63 6b 53 74 6d 74 3b 0a 20 20 20 20 20 20 7d 65  ckStmt;.      }e
c4b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  lse{.        inv
c4c0: 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e  alidateCursorsOn
c4d0: 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64  ModifiedBtrees(d
c4e0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
c4f0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
c500: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
c510: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
c520: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
c530: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
c540: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
c550: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 78  }.  .    /* If x
c560: 46 75 6e 63 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Func is not NULL
c570: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6f 6e 65  , then it is one
c580: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
c590: 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 0a  RollbackStmt or.
c5a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
c5b0: 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43  reeCommitStmt. C
c5c0: 61 6c 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 20 65  all it once on e
c5d0: 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20  ach backend. If 
c5e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  an error occurs.
c5f0: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72      ** and the r
c600: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 74  eturn code is st
c610: 69 6c 6c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73  ill SQLITE_OK, s
c620: 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f  et the return co
c630: 64 65 20 74 6f 20 74 68 65 20 6e 65 77 0a 20 20  de to the new.  
c640: 20 20 2a 2a 20 65 72 72 6f 72 20 76 61 6c 75 65    ** error value
c650: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
c660: 65 72 74 28 21 78 46 75 6e 63 20 7c 7c 0a 20 20  ert(!xFunc ||.  
c670: 20 20 20 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74      xFunc==sqlit
c680: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
c690: 74 20 7c 7c 0a 20 20 20 20 20 20 78 46 75 6e 63  t ||.      xFunc
c6a0: 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  ==sqlite3BtreeRo
c6b0: 6c 6c 62 61 63 6b 53 74 6d 74 0a 20 20 20 20 29  llbackStmt.    )
c6c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 78  ;.    for(i=0; x
c6d0: 46 75 6e 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44  Func && i<db->nD
c6e0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
c6f0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 42 74  int rc;.      Bt
c700: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
c710: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
c720: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
c730: 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 70      rc = xFunc(p
c740: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
c750: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
c760: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
c770: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
c780: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
c790: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
c7a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c7b0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
c7c0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
c7d0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
c7e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c7f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
c800: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
c810: 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
c820: 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
c830: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 77 61  the statement wa
c840: 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 0a 20 20  s committed, .  
c850: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 68 61    ** set the cha
c860: 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge counter. .  
c870: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c880: 63 68 61 6e 67 65 43 6e 74 4f 6e 20 26 26 20 70  changeCntOn && p
c890: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
c8a0: 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78   if( !xFunc || x
c8b0: 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72  Func==sqlite3Btr
c8c0: 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a  eeCommitStmt ){.
c8d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c8e0: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
c8f0: 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
c900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
c920: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
c930: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c940: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
c950: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
c960: 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d  Rollback or comm
c970: 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68  it any schema ch
c980: 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  anges that occur
c990: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
c9a0: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
c9b0: 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51   && db->flags&SQ
c9c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
c9d0: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
c9e0: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
c9f0: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
ca00: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d       db->flags =
ca10: 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51   (db->flags | SQ
ca20: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
ca30: 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  es);.    }..    
ca40: 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
ca50: 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
ca60: 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72  te3BtreeMutexArr
ca70: 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74  ayLeave(&p->aMut
ca80: 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  ex);.  }..  /* W
ca90: 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
caa0: 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
cab0: 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
cac0: 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
cad0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
cae0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63  =0 ){.    db->ac
caf0: 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20  tiveVdbeCnt--;. 
cb00: 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
cb10: 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  nly ){.      db-
cb20: 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b  >writeVdbeCnt--;
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
cb40: 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62  t( db->activeVdb
cb50: 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56  eCnt>=db->writeV
cb60: 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20  dbeCnt );.  }.  
cb70: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
cb80: 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
cb90: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
cba0: 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
cbb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
cbc0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
cbd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
cbe0: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
cbf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
cc00: 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
cc10: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
cc20: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
cc30: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
cc40: 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
cc50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
cc60: 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
cc70: 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
cc80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cc90: 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
cca0: 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
ccb0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
ccc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
ccd0: 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
cce0: 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
ccf0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
cd00: 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
cd10: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
cd20: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
cd30: 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
cd40: 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
cd50: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
cd60: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
cd70: 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
cd80: 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
cd90: 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
cda0: 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
cdb0: 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
cdc0: 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
cdd0: 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
cde0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
cdf0: 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
ce00: 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
ce10: 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
ce20: 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
ce30: 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
ce40: 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
ce50: 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
ce60: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
ce70: 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
ce80: 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
ce90: 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
cea0: 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
ceb0: 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
cec0: 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
ced0: 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
cee0: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
cef0: 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
cf00: 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
cf10: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69  now..  */.  (voi
cf20: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
cf30: 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  n(db);.  sqlite3
cf40: 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20 28  VdbeHalt(p);.  (
cf50: 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66 65  void)sqlite3Safe
cf60: 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f 2a  tyOff(db);..  /*
cf70: 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
cf80: 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
cf90: 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
cfa0: 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
cfb0: 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
cfc0: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
cfd0: 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
cfe0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
cff0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
d000: 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
d010: 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
d020: 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
d030: 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
d040: 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
d050: 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
d060: 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
d070: 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
d080: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
d090: 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
d0a0: 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
d0b0: 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d      if( p->zErrM
d0c0: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  sg ){.      sqli
d0d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
d0e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73 71  lloc();.      sq
d0f0: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
d100: 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d 3e  (db->pErr,-1,p->
d110: 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f 55  zErrMsg,SQLITE_U
d120: 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  TF8,SQLITE_TRANS
d130: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71 6c  IENT);.      sql
d140: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
d150: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62 2d  loc();.      db-
d160: 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72 63  >errCode = p->rc
d170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
d180: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
d190: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  rMsg);.      p->
d1a0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
d1b0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
d1c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d1d0: 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
d1e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
d1f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
d200: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
d210: 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  K, 0);.    }.  }
d220: 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
d230: 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
d240: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
d250: 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
d260: 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
d270: 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
d280: 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
d290: 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
d2a0: 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
d2b0: 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
d2c0: 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
d2d0: 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
d2e0: 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
d2f0: 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
d300: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
d310: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70  lite3Error(db, p
d320: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->rc, 0);.    sq
d330: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
d340: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
d350: 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
d360: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
d370: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
d380: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
d390: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
d3a0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
d3b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
d3c0: 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
d3d0: 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
d3e0: 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
d3f0: 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
d400: 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
d410: 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
d420: 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
d430: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
d440: 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
d450: 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
d460: 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
d470: 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
d480: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
d490: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
d4a0: 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
d4b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d4c0: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d4d0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
d4e0: 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
d4f0: 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
d500: 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
d510: 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
d520: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
d530: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
d540: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
d550: 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 25  t, "%6d %10lld %
d560: 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 20  8lld ",.        
d570: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
d580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
d590: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
d5a0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
d5b0: 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
d5c0: 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
d5d0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
d5e0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
d5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
d600: 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
d610: 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
d620: 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
d630: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
d640: 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63  endif.  p->magic
d650: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e   = VDBE_MAGIC_IN
d660: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  IT;.  return p->
d670: 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  rc & db->errMask
d680: 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}. ./*.** Clea
d690: 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20  n up and delete 
d6a0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
d6b0: 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20  cution.  Return 
d6c0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
d6d0: 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   is.** the resul
d6e0: 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61  t code.  Write a
d6f0: 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
d700: 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72   text into *pzEr
d710: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
d720: 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65  ite3VdbeFinalize
d730: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
d740: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d750: 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d  .  if( p->magic=
d760: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
d770: 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  || p->magic==VDB
d780: 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a  E_MAGIC_HALT ){.
d790: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d7a0: 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20  VdbeReset(p);.  
d7b0: 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20    assert( (rc & 
d7c0: 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d  p->db->errMask)=
d7d0: 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  =rc );.  }else i
d7e0: 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
d7f0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a  E_MAGIC_INIT ){.
d800: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d810: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20  E_MISUSE;.  }.  
d820: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
d830: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
d840: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  c;.}../*.** Call
d850: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
d860: 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61  for each auxdata
d870: 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46   entry in pVdbeF
d880: 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a  unc for which.**
d890: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
d8a0: 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69  ng bit in mask i
d8b0: 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74  s clear.  Auxdat
d8c0: 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64  a entries beyond
d8d0: 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79   31.** are alway
d8e0: 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f  s destroyed.  To
d8f0: 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78   destroy all aux
d900: 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61  data entries, ca
d910: 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
d920: 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e  ne with mask==0.
d930: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d940: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
d950: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62  a(VdbeFunc *pVdb
d960: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29  eFunc, int mask)
d970: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
d980: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e  (i=0; i<pVdbeFun
d990: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20  c->nAux; i++){. 
d9a0: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74     struct AuxDat
d9b0: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65  a *pAux = &pVdbe
d9c0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a  Func->apAux[i];.
d9d0: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c      if( (i>31 ||
d9e0: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29   !(mask&(1<<i)))
d9f0: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29   && pAux->pAux )
da00: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78  {.      if( pAux
da10: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20  ->xDelete ){.   
da20: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65       pAux->xDele
da30: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a  te(pAux->pAux);.
da40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41        }.      pA
da50: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20  ux->pAux = 0;.  
da60: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
da70: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
da80: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
da90: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
daa0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
dab0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
dac0: 64 62 3b 0a 0a 20 20 69 66 28 20 70 3d 3d 30 20  db;..  if( p==0 
dad0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
dae0: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d   p->db;.  if( p-
daf0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
db00: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
db10: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
db20: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
db30: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
db40: 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
db50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
db60: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
db70: 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
db80: 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
db90: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20   }.  if( p->aOp 
dba0: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d  ){.    Op *pOp =
dbb0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 20 20 66 6f 72   p->aOp;.    for
dbc0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
dbd0: 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i++, pOp++){.   
dbe0: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
dbf0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
dc00: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
dc10: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
dc20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
dc30: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
dc40: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
dc50: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
dc60: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
dc70: 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
dc80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
dc90: 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20  , p->aLabel);.  
dca0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
dcb0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
dcc0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
dcd0: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
dce0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
dcf0: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
dd00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
dd10: 7a 53 71 6c 29 3b 0a 20 20 70 2d 3e 6d 61 67 69  zSql);.  p->magi
dd20: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44  c = VDBE_MAGIC_D
dd30: 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  EAD;.  sqlite3Db
dd40: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4f 70 29  Free(db, p->aOp)
dd50: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
dd60: 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
dd70: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
dd80: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
dd90: 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70  * If a MoveTo op
dda0: 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69  eration is pendi
ddb0: 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ng on the given 
ddc0: 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20  cursor, then do 
ddd0: 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e  that.** MoveTo n
dde0: 6f 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ow.  Return an e
ddf0: 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e  rror code.  If n
de00: 6f 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64  o MoveTo is pend
de10: 69 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75  ing, this.** rou
de20: 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e  tine does nothin
de30: 67 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51  g and returns SQ
de40: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
de50: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
de60: 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73  rMoveto(VdbeCurs
de70: 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  or *p){.  if( p-
de80: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
de90: 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20  ){.    int res, 
dea0: 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
deb0: 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74 65 72  E_TEST.    exter
dec0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
ded0: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
dee0: 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  if.    assert( p
def0: 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20  ->isTable );.   
df00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
df10: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
df20: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
df30: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
df40: 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69   0, &res);.    i
df50: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
df60: 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f  c;.    p->lastRo
df70: 77 69 64 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70  wid = keyToInt(p
df80: 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 3b  ->movetoTarget);
df90: 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56  .    p->rowidIsV
dfa0: 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 20 3f 31  alid = res==0 ?1
dfb0: 3a 30 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  :0;.    if( res<
dfc0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
dfd0: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
dfe0: 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 72 65  (p->pCursor, &re
dff0: 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
e000: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e010: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
e020: 45 5f 54 45 53 54 0a 20 20 20 20 73 71 6c 69 74  E_TEST.    sqlit
e030: 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
e040: 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 2d  +;.#endif.    p-
e050: 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
e060: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68  = 0;.    p->cach
e070: 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
e080: 53 54 41 4c 45 3b 0a 20 20 7d 65 6c 73 65 20 69  STALE;.  }else i
e090: 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 29 7b  f( p->pCursor ){
e0a0: 0a 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65  .    int hasMove
e0b0: 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  d;.    int rc = 
e0c0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
e0d0: 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43  orHasMoved(p->pC
e0e0: 75 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64  ursor, &hasMoved
e0f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e100: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e110: 66 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20  f( hasMoved ){. 
e120: 20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61       p->cacheSta
e130: 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
e140: 45 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c  E;.      p->null
e150: 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Row = 1;.    }. 
e160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
e170: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e180: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
e190: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73  nctions:.**.** s
e1a0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
e1b0: 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65  Type().** sqlite
e1c0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
e1d0: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  en().** sqlite3V
e1e0: 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a  dbeSerialLen().*
e1f0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
e200: 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69  ialPut().** sqli
e210: 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
e220: 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75  ().**.** encapsu
e230: 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68  late the code th
e240: 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61  at serializes va
e250: 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65  lues for storage
e260: 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61   in SQLite.** da
e270: 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63  ta and index rec
e280: 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61  ords. Each seria
e290: 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73  lized value cons
e2a0: 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65  ists of a.** 'se
e2b0: 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61  rial-type' and a
e2c0: 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54   blob of data. T
e2d0: 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
e2e0: 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69  s an 8-byte unsi
e2f0: 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c  gned.** integer,
e300: 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72   stored as a var
e310: 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e  int..**.** In an
e320: 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65   SQLite index re
e330: 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c  cord, the serial
e340: 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20   type is stored 
e350: 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a  directly before.
e360: 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64  ** the blob of d
e370: 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72  ata that it corr
e380: 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61  esponds to. In a
e390: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61   table record, a
e3a0: 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70  ll serial.** typ
e3b0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74  es are stored at
e3c0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
e3d0: 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68  e record, and th
e3e0: 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20  e blobs of data 
e3f0: 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48  at.** the end. H
e400: 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74  ence these funct
e410: 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63  ions allow the c
e420: 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20  aller to handle 
e430: 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79  the.** serial-ty
e440: 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62  pe and data blob
e450: 20 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a   seperately..**.
e460: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e470: 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
e480: 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f   the various sto
e490: 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72  rage classes for
e4a0: 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73   data:.**.**   s
e4b0: 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20  erial type      
e4c0: 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20    bytes of data 
e4d0: 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d       type.**   -
e4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
e4f0: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
e500: 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -    -----------
e510: 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20  ----.**      0  
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
e540: 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20  NULL.**      1  
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
e570: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
e580: 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20  *      2        
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
e5a0: 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
e5b0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
e5c0: 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
e5d0: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20         3        
e5e0: 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
e5f0: 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20  er.**      4    
e600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e610: 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69   4            si
e620: 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
e630: 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20       5          
e640: 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20             6    
e650: 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
e660: 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36  nteger.**      6
e670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e680: 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20       8          
e690: 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
e6a0: 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20  .**      7      
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38                 8
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45              IEEE
e6d0: 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38   float.**      8
e6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6f0: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
e700: 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
e710: 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20  nt 0.**      9  
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e730: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
e740: 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74  Integer constant
e750: 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20   1.**     10,11 
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
e780: 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e  served for expan
e790: 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32  sion.**    N>=12
e7a0: 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20   and even       
e7b0: 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20  (N-12)/2        
e7c0: 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33  BLOB.**    N>=13
e7d0: 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20   and odd        
e7e0: 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20  (N-13)/2        
e7f0: 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38  text.**.** The 8
e800: 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72   and 9 types wer
e810: 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30  e added in 3.3.0
e820: 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e  , file format 4.
e830: 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73    Prior versions
e840: 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69  .** of SQLite wi
e850: 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e  ll not understan
e860: 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74  d those serial t
e870: 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ypes..*/../*.** 
e880: 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61  Return the seria
e890: 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76  l-type for the v
e8a0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
e8b0: 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  Mem..*/.u32 sqli
e8c0: 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
e8d0: 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74  e(Mem *pMem, int
e8e0: 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20   file_format){. 
e8f0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
e900: 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20  m->flags;.  int 
e910: 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26  n;..  if( flags&
e920: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
e930: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
e940: 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e  if( flags&MEM_In
e950: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75  t ){.    /* Figu
e960: 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74  re out whether t
e970: 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36  o use 1, 2, 4, 6
e980: 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a   or 8 bytes. */.
e990: 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36  #   define MAX_6
e9a0: 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30  BYTE ((((i64)0x0
e9b0: 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29  0008000)<<32)-1)
e9c0: 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65  .    i64 i = pMe
e9d0: 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20  m->u.i;.    u64 
e9e0: 75 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f  u;.    if( file_
e9f0: 66 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26  format>=4 && (i&
ea00: 31 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72  1)==i ){.      r
ea10: 65 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a  eturn 8+(u32)i;.
ea20: 20 20 20 20 7d 0a 20 20 20 20 75 20 3d 20 69 3c      }.    u = i<
ea30: 30 20 3f 20 2d 69 20 3a 20 69 3b 0a 20 20 20 20  0 ? -i : i;.    
ea40: 69 66 28 20 75 3c 3d 31 32 37 20 29 20 72 65 74  if( u<=127 ) ret
ea50: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 75  urn 1;.    if( u
ea60: 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
ea70: 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
ea80: 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
ea90: 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
eaa0: 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
eab0: 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
eac0: 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
ead0: 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
eae0: 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
eaf0: 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
eb00: 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
eb10: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
eb20: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
eb30: 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
eb40: 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
eb50: 3b 0a 20 20 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b  ;.  n = pMem->n;
eb60: 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d  .  if( flags & M
eb70: 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e  EM_Zero ){.    n
eb80: 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72   += pMem->u.nZer
eb90: 6f 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  o;.  }.  assert(
eba0: 20 6e 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72   n>=0 );.  retur
ebb0: 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20  n ((n*2) + 12 + 
ebc0: 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29  ((flags&MEM_Str)
ebd0: 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  !=0));.}../*.** 
ebe0: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
ebf0: 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f  h of the data co
ec00: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ec10: 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69  he supplied seri
ec20: 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  al-type..*/.int 
ec30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
ec40: 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72  lTypeLen(u32 ser
ec50: 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28  ial_type){.  if(
ec60: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
ec70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
ec80: 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
ec90: 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
eca0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
ecb0: 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31  aSize[] = { 0, 1
ecc0: 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c  , 2, 3, 4, 6, 8,
ecd0: 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   8, 0, 0, 0, 0 }
ece0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69  ;.    return aSi
ecf0: 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  ze[serial_type];
ed00: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
ed10: 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72   we are on an ar
ed20: 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20  chitecture with 
ed30: 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f  mixed-endian flo
ed40: 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73  ating .** points
ed50: 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e   (ex: ARM7) then
ed60: 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20   swap the lower 
ed70: 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65  4 bytes with the
ed80: 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74   .** upper 4 byt
ed90: 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  es.  Return the 
eda0: 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  result..**.** Fo
edb0: 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74  r most architect
edc0: 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20  ures, this is a 
edd0: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61  no-op..**.** (la
ede0: 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70  ter):  It is rep
edf0: 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74  orted to me that
ee00: 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61   the mixed-endia
ee10: 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20  n problem.** on 
ee20: 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65  ARM7 is an issue
ee30: 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77   with GCC, not w
ee40: 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69  ith the ARM7 chi
ee50: 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20  p.  It seems.** 
ee60: 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69  that early versi
ee70: 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65  ons of GCC store
ee80: 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20  d the two words 
ee90: 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66  of a 64-bit.** f
eea0: 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e  loat in the wron
eeb0: 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68  g order.  And th
eec0: 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65  at error has bee
eed0: 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20  n propagated.** 
eee0: 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65  ever since.  The
eef0: 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65   blame is not ne
ef00: 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47  cessarily with G
ef10: 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47  CC, though..** G
ef20: 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75  CC might have ju
ef30: 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70  st copying the p
ef40: 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72  roblem from a pr
ef50: 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a  ior compiler..**
ef60: 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20   I am also told 
ef70: 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69  that newer versi
ef80: 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20  ons of GCC that 
ef90: 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65  follow a differe
efa0: 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68  nt.** ABI get th
efb0: 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67  e byte order rig
efc0: 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f  ht..**.** Develo
efd0: 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74  pers using SQLit
efe0: 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f  e on an ARM7 sho
eff0: 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20  uld compile and 
f000: 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70  run their.** app
f010: 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d  lication using -
f020: 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20  DSQLITE_DEBUG=1 
f030: 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20  at least once.  
f040: 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e  With DEBUG.** en
f050: 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65  abled, some asse
f060: 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65  rts below will e
f070: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62  nsure that the b
f080: 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20  yte order of.** 
f090: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
f0a0: 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74  alues is correct
f0b0: 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38  ..**.** (2007-08
f0c0: 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20  -30)  Frank van 
f0d0: 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64  Vugt has studied
f0e0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c   this problem cl
f0f0: 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73  osely.** and has
f100: 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e   send his findin
f110: 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65  gs to the SQLite
f120: 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72   developers.  Fr
f130: 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68  ank.** writes th
f140: 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65  at some Linux ke
f150: 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61  rnels offer floa
f160: 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77  ting point hardw
f170: 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e  are.** emulation
f180: 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20   that uses only 
f190: 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73  32-bit mantissas
f1a0: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75   instead of a fu
f1b0: 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61  ll .** 48-bits a
f1c0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
f1d0: 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e  e IEEE standard.
f1e0: 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a    (This is the.*
f1f0: 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53  * CONFIG_FPE_FAS
f200: 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f  TFPE option.)  O
f210: 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20  n such systems, 
f220: 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a  floating point.*
f230: 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  * byte swapping 
f240: 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d  becomes very com
f250: 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76  plicated.  To av
f260: 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a  oid problems,.**
f270: 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62   the necessary b
f280: 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20  yte swapping is 
f290: 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e  carried out usin
f2a0: 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  g a 64-bit integ
f2b0: 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61  er.** rather tha
f2c0: 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  n a 64-bit float
f2d0: 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73  .  Frank assures
f2e0: 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64   us that the cod
f2f0: 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20  e here.** works 
f300: 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68  for him.  We, th
f310: 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61  e developers, ha
f320: 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64  ve no way to ind
f330: 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65  ependently.** ve
f340: 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46  rify this, but F
f350: 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e  rank seems to kn
f360: 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61  ow what he is ta
f370: 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73  lking about.** s
f380: 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a  o we trust him..
f390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
f3a0: 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
f3b0: 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63  BIT_FLOAT.static
f3c0: 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75   u64 floatSwap(u
f3d0: 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20  64 in){.  union 
f3e0: 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20  {.    u64 r;.   
f3f0: 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75   u32 i[2];.  } u
f400: 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e  ;.  u32 t;..  u.
f410: 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e  r = in;.  t = u.
f420: 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d  i[0];.  u.i[0] =
f430: 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31   u.i[1];.  u.i[1
f440: 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20  ] = t;.  return 
f450: 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  u.r;.}.# define 
f460: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
f470: 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f  loat(X)  X = flo
f480: 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a  atSwap(X).#else.
f490: 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
f4a0: 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
f4b0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
f4c0: 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69  rite the seriali
f4d0: 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f  zed data blob fo
f4e0: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
f4f0: 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20  ed in pMem into 
f500: 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61  .** buf. It is a
f510: 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
f520: 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63  caller has alloc
f530: 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20  ated sufficient 
f540: 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  space..** Return
f550: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
f560: 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a  ytes written..**
f570: 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20  .** nBuf is the 
f580: 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20  amount of space 
f590: 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20  left in buf[].  
f5a0: 6e 42 75 66 20 6d 75 73 74 20 61 6c 77 61 79 73  nBuf must always
f5b0: 20 62 65 0a 2a 2a 20 6c 61 72 67 65 20 65 6e 6f   be.** large eno
f5c0: 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ugh to hold the 
f5d0: 65 6e 74 69 72 65 20 66 69 65 6c 64 2e 20 20 45  entire field.  E
f5e0: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 66 69  xcept, if the fi
f5f0: 65 6c 64 20 69 73 0a 2a 2a 20 61 20 62 6c 6f 62  eld is.** a blob
f600: 20 77 69 74 68 20 61 20 7a 65 72 6f 2d 66 69 6c   with a zero-fil
f610: 6c 65 64 20 74 61 69 6c 2c 20 74 68 65 6e 20 62  led tail, then b
f620: 75 66 5b 5d 20 6d 69 67 68 74 20 62 65 20 6a 75  uf[] might be ju
f630: 73 74 20 74 68 65 20 72 69 67 68 74 0a 2a 2a 20  st the right.** 
f640: 73 69 7a 65 20 74 6f 20 68 6f 6c 64 20 65 76 65  size to hold eve
f650: 72 79 74 68 69 6e 67 20 65 78 63 65 70 74 20 66  rything except f
f660: 6f 72 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c  or the zero-fill
f670: 65 64 20 74 61 69 6c 2e 20 20 49 66 20 62 75 66  ed tail.  If buf
f680: 5b 5d 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 62 69  [].** is only bi
f690: 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
f6a0: 20 74 68 65 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   the non-zero pr
f6b0: 65 66 69 78 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  efix, then only 
f6c0: 77 72 69 74 65 20 74 68 61 74 0a 2a 2a 20 70 72  write that.** pr
f6d0: 65 66 69 78 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  efix into buf[].
f6e0: 20 20 42 75 74 20 69 66 20 62 75 66 5b 5d 20 69    But if buf[] i
f6f0: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
f700: 6f 20 68 6f 6c 64 20 62 6f 74 68 20 74 68 65 0a  o hold both the.
f710: 2a 2a 20 70 72 65 66 69 78 20 61 6e 64 20 74 68  ** prefix and th
f720: 65 20 74 61 69 6c 20 74 68 65 6e 20 77 72 69 74  e tail then writ
f730: 65 20 74 68 65 20 70 72 65 66 69 78 20 61 6e 64  e the prefix and
f740: 20 73 65 74 20 74 68 65 20 74 61 69 6c 20 74 6f   set the tail to
f750: 20 61 6c 6c 0a 2a 2a 20 7a 65 72 6f 73 2e 0a 2a   all.** zeros..*
f760: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f770: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
f780: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
f790: 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
f7a0: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
f7b0: 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
f7c0: 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
f7d0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
f7e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
f7f0: 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
f800: 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
f810: 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 69 6e  in buf[]..*/ .in
f820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
f830: 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
f840: 69 6e 74 20 6e 42 75 66 2c 20 4d 65 6d 20 2a 70  int nBuf, Mem *p
f850: 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
f860: 72 6d 61 74 29 7b 0a 20 20 75 33 32 20 73 65 72  rmat){.  u32 ser
f870: 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 6c 69 74  ial_type = sqlit
f880: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
f890: 28 70 4d 65 6d 2c 20 66 69 6c 65 5f 66 6f 72 6d  (pMem, file_form
f8a0: 61 74 29 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  at);.  int len;.
f8b0: 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
f8c0: 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
f8d0: 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
f8e0: 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
f8f0: 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
f900: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28    int i;.    if(
f910: 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
f920: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
f930: 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
f940: 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
f950: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
f960: 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
f970: 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
f980: 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
f990: 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
f9a0: 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
f9b0: 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
f9c0: 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
f9d0: 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
f9e0: 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
f9f0: 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e 3c      assert( len<
fa00: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69  =nBuf );.    whi
fa10: 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20  le( i-- ){.     
fa20: 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76   buf[i] = (u8)(v
fa30: 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
fa40: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20  >>= 8;.    }.   
fa50: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
fa60: 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
fa70: 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
fa80: 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
fa90: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
faa0: 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
fab0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
fac0: 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
fad0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
fae0: 3d 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  == sqlite3VdbeSe
faf0: 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
fb00: 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
fb10: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3c  assert( pMem->n<
fb20: 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 6e  =nBuf );.    len
fb30: 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20   = pMem->n;.    
fb40: 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
fb50: 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 69  ->z, len);.    i
fb60: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
fb70: 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
fb80: 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d 3e     len += pMem->
fb90: 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 69  u.nZero;.      i
fba0: 66 28 20 6c 65 6e 3e 6e 42 75 66 20 29 7b 0a 20  f( len>nBuf ){. 
fbb0: 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 6e 42 75         len = nBu
fbc0: 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  f;.      }.     
fbd0: 20 6d 65 6d 73 65 74 28 26 62 75 66 5b 70 4d 65   memset(&buf[pMe
fbe0: 6d 2d 3e 6e 5d 2c 20 30 2c 20 6c 65 6e 2d 70 4d  m->n], 0, len-pM
fbf0: 65 6d 2d 3e 6e 29 3b 0a 20 20 20 20 7d 0a 20 20  em->n);.    }.  
fc00: 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
fc10: 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
fc20: 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
fc30: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
fc40: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  }../*.** Deseria
fc50: 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
fc60: 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
fc70: 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
fc80: 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
fc90: 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
fca0: 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
fcb0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
fcc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
fcd0: 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
fce0: 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
fcf0: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
fd00: 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
fd10: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
fd20: 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
fd30: 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
fd40: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
fd50: 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
fd60: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
fd70: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
fda0: 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
fdb0: 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77   into */.){.  sw
fdc0: 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
fdd0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30  e ){.    case 10
fde0: 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
fdf0: 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
fe00: 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 20  /.    case 11:  
fe10: 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
fe20: 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
fe30: 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a     case 0: {  /*
fe40: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70   NULL */.      p
fe50: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
fe60: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
fe70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
fe80: 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74  se 1: { /* 1-byt
fe90: 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
fea0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
feb0: 75 2e 69 20 3d 20 28 73 69 67 6e 65 64 20 63 68  u.i = (signed ch
fec0: 61 72 29 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20  ar)buf[0];.     
fed0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
fee0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
fef0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ff00: 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
ff10: 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
ff20: 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
ff30: 65 6d 2d 3e 75 2e 69 20 3d 20 28 28 28 73 69 67  em->u.i = (((sig
ff40: 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29  ned char)buf[0])
ff50: 3c 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20  <<8) | buf[1];. 
ff60: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ff70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
ff80: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
ff90: 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
ffa0: 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
ffb0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
ffc0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 28    pMem->u.i = ((
ffd0: 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66  (signed char)buf
ffe0: 5b 30 5d 29 3c 3c 31 36 29 20 7c 20 28 62 75 66  [0])<<16) | (buf
fff0: 5b 31 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 32 5d  [1]<<8) | buf[2]
10000 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
10010 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
10020 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
10030 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
10040 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
10050 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
10060 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
10070 20 28 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20   (buf[0]<<24) | 
10080 28 62 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28  (buf[1]<<16) | (
10090 62 75 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66  buf[2]<<8) | buf
100a0 5b 33 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  [3];.      pMem-
100b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
100c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
100d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
100e0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
100f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
10100 2f 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20  /.      u64 x = 
10110 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62  (((signed char)b
10120 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66  uf[0])<<8) | buf
10130 5b 31 5d 3b 0a 20 20 20 20 20 20 75 33 32 20 79  [1];.      u32 y
10140 20 3d 20 28 62 75 66 5b 32 5d 3c 3c 32 34 29 20   = (buf[2]<<24) 
10150 7c 20 28 62 75 66 5b 33 5d 3c 3c 31 36 29 20 7c  | (buf[3]<<16) |
10160 20 28 62 75 66 5b 34 5d 3c 3c 38 29 20 7c 20 62   (buf[4]<<8) | b
10170 75 66 5b 35 5d 3b 0a 20 20 20 20 20 20 78 20 3d  uf[5];.      x =
10180 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20   (x<<32) | y;.  
10190 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
101a0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20  *(i64*)&x;.     
101b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
101c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
101d0 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20  turn 6;.    }.  
101e0 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38    case 6:   /* 8
101f0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
10200 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65  eger */.    case
10210 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c   7: { /* IEEE fl
10220 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a  oating point */.
10230 20 20 20 20 20 20 75 36 34 20 78 3b 0a 20 20 20        u64 x;.   
10240 20 20 20 75 33 32 20 79 3b 0a 23 69 66 20 21 64     u32 y;.#if !d
10250 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
10260 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
10270 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
10280 50 4f 49 4e 54 29 0a 20 20 20 20 20 20 2f 2a 20  POINT).      /* 
10290 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65  Verify that inte
102a0 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e  gers and floatin
102b0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75  g point values u
102c0 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20  se the same.    
102d0 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e    ** byte order.
102e0 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51    Or, that if SQ
102f0 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41  LITE_MIXED_ENDIA
10300 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73  N_64BIT_FLOAT is
10310 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  .      ** define
10320 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
10330 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
10340 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
10350 69 78 65 64 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ixed.      ** en
10360 64 69 61 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  dian..      */. 
10370 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
10380 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
10390 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
103a0 3b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  ;.      static c
103b0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
103c0 20 31 2e 30 3b 0a 20 20 20 20 20 20 75 36 34 20   1.0;.      u64 
103d0 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 20 20 73  t2 = t1;.      s
103e0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
103f0 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 20 20 61  oat(t2);.      a
10400 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31  ssert( sizeof(r1
10410 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26  )==sizeof(t2) &&
10420 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32   memcmp(&r1, &t2
10430 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30  , sizeof(r1))==0
10440 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   );.#endif..    
10450 20 20 78 20 3d 20 28 62 75 66 5b 30 5d 3c 3c 32    x = (buf[0]<<2
10460 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 36  4) | (buf[1]<<16
10470 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 20  ) | (buf[2]<<8) 
10480 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 20  | buf[3];.      
10490 79 20 3d 20 28 62 75 66 5b 34 5d 3c 3c 32 34 29  y = (buf[4]<<24)
104a0 20 7c 20 28 62 75 66 5b 35 5d 3c 3c 31 36 29 20   | (buf[5]<<16) 
104b0 7c 20 28 62 75 66 5b 36 5d 3c 3c 38 29 20 7c 20  | (buf[6]<<8) | 
104c0 62 75 66 5b 37 5d 3b 0a 20 20 20 20 20 20 78 20  buf[7];.      x 
104d0 3d 20 28 78 3c 3c 33 32 29 20 7c 20 79 3b 0a 20  = (x<<32) | y;. 
104e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
104f0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 20  type==6 ){.     
10500 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a     pMem->u.i = *
10510 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20  (i64*)&x;.      
10520 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
10530 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 7d  MEM_Int;.      }
10540 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
10550 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
10560 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
10570 6d 2d 3e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  m->r)==8 );.    
10580 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
10590 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20  ianFloat(x);.   
105a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65       memcpy(&pMe
105b0 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  m->r, &x, sizeof
105c0 28 78 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  (x));.        pM
105d0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
105e0 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72  te3IsNaN(pMem->r
105f0 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
10600 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d  EM_Real;.      }
10610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 3b  .      return 8;
10620 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10630 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72  8:    /* Integer
10640 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39   0 */.    case 9
10650 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  : {  /* Integer 
10660 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  1 */.      pMem-
10670 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
10680 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
10690 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
106a0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
106b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
106c0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
106d0 74 20 6c 65 6e 20 3d 20 28 73 65 72 69 61 6c 5f  t len = (serial_
106e0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
106f0 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
10700 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
10710 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e 3b 0a 20 20  Mem->n = len;.  
10720 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
10730 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   0;.      if( se
10740 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29  rial_type&0x01 )
10750 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
10760 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20  flags = MEM_Str 
10770 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
10780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10790 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
107a0 4d 45 4d 5f 42 6c 6f 62 20 7c 20 4d 45 4d 5f 45  MEM_Blob | MEM_E
107b0 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  phem;.      }.  
107c0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
107d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
107e0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
107f0 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62  Given the nKey-b
10800 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  yte encoding of 
10810 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79  a record in pKey
10820 5b 5d 2c 20 70 61 72 73 65 20 74 68 65 0a 2a 2a  [], parse the.**
10830 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 61 20 55   record into a U
10840 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
10850 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
10860 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a   a pointer to.**
10870 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 2e   that structure.
10880 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
10890 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 69 67 68  ng function migh
108a0 74 20 70 72 6f 76 69 64 65 20 73 7a 53 70 61 63  t provide szSpac
108b0 65 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  e bytes of memor
108c0 79 0a 2a 2a 20 73 70 61 63 65 20 61 74 20 70 53  y.** space at pS
108d0 70 61 63 65 2e 20 20 54 68 69 73 20 73 70 61 63  pace.  This spac
108e0 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  e can be used to
108f0 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
10900 65 64 0a 2a 2a 20 56 44 62 65 50 61 72 73 65 64  ed.** VDbeParsed
10910 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
10920 20 69 66 20 69 74 20 69 73 20 6c 61 72 67 65 20   if it is large 
10930 65 6e 6f 75 67 68 2e 20 20 49 66 20 69 74 20 69  enough.  If it i
10940 73 0a 2a 2a 20 6e 6f 74 20 62 69 67 20 65 6e 6f  s.** not big eno
10950 75 67 68 2c 20 73 70 61 63 65 20 69 73 20 6f 62  ugh, space is ob
10960 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
10970 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
10980 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
10990 20 73 74 72 75 63 74 75 72 65 20 73 68 6f 75 6c   structure shoul
109a0 64 20 62 65 20 63 6c 6f 73 65 64 20 62 79 20 61  d be closed by a
109b0 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
109c0 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70  te3VdbeDeleteUnp
109d0 61 63 6b 65 64 52 65 63 6f 72 64 28 29 2e 0a 2a  ackedRecord()..*
109e0 2f 20 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  / .UnpackedRecor
109f0 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 52 65  d *sqlite3VdbeRe
10a00 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
10a10 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
10a20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
10a30 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
10a40 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
10a50 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
10a60 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
10a70 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
10a80 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
10a90 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
10aa0 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
10ab0 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
10ac0 6b 65 64 52 65 63 6f 72 64 20 2a 70 53 70 61 63  kedRecord *pSpac
10ad0 65 2c 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c  e,/* Space avail
10ae0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 72 65 73  able to hold res
10af0 75 6c 74 69 6e 67 20 6f 62 6a 65 63 74 20 2a 2f  ulting object */
10b00 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 20 20  .  int szSpace  
10b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
10b20 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e  e of pSpace[] in
10b30 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63   bytes */.){.  c
10b40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10b50 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
10b60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10b70 2a 29 70 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b  *)pKey;.  Unpack
10b80 65 64 52 65 63 6f 72 64 20 2a 70 3b 0a 20 20 69  edRecord *p;.  i
10b90 6e 74 20 6e 42 79 74 65 2c 20 64 3b 0a 20 20 75  nt nByte, d;.  u
10ba0 33 32 20 69 64 78 3b 0a 20 20 75 31 36 20 75 3b  32 idx;.  u16 u;
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
10bd0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
10be0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
10bf0 2a 70 4d 65 6d 3b 0a 20 20 0a 20 20 61 73 73 65  *pMem;.  .  asse
10c00 72 74 28 20 73 69 7a 65 6f 66 28 4d 65 6d 29 3e  rt( sizeof(Mem)>
10c10 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
10c20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 4d  nByte = sizeof(M
10c30 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
10c40 46 69 65 6c 64 2b 32 29 3b 0a 20 20 69 66 28 20  Field+2);.  if( 
10c50 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b  nByte>szSpace ){
10c60 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
10c70 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79  DbMallocRaw(pKey
10c80 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29  Info->db, nByte)
10c90 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
10ca0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
10cb0 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b  ->flags = UNPACK
10cc0 45 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55  ED_NEED_FREE | U
10cd0 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53  NPACKED_NEED_DES
10ce0 54 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TROY;.  }else{. 
10cf0 20 20 20 70 20 3d 20 70 53 70 61 63 65 3b 0a 20     p = pSpace;. 
10d00 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e     p->flags = UN
10d10 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54  PACKED_NEED_DEST
10d20 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b  ROY;.  }.  p->pK
10d30 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
10d40 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
10d50 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
10d60 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d  d + 1;.  p->aMem
10d70 20 3d 20 70 4d 65 6d 20 3d 20 26 28 28 4d 65 6d   = pMem = &((Mem
10d80 2a 29 70 29 5b 31 5d 3b 0a 20 20 69 64 78 20 3d  *)p)[1];.  idx =
10d90 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65   getVarint32(aKe
10da0 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d  y, szHdr);.  d =
10db0 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b   szHdr;.  u = 0;
10dc0 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
10dd0 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65  Hdr && u<p->nFie
10de0 6c 64 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ld ){.    u32 se
10df0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
10e00 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
10e10 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
10e20 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
10e30 20 69 66 28 20 64 3e 3d 6e 4b 65 79 20 26 26 20   if( d>=nKey && 
10e40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
10e50 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
10e60 74 79 70 65 29 3e 30 20 29 20 62 72 65 61 6b 3b  type)>0 ) break;
10e70 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d  .    pMem->enc =
10e80 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
10e90 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70      pMem->db = p
10ea0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
10eb0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
10ec0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c  ;.    pMem->zMal
10ed0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
10ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
10ef0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
10f00 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
10f10 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
10f20 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20  .    u++;.  }.  
10f30 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49  assert( u<=pKeyI
10f40 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20  nfo->nField + 1 
10f50 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  );.  p->nField =
10f60 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   u;.  return (vo
10f70 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  id*)p;.}../*.** 
10f80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73  This routine des
10f90 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64  troys a Unpacked
10fa0 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 0a 2a 2f  Record object.*/
10fb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
10fc0 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52  eDeleteUnpackedR
10fd0 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 65  ecord(UnpackedRe
10fe0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20  cord *p){.  if( 
10ff0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  p ){.    if( p->
11000 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
11010 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 7b  _NEED_DESTROY ){
11020 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
11030 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20      Mem *pMem;. 
11040 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d       for(i=0, pM
11050 65 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d  em=p->aMem; i<p-
11060 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d  >nField; i++, pM
11070 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  em++){.        i
11080 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  f( pMem->zMalloc
11090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
110a0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
110b0 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 20  ase(pMem);.     
110c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
110d0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 6c   }.    if( p->fl
110e0 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e  ags & UNPACKED_N
110f0 45 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20  EED_FREE ){.    
11100 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11110 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  p->pKeyInfo->db,
11120 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   p);.    }.  }.}
11130 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11140 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
11150 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
11160 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
11170 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
11180 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
11190 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
111a0 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
111b0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
111c0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
111d0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
111e0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
111f0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
11200 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
11210 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
11220 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
11230 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
11240 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  th OP_MakeRecord
11250 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56   opcode of the V
11260 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32  DBE.  The pPKey2
11270 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20  .** key must be 
11280 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63  a parsed key suc
11290 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72  h as obtained fr
112a0 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
112b0 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a  eParseRecord..**
112c0 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
112d0 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
112e0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
112f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
11300 64 73 2e 0a 2a 2a 20 54 68 65 20 6b 65 79 20 77  ds..** The key w
11310 69 74 68 20 66 65 77 65 72 20 66 69 65 6c 64 73  ith fewer fields
11320 20 69 73 20 75 73 75 61 6c 6c 79 20 63 6f 6d 70   is usually comp
11330 61 72 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  ares less than t
11340 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 72 20 6b 65  he .** longer ke
11350 79 2e 20 20 48 6f 77 65 76 65 72 20 69 66 20 74  y.  However if t
11360 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52  he UNPACKED_INCR
11370 4b 45 59 20 66 6c 61 67 73 20 69 6e 20 70 50 4b  KEY flags in pPK
11380 65 79 32 20 69 73 20 73 65 74 0a 2a 2a 20 61 6e  ey2 is set.** an
11390 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65  d the common pre
113a0 66 69 78 65 73 20 61 72 65 20 65 71 75 61 6c 2c  fixes are equal,
113b0 20 74 68 65 6e 20 6b 65 79 31 20 69 73 20 6c 65   then key1 is le
113c0 73 73 20 74 68 61 6e 20 6b 65 79 32 2e 0a 2a 2a  ss than key2..**
113d0 20 4f 72 20 69 66 20 74 68 65 20 55 4e 50 41 43   Or if the UNPAC
113e0 4b 45 44 5f 4d 41 54 43 48 5f 50 52 45 46 49 58  KED_MATCH_PREFIX
113f0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
11400 20 74 68 65 20 70 72 65 66 69 78 65 73 20 61 72   the prefixes ar
11410 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 74 68 65 6e  e.** equal, then
11420 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 63 6f   the keys are co
11430 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
11440 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 74 68 65 20  qual and.** the 
11450 70 61 72 74 73 20 62 65 79 6f 6e 64 20 74 68 65  parts beyond the
11460 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 20 61   common prefix a
11470 72 65 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  re ignored..**.*
11480 2a 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b 45  * If the UNPACKE
11490 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 66  D_IGNORE_ROWID f
114a0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
114b0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
114c0 66 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  f.** the header 
114d0 6f 66 20 70 4b 65 79 31 20 69 73 20 69 67 6e 6f  of pKey1 is igno
114e0 72 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  red.  It is assu
114f0 6d 65 64 20 74 68 61 74 20 70 4b 65 79 31 20 69  med that pKey1 i
11500 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 78 20 6b 65  s.** an index ke
11510 79 2c 20 61 6e 64 20 74 68 75 73 20 65 6e 64 73  y, and thus ends
11520 20 77 69 74 68 20 61 20 72 6f 77 69 64 20 76 61   with a rowid va
11530 6c 75 65 2e 20 20 54 68 65 20 6c 61 73 74 20 62  lue.  The last b
11540 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 68 65  yte.** of the he
11550 61 64 65 72 20 77 69 6c 6c 20 74 68 65 72 65 66  ader will theref
11560 6f 72 65 20 62 65 20 74 68 65 20 73 65 72 69 61  ore be the seria
11570 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
11580 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 6f 66 20 31  wid:.** one of 1
11590 2c 20 32 2c 20 33 2c 20 34 2c 20 35 2c 20 36 2c  , 2, 3, 4, 5, 6,
115a0 20 38 2c 20 6f 72 20 39 20 2d 20 74 68 65 20 69   8, or 9 - the i
115b0 6e 74 65 67 65 72 20 73 65 72 69 61 6c 20 74 79  nteger serial ty
115c0 70 65 73 2e 0a 2a 2a 20 54 68 65 20 73 65 72 69  pes..** The seri
115d0 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  al type of the f
115e0 69 6e 61 6c 20 72 6f 77 69 64 20 77 69 6c 6c 20  inal rowid will 
115f0 61 6c 77 61 79 73 20 62 65 20 61 20 73 69 6e 67  always be a sing
11600 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 42 79 20 69  le byte..** By i
11610 67 6e 6f 72 69 6e 67 20 74 68 69 73 20 6c 61 73  gnoring this las
11620 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
11630 61 64 65 72 2c 20 77 65 20 66 6f 72 63 65 20 74  ader, we force t
11640 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
11650 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 72   to ignore the r
11660 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
11670 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a 69 6e 74 20  of key1..*/.int 
11680 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
11690 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
116a0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
116b0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
116c0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
116d0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
116e0 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
116f0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e  t key */.){.  in
11700 74 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  t d1;           
11710 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
11720 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
11730 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
11740 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
11750 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
11760 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
11770 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
11780 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
11790 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
117a0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
117b0 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
117c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 46 69 65   = 0;.  int nFie
117d0 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  ld;.  int rc = 0
117e0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
117f0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
11800 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
11810 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
11820 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
11830 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
11840 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
11850 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
11860 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
11870 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
11880 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
11890 2d 3e 64 62 3b 0a 20 20 6d 65 6d 31 2e 66 6c 61  ->db;.  mem1.fla
118a0 67 73 20 3d 20 30 3b 0a 20 20 6d 65 6d 31 2e 7a  gs = 0;.  mem1.z
118b0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20  Malloc = 0;.  . 
118c0 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
118d0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
118e0 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72  1);.  d1 = szHdr
118f0 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d  1;.  if( pPKey2-
11900 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
11910 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
11920 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a  {.    szHdr1--;.
11930 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70    }.  nField = p
11940 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b  KeyInfo->nField;
11950 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73  .  while( idx1<s
11960 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
11970 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20  2->nField ){.   
11980 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
11990 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
119a0 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
119b0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
119c0 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
119d0 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
119e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
119f0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
11a00 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69  l_type1 );.    i
11a10 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20  f( d1>=nKey1 && 
11a20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
11a30 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
11a40 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b  type1)>0 ) break
11a50 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  ;..    /* Extrac
11a60 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20  t the values to 
11a70 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20  be compared..   
11a80 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71   */.    d1 += sq
11a90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
11aa0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
11ab0 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65  erial_type1, &me
11ac0 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  m1);..    /* Do 
11ad0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20  the comparison. 
11ae0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
11af0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
11b00 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d  (&mem1, &pPKey2-
11b10 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20  >aMem[i],.      
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20       i<nField ? 
11b40 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11b50 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28  i] : 0);.    if(
11b60 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
11b70 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
11b80 20 69 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i++;.  }.  if( 
11b90 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73  mem1.zMalloc ) s
11ba0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
11bb0 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20  ease(&mem1);..  
11bc0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
11bd0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
11be0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66  eans that one of
11bf0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
11c00 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
11c10 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66      ** all the f
11c20 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
11c30 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
11c40 6c 2e 20 49 66 20 74 68 65 20 55 4e 50 41 43 4b  l. If the UNPACK
11c50 45 44 5f 49 4e 43 52 4b 45 59 0a 20 20 20 20 2a  ED_INCRKEY.    *
11c60 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74  * flag is set, t
11c70 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 74 69  hen break the ti
11c80 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 6b 65  e by treating ke
11c90 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20  y2 as larger..  
11ca0 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43    ** If the UPAC
11cb0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48  KED_PREFIX_MATCH
11cc0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
11cd0 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d  en keys with com
11ce0 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 20  mon prefixes.   
11cf0 20 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72   ** are consider
11d00 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20  ed to be equal. 
11d10 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
11d20 6c 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68  longer key is th
11d30 65 20 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 72  e .    ** larger
11d40 2e 20 20 41 73 20 69 74 20 68 61 70 70 65 6e 73  .  As it happens
11d50 2c 20 74 68 65 20 70 50 4b 65 79 32 20 77 69 6c  , the pPKey2 wil
11d60 6c 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  l always be the 
11d70 6c 6f 6e 67 65 72 0a 20 20 20 20 2a 2a 20 69 66  longer.    ** if
11d80 20 74 68 65 72 65 20 69 73 20 61 20 64 69 66 66   there is a diff
11d90 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  erence..    */. 
11da0 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66     if( pPKey2->f
11db0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
11dc0 49 4e 43 52 4b 45 59 20 29 7b 0a 20 20 20 20 20  INCRKEY ){.     
11dd0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65   rc = -1;.    }e
11de0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
11df0 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44  flags & UNPACKED
11e00 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 20 29 7b  _PREFIX_MATCH ){
11e10 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20  .      /* Leave 
11e20 72 63 3d 3d 30 20 2a 2f 0a 20 20 20 20 7d 65 6c  rc==0 */.    }el
11e30 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 64  se if( idx1<szHd
11e40 72 31 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  r1 ){.      rc =
11e50 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
11e60 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
11e70 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 69 3c  aSortOrder && i<
11e80 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
11e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11ea0 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  && pKeyInfo->aSo
11eb0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
11ec0 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 7d 0a    rc = -rc;.  }.
11ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11ee0 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f   ../*.** pCur po
11ef0 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78  ints at an index
11f00 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75   entry created u
11f10 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65  sing the OP_Make
11f20 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a  Record opcode..*
11f30 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64  * Read the rowid
11f40 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64   (the last field
11f50 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20   in the record) 
11f60 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20  and store it in 
11f70 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72  *rowid..** Retur
11f80 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
11f90 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c  verything works,
11fa0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
11fb0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
11fc0 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65  ** pCur might be
11fd0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78   pointing to tex
11fe0 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  t obtained from 
11ff0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
12000 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74  se file..** So t
12010 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f  he content canno
12020 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44  t be trusted.  D
12030 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68  o appropriate ch
12040 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ecks on the cont
12050 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
12060 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28  te3VdbeIdxRowid(
12070 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
12080 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69  i64 *rowid){.  i
12090 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
120a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
120b0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f   szHdr;        /
120c0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65  * Size of the he
120d0 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79  ader */.  u32 ty
120e0 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53  peRowid;    /* S
120f0 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68  erial type of th
12100 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32  e rowid */.  u32
12110 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f   lenRowid;     /
12120 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f  * Size of the ro
12130 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20  wid */.  Mem m, 
12140 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65  v;..  /* Get the
12150 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64   size of the ind
12160 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20  ex entry.  Only 
12170 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20  indices entries 
12180 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61  of less.  ** tha
12190 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f  n 2GiB are suppo
121a0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61  rt - anything la
121b0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61  rge must be data
121c0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
121d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
121e0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
121f0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28  nCellKey);.  if(
12200 20 75 6e 6c 69 6b 65 6c 79 28 6e 43 65 6c 6c 4b   unlikely(nCellK
12210 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65  ey<=0 || nCellKe
12220 79 3e 30 78 37 66 66 66 66 66 66 66 29 20 29 7b  y>0x7fffffff) ){
12230 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12240 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12250 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
12260 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
12270 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
12280 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
12290 6d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d  m.flags = 0;.  m
122a0 2e 64 62 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61  .db = 0;.  m.zMa
122b0 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d  lloc = 0;.  rc =
122c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
122d0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
122e0 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
122f0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
12300 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
12310 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
12320 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
12330 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
12340 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
12350 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
12360 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
12370 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
12380 20 73 7a 48 64 72 3d 3d 32 20 29 3b 0a 20 20 74   szHdr==2 );.  t
12390 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
123a0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
123b0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 32 20 7c 7c  ikely(szHdr<2 ||
123c0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
123d0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
123e0 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
123f0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
12400 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
12410 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
12420 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
12430 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
12440 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
12450 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
12460 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
12470 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
12480 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
12490 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
124a0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
124b0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
124c0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
124d0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
124e0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
124f0 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
12500 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
12510 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
12520 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
12530 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
12540 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
12550 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
12560 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
12570 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
12580 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
12590 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
125a0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
125b0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
125c0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
125d0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
125e0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
125f0 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
12600 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
12610 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
12620 74 63 61 73 65 28 20 6d 2e 6e 2d 6c 65 6e 52 6f  tcase( m.n-lenRo
12630 77 69 64 3d 3d 73 7a 48 64 72 20 29 3b 0a 20 20  wid==szHdr );.  
12640 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 6d 2e 6e  if( unlikely(m.n
12650 2d 6c 65 6e 52 6f 77 69 64 3c 73 7a 48 64 72 29  -lenRowid<szHdr)
12660 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
12670 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
12680 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
12690 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
126a0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
126b0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
126c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
126d0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
126e0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
126f0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
12700 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
12710 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
12720 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
12730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12740 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
12750 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
12760 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
12770 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
12780 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
12790 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
127a0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
127b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
127c0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
127d0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
127e0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d    testcase( m.zM
127f0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71  alloc!=0 );.  sq
12800 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
12810 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
12820 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12830 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _BKPT;.}../*.** 
12840 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20  Compare the key 
12850 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
12860 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
12870 43 20 69 73 20 70 6f 69 6e 74 20 74 6f 20 61 67  C is point to ag
12880 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
12890 20 73 74 72 69 6e 67 20 69 6e 20 70 4b 65 79 20   string in pKey 
128a0 28 6f 66 20 6c 65 6e 67 74 68 20 6e 4b 65 79 29  (of length nKey)
128b0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
128c0 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
128d0 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
128e0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
128f0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
12900 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
12910 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
12920 74 68 61 6e 20 70 4b 65 79 2e 20 20 52 65 74 75  than pKey.  Retu
12930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
12940 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
12950 4b 65 79 20 69 73 20 65 69 74 68 65 72 20 63 72  Key is either cr
12960 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20  eated without a 
12970 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e  rowid or is trun
12980 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74  cated so that it
12990 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f  .** omits the ro
129a0 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  wid at the end. 
129b0 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   The rowid at th
129c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
129d0 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69  ex entry.** is i
129e0 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20  gnored as well. 
129f0 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75   Hence, this rou
12a00 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72  tine only compar
12a10 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20  es the prefixes 
12a20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20  .** of the keys 
12a30 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e  prior to the fin
12a40 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68  al rowid, not th
12a50 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2a  e entire key..**
12a60 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 6d 61  .** pUnpacked ma
12a70 79 20 62 65 20 61 6e 20 75 6e 70 61 63 6b 65 64  y be an unpacked
12a80 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79   version of pKey
12a90 2c 6e 4b 65 79 2e 20 20 49 66 20 70 55 6e 70 61  ,nKey.  If pUnpa
12aa0 63 6b 65 64 20 69 73 0a 2a 2a 20 73 75 70 70 6c  cked is.** suppl
12ab0 69 65 64 20 69 74 20 69 73 20 75 73 65 64 20 69  ied it is used i
12ac0 6e 20 70 6c 61 63 65 20 6f 66 20 70 4b 65 79 2c  n place of pKey,
12ad0 6e 4b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nKey..*/.int sql
12ae0 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
12af0 6d 70 61 72 65 28 0a 20 20 56 64 62 65 43 75 72  mpare(.  VdbeCur
12b00 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
12b10 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
12b20 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
12b30 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
12b40 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
12b50 63 6b 65 64 2c 20 20 2f 2a 20 55 6e 70 61 63 6b  cked,  /* Unpack
12b60 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b  ed version of pK
12b70 65 79 20 61 6e 64 20 6e 4b 65 79 20 2a 2f 0a 20  ey and nKey */. 
12b80 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
12b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12ba0 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
12bb0 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
12bc0 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
12bd0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
12be0 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
12bf0 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
12c00 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  sor;.  Mem m;.. 
12c10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
12c20 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
12c30 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65  lKey);.  if( nCe
12c40 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
12c50 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
12c60 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
12c70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12c80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 6d 2e 64  TE_OK;.  }.  m.d
12c90 62 20 3d 20 30 3b 0a 20 20 6d 2e 66 6c 61 67 73  b = 0;.  m.flags
12ca0 20 3d 20 30 3b 0a 20 20 6d 2e 7a 4d 61 6c 6c 6f   = 0;.  m.zMallo
12cb0 63 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  c = 0;.  rc = sq
12cc0 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
12cd0 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f  Btree(pC->pCurso
12ce0 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c 6c  r, 0, (int)nCell
12cf0 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
12d00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
12d10 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
12d20 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 2d  sert( pUnpacked-
12d30 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12d40 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29  D_IGNORE_ROWID )
12d50 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74  ;.  *res = sqlit
12d60 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
12d70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55  are(m.n, m.z, pU
12d80 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69  npacked);.  sqli
12d90 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
12da0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
12db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12dc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12dd0 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20   sets the value 
12de0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
12df0 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  y subsequent cal
12e00 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
12e10 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68  _changes() on th
12e20 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12e30 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64  e 'db'. .*/.void
12e40 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
12e50 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
12e60 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29  db, int nChange)
12e70 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
12e80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
12e90 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  b->mutex) );.  d
12ea0 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68  b->nChange = nCh
12eb0 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74  ange;.  db->nTot
12ec0 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61  alChange += nCha
12ed0 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nge;.}../*.** Se
12ee0 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20  t a flag in the 
12ef0 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74  vdbe to update t
12f00 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
12f10 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e  r when it is fin
12f20 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73  alised.** or res
12f30 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
12f40 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e  te3VdbeCountChan
12f50 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  ges(Vdbe *v){.  
12f60 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d  v->changeCntOn =
12f70 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
12f80 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64  k every prepared
12f90 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63   statement assoc
12fa0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
12fb0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
12fc0 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a  .** as expired..
12fd0 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64  **.** An expired
12fe0 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73   statement means
12ff0 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74   that recompilat
13000 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65  ion of the state
13010 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d  ment is.** recom
13020 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74  mend.  Statement
13030 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68  s expire when th
13040 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74  ings happen that
13050 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70   make their.** p
13060 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65  rograms obsolete
13070 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72  .  Removing user
13080 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
13090 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a  ns or collating.
130a0 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72  ** sequences, or
130b0 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74   changing an aut
130c0 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74  horization funct
130d0 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65  ion are the type
130e0 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74  s of.** things t
130f0 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65  hat make prepare
13100 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73  d statements obs
13110 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olete..*/.void s
13120 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
13130 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73  aredStatements(s
13140 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
13150 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20  dbe *p;.  for(p 
13160 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20  = db->pVdbe; p; 
13170 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
13180 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b   p->expired = 1;
13190 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
131a0 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73  turn the databas
131b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
131c0 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73  h the Vdbe..*/.s
131d0 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56  qlite3 *sqlite3V
131e0 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a  dbeDb(Vdbe *v){.
131f0 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a    return v->db;.
13200 7d 0a                                            }.