/ Hex Artifact Content
Login

Artifact 1a07329bdf51cc3687f88d9f5b2bd3f1d47cc5a8:


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 35 37 20 32  eaux.c,v 1.457 2
02c0: 30 30 39 2f 30 35 2f 30 36 20 31 38 3a 35 37 3a  009/05/06 18:57:
02d0: 31 30 20 73 68 61 6e 65 20 45 78 70 20 24 0a 2a  10 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 26 26 20 69 3c  p->db->nDb && i<
4f90: 73 69 7a 65 6f 66 28 75 33 32 29 2a 38 20 29 3b  sizeof(u32)*8 );
4fa0: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
4fb0: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
4fc0: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 6d 61  eMask)*8 );.  ma
4fd0: 73 6b 20 3d 20 28 28 75 33 32 29 31 29 3c 3c 69  sk = ((u32)1)<<i
4fe0: 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 72 65  ;.  if( (p->btre
4ff0: 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
5000: 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 65 65   ){.    p->btree
5010: 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
5020: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75    sqlite3BtreeMu
5030: 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 28 26  texArrayInsert(&
5040: 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e 64 62  p->aMutex, p->db
5050: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  ->aDb[i].pBt);. 
5060: 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e   }.}...#if defin
5070: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
5080: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
5090: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
50a0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
50b0: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
50c0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
50d0: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
50e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
50f0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
5100: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
5110: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
5120: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
5130: 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 69 63  tr[50];.  static
5140: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5150: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
5160: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
5170: 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a  -4s %.2X %s\n";.
5180: 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20    if( pOut==0 ) 
5190: 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pOut = stdout;. 
51a0: 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34   zP4 = displayP4
51b0: 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65  (pOp, zPtr, size
51c0: 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 70 72  of(zPtr));.  fpr
51d0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d  intf(pOut, zForm
51e0: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20  at1, pc, .      
51f0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
5200: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20  e(pOp->opcode), 
5210: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32  pOp->p1, pOp->p2
5220: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20  , pOp->p3, zP4, 
5230: 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 66 20  pOp->p5,.#ifdef 
5240: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
5250: 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74     pOp->zComment
5260: 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   ? pOp->zComment
5270: 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 20 20   : "".#else.    
5280: 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 29 3b    "".#endif.  );
5290: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b  .  fflush(pOut);
52a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
52b0: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61   Release an arra
52c0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65  y of N Mem eleme
52d0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nts.*/.static vo
52e0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  id releaseMemArr
52f0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e  ay(Mem *p, int N
5300: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20  ){.  if( p && N 
5310: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64  ){.    Mem *pEnd
5320: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  ;.    sqlite3 *d
5330: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75  b = p->db;.    u
5340: 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  8 malloc_failed 
5350: 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
5360: 65 64 3b 0a 20 20 20 20 66 6f 72 28 70 45 6e 64  ed;.    for(pEnd
5370: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
5380: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
5390: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
53a0: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
53b0: 31 5d 2e 64 62 20 29 3b 0a 0a 20 20 20 20 20 20  1].db );..      
53c0: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
53d0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
53e0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
53f0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
5400: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
5410: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
5420: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
5430: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
5440: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
5450: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
5460: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
5470: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
5480: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
5490: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
54a0: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
54b0: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
54c0: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
54d0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
54e0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
54f0: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
5500: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
5510: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
5520: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
5530: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
5540: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
5550: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
5560: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
5570: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
5580: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
5590: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
55a0: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
55b0: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
55c0: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
55d0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
55e0: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
55f0: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
5600: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
5610: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
5620: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
5630: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
5640: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
5650: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
5660: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
5670: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
5680: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
5690: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66  /.      if( p->f
56a0: 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45  lags&(MEM_Agg|ME
56b0: 4d 5f 44 79 6e 29 20 29 7b 0a 20 20 20 20 20 20  M_Dyn) ){.      
56c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
56d0: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
56e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a    }else if( p->z
56f0: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
5700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5710: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
5720: 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c  .        p->zMal
5730: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
5740: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
5750: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
5760: 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f   }.    db->mallo
5770: 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
5780: 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a  _failed;.  }.}..
5790: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
57a0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
57b0: 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74  GEMENT.int sqlit
57c0: 65 33 56 64 62 65 52 65 6c 65 61 73 65 42 75 66  e3VdbeReleaseBuf
57d0: 66 65 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  fers(Vdbe *p){. 
57e0: 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 6e   int ii;.  int n
57f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Free = 0;.  asse
5800: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5810: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
5820: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 69  tex) );.  for(ii
5830: 3d 31 3b 20 69 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b  =1; ii<=p->nMem;
5840: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 20   ii++){.    Mem 
5850: 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d  *pMem = &p->aMem
5860: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4d  [ii];.    if( pM
5870: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
5880: 52 6f 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20  RowSet ){.      
5890: 73 71 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65  sqlite3RowSetCle
58a0: 61 72 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53  ar(pMem->u.pRowS
58b0: 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
58c0: 66 28 20 70 4d 65 6d 2d 3e 7a 20 26 26 20 70 4d  f( pMem->z && pM
58d0: 65 6d 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 44 79  em->flags&MEM_Dy
58e0: 6e 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  n ){.      asser
58f0: 74 28 20 21 70 4d 65 6d 2d 3e 78 44 65 6c 20 29  t( !pMem->xDel )
5900: 3b 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d  ;.      nFree +=
5910: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
5920: 53 69 7a 65 28 70 4d 65 6d 2d 3e 64 62 2c 20 70  Size(pMem->db, p
5930: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 73  Mem->z);.      s
5940: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
5950: 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20  ease(pMem);.    
5960: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
5970: 46 72 65 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Free;.}.#endif..
5980: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5990: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
59a0: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
59b0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
59c0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
59d0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
59e0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
59f0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
5a00: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
5a10: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
5a20: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
5a30: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
5a40: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
5a50: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
5a60: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
5a70: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
5a80: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
5a90: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
5aa0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
5ab0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
5ac0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
5ad0: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
5ae0: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
5af0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
5b00: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
5b10: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
5b20: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
5b30: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
5b40: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
5b50: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
5b60: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
5b70: 4c 41 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  LAN..*/.int sqli
5b80: 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56  te3VdbeList(.  V
5b90: 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20  dbe *p          
5ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5bb0: 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  VDBE */.){.  sql
5bc0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
5bd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
5be0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
5bf0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
5c00: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
5c10: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 0a 20 20 61  p->aMem[1];..  a
5c20: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
5c30: 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  n );.  if( p->ma
5c40: 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
5c50: 52 55 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  RUN ) return SQL
5c60: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 61 73  ITE_MISUSE;.  as
5c70: 73 65 72 74 28 20 64 62 2d 3e 6d 61 67 69 63 3d  sert( db->magic=
5c80: 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55  =SQLITE_MAGIC_BU
5c90: 53 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  SY );.  assert( 
5ca0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
5cb0: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
5cc0: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
5cd0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
5ce0: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
5cf0: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
5d00: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
5d10: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
5d20: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
5d30: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
5d40: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
5d50: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
5d60: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
5d70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
5d80: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
5d90: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
5da0: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
5db0: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
5dc0: 72 61 79 28 70 4d 65 6d 2c 20 70 2d 3e 6e 4d 65  ray(pMem, p->nMe
5dd0: 6d 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63  m);..  if( p->rc
5de0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
5df0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
5e00: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
5e10: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
5e20: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
5e30: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
5e40: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
5e50: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
5e60: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
5e70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
5e80: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
5e90: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5ea0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
5eb0: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
5ec0: 28 20 69 3c 70 2d 3e 6e 4f 70 20 26 26 20 70 2d  ( i<p->nOp && p-
5ed0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
5ee0: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
5ef0: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
5f00: 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29   if( i>=p->nOp )
5f10: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
5f20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
5f30: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
5f40: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
5f50: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
5f60: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
5f70: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
5f80: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
5f90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
5fa0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
5fb0: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
5fc0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
5fd0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
5fe0: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  se{.    char *z;
5ff0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 20 3d 20 26  .    Op *pOp = &
6000: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 69  p->aOp[i];.    i
6010: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
6020: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
6030: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
6040: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70  .      pMem->typ
6050: 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  e = SQLITE_INTEG
6060: 45 52 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ER;.      pMem->
6070: 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20  u.i = i;        
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72          /* Progr
60a0: 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  am counter */.  
60b0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20      pMem++;.  . 
60c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
60d0: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45   = MEM_Static|ME
60e0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
60f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20        pMem->z = 
6100: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70  (char*)sqlite3Op
6110: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
6120: 63 6f 64 65 29 3b 20 20 2f 2a 20 4f 70 63 6f 64  code);  /* Opcod
6130: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
6140: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
6150: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
6160: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6170: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
6180: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6190: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20  LITE_TEXT;.     
61a0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
61b0: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
61c0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  pMem++;.    }.. 
61d0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
61e0: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
61f0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
6200: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
6210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6220: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74  1 */.    pMem->t
6230: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  ype = SQLITE_INT
6240: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  EGER;.    pMem++
6250: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
6260: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
6270: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
6280: 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20  p->p2;          
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P2 */.    pMe
62b0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45  m->type = SQLITE
62c0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d  _INTEGER;.    pM
62d0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70  em++;..    if( p
62e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
62f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
6300: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
6310: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
6320: 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20  Op->p3;         
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20   /* P3 */.      
6350: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6360: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  ITE_INTEGER;.   
6370: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 7d     pMem++;.    }
6380: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
6390: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
63a0: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
63b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
63c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
63d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
63e0: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
63f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6400: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
6410: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e  >flags = MEM_Dyn
6420: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
6430: 6d 3b 0a 20 20 20 20 7a 20 3d 20 64 69 73 70 6c  m;.    z = displ
6440: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
6450: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
6460: 7a 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20  z!=pMem->z ){.  
6470: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
6480: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a  emSetStr(pMem, z
6490: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
64a0: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  8, 0);.    }else
64b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
64c0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  pMem->z!=0 );.  
64d0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71      pMem->n = sq
64e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d  lite3Strlen30(pM
64f0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d  em->z);.      pM
6500: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
6510: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20  _UTF8;.    }.   
6520: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51   pMem->type = SQ
6530: 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70  LITE_TEXT;.    p
6540: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
6550: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
6560: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
6570: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
6580: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
6590: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
65a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
65b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
65c0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
65d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
65e0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
65f0: 5f 44 79 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  _Dyn|MEM_Str|MEM
6600: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
6610: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
6620: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6630: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
6640: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
6650: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
6660: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c  pMem->type = SQL
6670: 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  ITE_TEXT;.      
6680: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
6690: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
66a0: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
66b0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
66c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f      if( pOp->zCo
66d0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  mment ){.       
66e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
66f0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
6700: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  .        pMem->z
6710: 20 3d 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74   = pOp->zComment
6720: 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  ;.        pMem->
6730: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6740: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
6750: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
6760: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
6770: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70         pMem->typ
6780: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b  e = SQLITE_TEXT;
6790: 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
67a0: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
67b0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
67c0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
67d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67e0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
67f0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79          pMem->ty
6800: 70 65 20 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  pe = SQLITE_NULL
6810: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6820: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
6830: 6d 6e 20 3d 20 38 20 2d 20 35 2a 28 70 2d 3e 65  mn = 8 - 5*(p->e
6840: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
6850: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
6860: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
6870: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
6880: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
6890: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
68a0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
68b0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
68c0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
68d0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
68e0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
68f0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
6900: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6910: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
6920: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
6930: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
6940: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70   *pOp;.  if( nOp
6950: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
6960: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
6970: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
6980: 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 26 26 20  de==OP_Trace && 
6990: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
69a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
69b0: 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  z = pOp->p4.z;. 
69c0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
69d0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
69e0: 2b 2b 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22  ++;.    printf("
69f0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
6a00: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
6a10: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6a20: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
6a30: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
6a40: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
6a50: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
6a60: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
6a70: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
6a80: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
6a90: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
6aa0: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
6ab0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
6ac0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
6ad0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
6ae0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
6af0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
6b00: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
6b10: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
6b20: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
6b30: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d  OP_Trace && pOp-
6b40: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
6b50: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
6b60: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
6b70: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6b80: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
6b90: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
6ba0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
6bb0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
6bc0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
6bd0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
6be0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
6bf0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
6c00: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
6c10: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
6c20: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
6c30: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
6c40: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
6c50: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
6c60: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
6c70: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
6c80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
6c90: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
6ca0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
6cb0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
6cc0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
6cd0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
6ce0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
6cf0: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
6d00: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
6d10: 66 65 72 2e 20 20 4d 61 6b 65 20 2a 70 70 20 70  fer.  Make *pp p
6d20: 6f 69 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 61  oint to the.** a
6d30: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
6d40: 20 28 4e 6f 74 65 3a 20 20 70 70 20 69 73 20 61   (Note:  pp is a
6d50: 20 63 68 61 72 2a 20 72 61 74 68 65 72 20 74 68   char* rather th
6d60: 61 6e 20 61 20 76 6f 69 64 2a 2a 20 74 6f 0a 2a  an a void** to.*
6d70: 2a 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  * work around th
6d80: 65 20 70 6f 69 6e 74 65 72 20 61 6c 69 61 73 69  e pointer aliasi
6d90: 6e 67 20 72 75 6c 65 73 20 6f 66 20 43 2e 29 20  ng rules of C.) 
6da0: 20 2a 70 70 20 73 68 6f 75 6c 64 20 69 6e 69 74   *pp should init
6db0: 69 61 6c 6c 79 0a 2a 2a 20 62 65 20 7a 65 72 6f  ially.** be zero
6dc0: 2e 20 20 49 66 20 2a 70 70 20 69 73 20 6e 6f 74  .  If *pp is not
6dd0: 20 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61 6e   zero, that mean
6de0: 73 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65  s that the space
6df0: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
6e00: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
6e10: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
6e20: 69 73 20 61 20 6e 6f 6f 70 2e 0a 2a 2a 0a 2a 2a  is a noop..**.**
6e30: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
6e40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6e50: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
6e60: 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f 69  *.** *ppFrom poi
6e70: 6e 74 20 74 6f 20 61 76 61 69 6c 61 62 6c 65 20  nt to available 
6e80: 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64 20 70  space and pEnd p
6e90: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 6e 64  oints to the end
6ea0: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c   of the.** avail
6eb0: 61 62 6c 65 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a  able space..**.*
6ec0: 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63  * *pnByte is a c
6ed0: 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75  ounter of the nu
6ee0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
6ef0: 20 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65   space that have
6f00: 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c   failed.** to al
6f10: 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72  locate.  If ther
6f20: 65 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e  e is insufficien
6f30: 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72  t space in *ppFr
6f40: 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  om to satisfy th
6f50: 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68  e.** request, th
6f60: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e  en increment *pn
6f70: 42 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75  Byte by the amou
6f80: 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  nt of the reques
6f90: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
6fa0: 64 20 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20  d allocSpace(.  
6fb0: 63 68 61 72 20 2a 70 70 2c 20 20 20 20 20 20 20  char *pp,       
6fc0: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
6fd0: 53 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  Set *pp to point
6fe0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 62 75   to allocated bu
6ff0: 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
7000: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
7010: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
7020: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
7030: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
7040: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
7050: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
7060: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
7070: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
7080: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7090: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
70a0: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
70b0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
70c0: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
70d0: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
70e0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
70f0: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
7100: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
7110: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7120: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
7130: 29 20 29 3b 0a 20 20 69 66 28 20 28 2a 28 76 6f  ) );.  if( (*(vo
7140: 69 64 2a 2a 29 70 70 29 3d 3d 30 20 29 7b 0a 20  id**)pp)==0 ){. 
7150: 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44     nByte = ROUND
7160: 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  8(nByte);.    if
7170: 28 20 28 70 45 6e 64 20 2d 20 2a 70 70 46 72 6f  ( (pEnd - *ppFro
7180: 6d 29 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20  m)>=nByte ){.   
7190: 20 20 20 2a 28 76 6f 69 64 2a 2a 29 70 70 20 3d     *(void**)pp =
71a0: 20 28 76 6f 69 64 20 2a 29 2a 70 70 46 72 6f 6d   (void *)*ppFrom
71b0: 3b 0a 20 20 20 20 20 20 2a 70 70 46 72 6f 6d 20  ;.      *ppFrom 
71c0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 65  += nByte;.    }e
71d0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 42 79  lse{.      *pnBy
71e0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  te += nByte;.   
71f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7200: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
7210: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
7220: 65 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  ecution.  This i
7230: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
7240: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
7250: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
7260: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
7270: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
7280: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
7290: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
72a0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
72b0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
72c0: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
72d0: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
72e0: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
72f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 6e  * This is the on
7300: 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 61  ly way to move a
7310: 20 56 44 42 45 20 66 72 6f 6d 20 56 44 42 45 5f   VDBE from VDBE_
7320: 4d 41 47 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a  MAGIC_INIT to.**
7330: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e   VDBE_MAGIC_RUN.
7340: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
7350: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c  tion may be call
7360: 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ed more than onc
7370: 65 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 76 69  e on a single vi
7380: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
7390: 2a 20 54 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * The first call
73a0: 20 69 73 20 6d 61 64 65 20 77 68 69 6c 65 20 63   is made while c
73b0: 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20 53 51 4c  ompiling the SQL
73c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 53 75 62 73   statement. Subs
73d0: 65 71 75 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20  equent.** calls 
73e0: 61 72 65 20 6d 61 64 65 20 61 73 20 70 61 72 74  are made as part
73f0: 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   of the process 
7400: 6f 66 20 72 65 73 65 74 74 69 6e 67 20 61 20 73  of resetting a s
7410: 74 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a  tatement to be.*
7420: 2a 20 72 65 2d 65 78 65 63 75 74 65 64 20 28 66  * re-executed (f
7430: 72 6f 6d 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  rom a call to sq
7440: 6c 69 74 65 33 5f 72 65 73 65 74 28 29 29 2e 20  lite3_reset()). 
7450: 54 68 65 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20  The nVar, nMem, 
7460: 6e 43 75 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20  nCursor .** and 
7470: 69 73 45 78 70 6c 61 69 6e 20 70 61 72 61 6d 65  isExplain parame
7480: 74 65 72 73 20 61 72 65 20 6f 6e 6c 79 20 70 61  ters are only pa
7490: 73 73 65 64 20 63 6f 72 72 65 63 74 20 76 61 6c  ssed correct val
74a0: 75 65 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ues the first ti
74b0: 6d 65 0a 2a 2a 20 74 68 65 20 66 75 6e 63 74 69  me.** the functi
74c0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e  on is called. On
74d0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
74e0: 73 2c 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  s, from sqlite3_
74f0: 72 65 73 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a  reset(), nVar.**
7500: 20 69 73 20 70 61 73 73 65 64 20 2d 31 20 61 6e   is passed -1 an
7510: 64 20 6e 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20  d nMem, nCursor 
7520: 61 6e 64 20 69 73 45 78 70 6c 61 69 6e 20 61 72  and isExplain ar
7530: 65 20 61 6c 6c 20 70 61 73 73 65 64 20 7a 65 72  e all passed zer
7540: 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  o..*/.void sqlit
7550: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
7560: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
7590: 0a 20 20 69 6e 74 20 6e 56 61 72 2c 20 20 20 20  .  int nVar,    
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27    /* Number of '
75c0: 3f 27 20 73 65 65 20 69 6e 20 74 68 65 20 53 51  ?' see in the SQ
75d0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
75e0: 20 69 6e 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20   int nMem,      
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7600: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d  /* Number of mem
7610: 6f 72 79 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c  ory cells to all
7620: 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocate */.  int n
7630: 43 75 72 73 6f 72 2c 20 20 20 20 20 20 20 20 20  Cursor,         
7640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7650: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 74  ber of cursors t
7660: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
7670: 69 6e 74 20 69 73 45 78 70 6c 61 69 6e 20 20 20  int isExplain   
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7690: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 45 58  * True if the EX
76a0: 50 4c 41 49 4e 20 6b 65 79 77 6f 72 64 73 20 69  PLAIN keywords i
76b0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 29 7b 0a  s present */.){.
76c0: 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
76d0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
76e0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
76f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7700: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
7710: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
7720: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
7730: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
7740: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
7750: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
7760: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
7770: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
7780: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
7790: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
77a0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
77b0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
77c0: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
77d0: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
77e0: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
77f0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
7800: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
7810: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
7820: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
7830: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
7840: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
7850: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
7860: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
7870: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
7880: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
7890: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72  VdbeCursor/BtCur
78a0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
78b0: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
78c0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
78d0: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
78e0: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
78f0: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
7900: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
7910: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
7920: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
7930: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
7940: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
7950: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
7960: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
7970: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
7980: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
7990: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
79a0: 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
79b0: 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c  y registers, SQL
79c0: 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45   variables, VDBE
79d0: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20   cursors and .  
79e0: 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d  ** an array to m
79f0: 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74  arshal SQL funct
7a00: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  ion arguments in
7a10: 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64  . This is only d
7a20: 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 72  one the.  ** fir
7a30: 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 75 6e  st time this fun
7a40: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
7a50: 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 42 45  for a given VDBE
7a60: 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 69 73  , not when it is
7a70: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 6c 6c  .  ** being call
7a80: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
7a90: 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 65 74  reset() to reset
7aa0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
7ab0: 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  hine..  */.  if(
7ac0: 20 6e 56 61 72 3e 3d 30 20 26 26 20 21 64 62 2d   nVar>=0 && !db-
7ad0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7ae0: 0a 20 20 20 20 75 38 20 2a 7a 43 73 72 20 3d 20  .    u8 *zCsr = 
7af0: 28 75 38 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d  (u8 *)&p->aOp[p-
7b00: 3e 6e 4f 70 5d 3b 0a 20 20 20 20 75 38 20 2a 7a  >nOp];.    u8 *z
7b10: 45 6e 64 20 3d 20 28 75 38 20 2a 29 26 70 2d 3e  End = (u8 *)&p->
7b20: 61 4f 70 5b 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d  aOp[p->nOpAlloc]
7b30: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  ;.    int nByte;
7b40: 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  .    int nArg;  
7b50: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
7b60: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 70  number of args p
7b70: 61 73 73 65 64 20 74 6f 20 61 20 75 73 65 72 20  assed to a user 
7b80: 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
7b90: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
7ba0: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 20  (p, &nArg);.    
7bb0: 69 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26  if( isExplain &&
7bc0: 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20   nMem<10 ){.    
7bd0: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20    nMem = 10;.   
7be0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28   }.    zCsr += (
7bf0: 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37  zCsr - (u8*)0)&7
7c00: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49  ;.    assert( EI
7c10: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
7c20: 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 20 20  NT(zCsr) );.    
7c30: 69 66 28 20 7a 45 6e 64 3c 7a 43 73 72 20 29 20  if( zEnd<zCsr ) 
7c40: 7a 45 6e 64 20 3d 20 7a 43 73 72 3b 0a 0a 20 20  zEnd = zCsr;..  
7c50: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6d 65 6d    do {.      mem
7c60: 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e  set(zCsr, 0, zEn
7c70: 64 2d 7a 43 73 72 29 3b 0a 20 20 20 20 20 20 6e  d-zCsr);.      n
7c80: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Byte = 0;.      
7c90: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
7ca0: 2a 29 26 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  *)&p->aMem, nMem
7cb0: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
7cc0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
7cd0: 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 53  e);.      allocS
7ce0: 70 61 63 65 28 28 63 68 61 72 2a 29 26 70 2d 3e  pace((char*)&p->
7cf0: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
7d00: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
7d10: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
7d20: 20 20 20 20 61 6c 6c 6f 63 53 70 61 63 65 28 28      allocSpace((
7d30: 63 68 61 72 2a 29 26 70 2d 3e 61 70 41 72 67 2c  char*)&p->apArg,
7d40: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
7d50: 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  *), &zCsr, zEnd,
7d60: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20   &nByte);.      
7d70: 61 6c 6c 6f 63 53 70 61 63 65 28 28 63 68 61 72  allocSpace((char
7d80: 2a 29 26 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61  *)&p->azVar, nVa
7d90: 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c  r*sizeof(char*),
7da0: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
7db0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 61 6c 6c  Byte);.      all
7dc0: 6f 63 53 70 61 63 65 28 28 63 68 61 72 2a 29 26  ocSpace((char*)&
7dd0: 70 2d 3e 61 70 43 73 72 2c 20 0a 20 20 20 20 20  p->apCsr, .     
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 75 72              nCur
7df0: 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43  sor*sizeof(VdbeC
7e00: 75 72 73 6f 72 2a 29 2c 20 26 7a 43 73 72 2c 20  ursor*), &zCsr, 
7e10: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 0a 20 20 20  zEnd, &nByte.   
7e20: 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20     );.      if( 
7e30: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20  nByte ){.       
7e40: 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69   p->pFree = sqli
7e50: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
7e60: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  b, nByte);.     
7e70: 20 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20   }.      zCsr = 
7e80: 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20  p->pFree;.      
7e90: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
7ea0: 74 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  te];.    }while(
7eb0: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
7ec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
7ed0: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d      p->nCursor =
7ee0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66   nCursor;.    if
7ef0: 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20  ( p->aVar ){.   
7f00: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e 56 61     p->nVar = nVa
7f10: 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30  r;.      for(n=0
7f20: 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a  ; n<nVar; n++){.
7f30: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b          p->aVar[
7f40: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  n].flags = MEM_N
7f50: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ull;.        p->
7f60: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
7f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7f80: 20 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29     if( p->aMem )
7f90: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 2d  {.      p->aMem-
7fa0: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
7fb0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
7fc0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
7fd0: 4d 65 6d 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e  Mem */.      p->
7fe0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8000: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
8010: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
8020: 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d    for(n=1; n<=nM
8030: 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  em; n++){.      
8040: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
8050: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
8060: 20 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e         p->aMem[n
8070: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 20  ].db = db;.     
8080: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
8090: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
80a0: 0a 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 70 2d  .  for(n=1; n<p-
80b0: 3e 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20  >nMem; n++){.   
80c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
80d0: 5b 6e 5d 2e 64 62 3d 3d 64 62 20 29 3b 0a 20 20  [n].db==db );.  
80e0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 2d 3e 70  }.#endif..  p->p
80f0: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
8100: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
8110: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
8120: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 65  OE_Abort;.  p->e
8130: 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 70 6c  xplain |= isExpl
8140: 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ain;.  p->magic 
8150: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
8160: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
8170: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
8180: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
8190: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
81a0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
81b0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  ement = 0;.#ifde
81c0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
81d0: 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20   {.    int i;.  
81e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
81f0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
8200: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
8210: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4f 70   0;.      p->aOp
8220: 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  [i].cycles = 0;.
8230: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
8250: 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e  a VDBE cursor an
8260: 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  d release all th
8270: 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74  e resources that
8280: 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70   cursor .** happ
8290: 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a  ens to hold..*/.
82a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
82b0: 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20  FreeCursor(Vdbe 
82c0: 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a  *p, VdbeCursor *
82d0: 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d  pCx){.  if( pCx=
82e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
82f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d  ;.  }.  if( pCx-
8300: 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  >pBt ){.    sqli
8310: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43  te3BtreeClose(pC
8320: 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20  x->pBt);.    /* 
8330: 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  The pCx->pCursor
8340: 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61   will be close a
8350: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66  utomatically, if
8360: 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20   it exists, by. 
8370: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
8380: 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65  bove. */.  }else
8390: 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f   if( pCx->pCurso
83a0: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
83b0: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
83c0: 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a  (pCx->pCursor);.
83d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
83e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
83f0: 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e  ABLE.  if( pCx->
8400: 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20  pVtabCursor ){. 
8410: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f     sqlite3_vtab_
8420: 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72  cursor *pVtabCur
8430: 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62  sor = pCx->pVtab
8440: 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73  Cursor;.    cons
8450: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
8460: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d   *pModule = pCx-
8470: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d  >pModule;.    p-
8480: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
8490: 31 3b 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c  1;.    (void)sql
84a0: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 70 2d  ite3SafetyOff(p-
84b0: 3e 64 62 29 3b 0a 20 20 20 20 70 4d 6f 64 75 6c  >db);.    pModul
84c0: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43  e->xClose(pVtabC
84d0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 28 76 6f 69  ursor);.    (voi
84e0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
84f0: 6e 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d  n(p->db);.    p-
8500: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20  >inVtabMethod = 
8510: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
8520: 69 66 28 20 21 70 43 78 2d 3e 65 70 68 65 6d 50  if( !pCx->ephemP
8530: 73 65 75 64 6f 54 61 62 6c 65 20 29 7b 0a 20 20  seudoTable ){.  
8540: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8550: 70 2d 3e 64 62 2c 20 70 43 78 2d 3e 70 44 61 74  p->db, pCx->pDat
8560: 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
8570: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
8580: 72 73 20 65 78 63 65 70 74 20 66 6f 72 20 56 54  rs except for VT
8590: 61 62 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  ab cursors that 
85a0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  are currently.**
85b0: 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
85c0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
85d0: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
85e0: 69 76 65 56 74 61 62 73 28 56 64 62 65 20 2a 70  iveVtabs(Vdbe *p
85f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
8600: 28 20 70 2d 3e 61 70 43 73 72 3d 3d 30 20 29 20  ( p->apCsr==0 ) 
8610: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
8620: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
8630: 20 69 2b 2b 29 7b 0a 20 20 20 20 56 64 62 65 43   i++){.    VdbeC
8640: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61  ursor *pC = p->a
8650: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 69 66 28  pCsr[i];.    if(
8660: 20 70 43 20 26 26 20 28 21 70 2d 3e 69 6e 56 74   pC && (!p->inVt
8670: 61 62 4d 65 74 68 6f 64 20 7c 7c 20 21 70 43 2d  abMethod || !pC-
8680: 3e 70 56 74 61 62 43 75 72 73 6f 72 29 20 29 7b  >pVtabCursor) ){
8690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
86a0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
86b0: 70 43 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70  pC);.      p->ap
86c0: 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Csr[i] = 0;.    
86d0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
86e0: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
86f0: 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a  fter execution..
8700: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8710: 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  ne will automati
8720: 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20  cally close any 
8730: 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20  cursors, lists, 
8740: 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72  and/or.** sorter
8750: 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74  s that were left
8760: 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20   open.  It also 
8770: 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75  deletes the valu
8780: 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c  es of.** variabl
8790: 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d  es in the aVar[]
87a0: 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
87b0: 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56  c void Cleanup(V
87c0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
87d0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
87e0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 4d 65 6d 20 2a  = p->db;.  Mem *
87f0: 70 4d 65 6d 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c  pMem;.  closeAll
8800: 43 75 72 73 6f 72 73 45 78 63 65 70 74 41 63 74  CursorsExceptAct
8810: 69 76 65 56 74 61 62 73 28 70 29 3b 0a 20 20 66  iveVtabs(p);.  f
8820: 6f 72 28 70 4d 65 6d 3d 26 70 2d 3e 61 4d 65 6d  or(pMem=&p->aMem
8830: 5b 31 5d 2c 20 69 3d 31 3b 20 69 3c 3d 70 2d 3e  [1], i=1; i<=p->
8840: 6e 4d 65 6d 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b  nMem; i++, pMem+
8850: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d  +){.    if( pMem
8860: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f  ->flags & MEM_Ro
8870: 77 53 65 74 20 29 7b 0a 20 20 20 20 20 20 73 71  wSet ){.      sq
8880: 6c 69 74 65 33 52 6f 77 53 65 74 43 6c 65 61 72  lite3RowSetClear
8890: 28 70 4d 65 6d 2d 3e 75 2e 70 52 6f 77 53 65 74  (pMem->u.pRowSet
88a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4d 65 6d  );.    }.    Mem
88b0: 53 65 74 54 79 70 65 46 6c 61 67 28 70 4d 65 6d  SetTypeFlag(pMem
88c0: 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  , MEM_Null);.  }
88d0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
88e0: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20  ay(&p->aMem[1], 
88f0: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 69 66 28 20  p->nMem);.  if( 
8900: 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b 20  p->contextStack 
8910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
8920: 46 72 65 65 28 64 62 2c 20 70 2d 3e 63 6f 6e 74  Free(db, p->cont
8930: 65 78 74 53 74 61 63 6b 29 3b 0a 20 20 7d 0a 20  extStack);.  }. 
8940: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b   p->contextStack
8950: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65   = 0;.  p->conte
8960: 78 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 30  xtStackDepth = 0
8970: 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74  ;.  p->contextSt
8980: 61 63 6b 54 6f 70 20 3d 20 30 3b 0a 20 20 73 71  ackTop = 0;.  sq
8990: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
89a0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
89b0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
89c0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
89d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
89e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
89f0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
8a00: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
8a10: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
8a20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
8a30: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
8a40: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
8a50: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
8a60: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
8a70: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
8a80: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
8a90: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
8aa0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
8ab0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
8ac0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
8ad0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
8ae0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
8af0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
8b00: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
8b10: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
8b20: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
8b30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8b40: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
8b50: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
8b60: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
8b70: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
8b80: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8b90: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
8ba0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
8bb0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
8bc0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
8bd0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70   nResColumn;.  p
8be0: 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f  ->aColName = pCo
8bf0: 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71  lName = (Mem*)sq
8c00: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
8c10: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  o(db, sizeof(Mem
8c20: 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  )*n );.  if( p->
8c30: 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65  aColName==0 ) re
8c40: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e  turn;.  while( n
8c50: 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43  -- > 0 ){.    pC
8c60: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20  olName->flags = 
8c70: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43  MEM_Null;.    pC
8c80: 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e  olName->db = p->
8c90: 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  db;.    pColName
8ca0: 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ++;.  }.}../*.**
8cb0: 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   Set the name of
8cc0: 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75   the idx'th colu
8cd0: 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  mn to be returne
8ce0: 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61  d by the SQL sta
8cf0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65  tement..** zName
8d00: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
8d10: 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d  er to a nul term
8d20: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a  inated string..*
8d30: 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d  *.** This call m
8d40: 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65  ust be made afte
8d50: 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
8d60: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
8d70: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  s()..**.** The f
8d80: 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20  inal parameter, 
8d90: 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e  xDel, must be on
8da0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41  e of SQLITE_DYNA
8db0: 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  MIC, SQLITE_STAT
8dc0: 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  IC.** or SQLITE_
8dd0: 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74  TRANSIENT. If it
8de0: 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   is SQLITE_DYNAM
8df0: 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66  IC, then the buf
8e00: 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74  fer pointed.** t
8e10: 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20  o by zName will 
8e20: 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69  be freed by sqli
8e30: 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e  te3DbFree() when
8e40: 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73   the vdbe is des
8e50: 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  troyed..*/.int s
8e60: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
8e70: 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c  Name(.  Vdbe *p,
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65           /* Vdbe
8ea0: 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65   being configure
8eb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20  d */.  int idx, 
8ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ed0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
8ee0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65   of column zName
8ef0: 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20   applies to */. 
8f00: 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20   int var,       
8f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f20: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
8f30: 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61  COLNAME_* consta
8f40: 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  nts */.  const c
8f50: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
8f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8f70: 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63  nter to buffer c
8f80: 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a  ontaining name *
8f90: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  /.  void (*xDel)
8fa0: 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20  (void*)         
8fb0: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d       /* Memory m
8fc0: 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65  anagement strate
8fd0: 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a  gy for zName */.
8fe0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
8ff0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
9000: 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e  assert( idx<p->n
9010: 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61  ResColumn );.  a
9020: 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41  ssert( var<COLNA
9030: 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d  ME_N );.  if( p-
9040: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
9050: 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
9060: 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21   !zName || xDel!
9070: 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20  =SQLITE_DYNAMIC 
9080: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
9090: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
90a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
90b0: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
90c0: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
90d0: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
90e0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
90f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
9100: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
9110: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
9120: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
9130: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
9140: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
9150: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
9160: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
9170: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
9180: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
9190: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
91a0: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
91b0: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
91c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
91d0: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
91e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
91f0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
9200: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
9210: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
9220: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
9230: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
9240: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
9250: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
9260: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
9270: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
9280: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
9290: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
92a0: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
92b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
92c0: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
92d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
92e0: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
92f0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
9300: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  action */.  int 
9310: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9320: 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69    int needXcommi
9330: 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 42 65 66  t = 0;..  /* Bef
9340: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
9350: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
9360: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
9370: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
9380: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
9390: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
93a0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
93b0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
93c0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
93d0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
93e0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
93f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
9400: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
9410: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
9420: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
9430: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
9440: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
9450: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
9470: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d  VtabSync(db, &p-
9480: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  >zErrMsg);.  if(
9490: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
94a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
94b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
94c0: 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
94d0: 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
94e0: 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
94f0: 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
9500: 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
9510: 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
9520: 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
9530: 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
9540: 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
9550: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
9560: 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
9570: 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
9580: 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
9590: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
95a0: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
95b0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
95c0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
95d0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
95e0: 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
95f0: 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
9600: 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  / .  for(i=0; i<
9610: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
9620: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
9630: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
9640: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9650: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
9660: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
9670: 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
9680: 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
9690: 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Trans++;.    }. 
96a0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
96b0: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
96c0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
96d0: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
96e0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
96f0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
9700: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
9710: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 61  allback ){.    a
9720: 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61 67  ssert( (db->flag
9730: 73 20 26 20 53 51 4c 49 54 45 5f 43 6f 6d 6d 69  s & SQLITE_Commi
9740: 74 42 75 73 79 29 3d 3d 30 20 29 3b 0a 20 20 20  tBusy)==0 );.   
9750: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
9760: 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73 79 3b  LITE_CommitBusy;
9770: 0a 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74  .    (void)sqlit
9780: 65 33 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b  e3SafetyOff(db);
9790: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
97a0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
97b0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
97c0: 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
97d0: 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20  SafetyOn(db);.  
97e0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
97f0: 53 51 4c 49 54 45 5f 43 6f 6d 6d 69 74 42 75 73  SQLITE_CommitBus
9800: 79 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  y;.    if( rc ){
9810: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9820: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
9830: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9840: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
9850: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
9860: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
9870: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
9880: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
9890: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
98a0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
98b0: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
98c0: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
98d0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
98e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
98f0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
9900: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
9910: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
9920: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
9930: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
9940: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
9950: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
9960: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
9970: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
9980: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
9990: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
99a0: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
99b0: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
99c0: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
99d0: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
99e0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
99f0: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
9a00: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
9a10: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
9a20: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
9a30: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
9a40: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
9a50: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
9a60: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
9a70: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
9a80: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
9a90: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
9aa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
9ab0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
9ac0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
9ad0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9ae0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
9af0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
9b00: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
9b10: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
9b20: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
9b30: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
9b40: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
9b50: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
9b60: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
9b70: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
9b80: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
9b90: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
9ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
9bb0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
9bc0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
9bd0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
9be0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
9bf0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
9c00: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
9c10: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
9c20: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
9c30: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9c40: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
9c50: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9c60: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
9c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
9c80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
9c90: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 29  mitPhaseTwo(pBt)
9ca0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9cb0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
9cc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
9cd0: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
9ce0: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
9cf0: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
9d00: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
9d10: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
9d20: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
9d30: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
9d40: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
9d50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9d60: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
9d70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
9d80: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
9d90: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
9da0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9db0: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
9dc0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
9dd0: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
9de0: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
9df0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
9e00: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
9e10: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
9e20: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
9e30: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
9e40: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
9e50: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
9e60: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
9e70: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
9e80: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
9e90: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
9ea0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
9eb0: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20      int res;..  
9ec0: 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61    /* Select a ma
9ed0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9ee0: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f  e name */.    do
9ef0: 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61   {.      u32 iRa
9f00: 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69  ndom;.      sqli
9f10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
9f20: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
9f30: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
9f40: 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29  (sizeof(iRandom)
9f50: 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20  , &iRandom);.   
9f60: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
9f70: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
9f80: 22 25 73 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61  "%s-mj%08X", zMa
9f90: 69 6e 46 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26  inFile, iRandom&
9fa0: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 20  0x7fffffff);.   
9fb0: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9fd0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
9ff0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
a000: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
a010: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
a020: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
a030: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
a040: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20  QLITE_OK && res 
a050: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
a060: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a070: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61    /* Open the ma
a080: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f  ster journal. */
a090: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a0a0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28  te3OsOpenMalloc(
a0b0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26  pVfs, zMaster, &
a0c0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20  pMaster, .      
a0d0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
a0e0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
a0f0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20  _OPEN_CREATE|.  
a100: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
a110: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
a120: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
a130: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20  _JOURNAL, 0.    
a140: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69    );.    }.    i
a150: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a160: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a170: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
a180: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
a190: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20  rn rc;.    }. . 
a1a0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
a1b0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74  name of each dat
a1c0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
a1d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  e transaction in
a1e0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a  to the new.    *
a1f0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
a200: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72   file. If an err
a210: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  or occurs at thi
a220: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20  s point close.  
a230: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20    ** and delete 
a240: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a250: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65  al file. All the
a260: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
a270: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a  nal files.    **
a280: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c   still have 'nul
a290: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72  l' as the master
a2a0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
a2b0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72  , so they will r
a2c0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20  oll.    ** back 
a2d0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66  independently if
a2e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
a2f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  s..    */.    fo
a300: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
a310: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
a320: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
a330: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
a340: 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74   if( i==1 ) cont
a350: 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72  inue;   /* Ignor
a360: 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
a370: 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ase */.      if(
a380: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a390: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
a3a0: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
a3b0: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
a3c0: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
a3d0: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
a3e0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
a3f0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ==0 ) continue; 
a400: 20 2f 2a 20 49 67 6e 6f 72 65 20 3a 6d 65 6d 6f   /* Ignore :memo
a410: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ry: databases */
a420: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
a430: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
a440: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
a450: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
a460: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
a470: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
a480: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
a490: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
a4a0: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
a4b0: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
a4c0: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
a4d0: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
a4e0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
a4f0: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
a500: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a510: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
a520: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
a530: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
a540: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
a550: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
a560: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
a570: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
a580: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
a590: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a5a0: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
a5b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a5c0: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
a5d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a5e0: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
a5f0: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
a600: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
a610: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
a620: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
a630: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
a640: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
a650: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
a660: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
a670: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
a680: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
a690: 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
a6a0: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
a6b0: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
a6c0: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
a6d0: 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
a6e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
a6f0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
a700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
a710: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
a720: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
a730: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a740: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
a750: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a760: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
a770: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
a780: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
a790: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
a7a0: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
a7b0: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
a7c0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
a7d0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
a7e0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
a7f0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
a800: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
a810: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
a820: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a830: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
a840: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
a850: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
a860: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
a870: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
a880: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
a890: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
a8a0: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
a8b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
a8c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a8d0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
a8e0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
a8f0: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
a900: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
a910: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a920: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
a930: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
a940: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
a950: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
a960: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
a970: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
a980: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
a990: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
a9a0: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
a9b0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
a9c0: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
a9d0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
a9e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
a9f0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
aa00: 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
aa10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
aa20: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
aa30: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
aa40: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
aa50: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
aa60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
aa70: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
aa80: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
aa90: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  .    /* Delete t
aaa0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aab0: 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d  l file. This com
aac0: 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  mits the transac
aad0: 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20  tion. After.    
aae0: 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68  ** doing this th
aaf0: 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73  e directory is s
ab00: 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f  ynced again befo
ab10: 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61  re any individua
ab20: 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  l.    ** transac
ab30: 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64  tion files are d
ab40: 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
ab50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ab60: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
ab70: 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73  aster, 1);.    s
ab80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ab90: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a   zMaster);.    z
aba0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
abb0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
abc0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
abd0: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c  ..    /* All fil
abe0: 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69  es and directori
abf0: 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
ac00: 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20  been synced, so 
ac10: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
ac20: 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
ac30: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
ac40: 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f  PhaseTwo() are o
ac50: 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65  nly closing file
ac60: 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  s and.    ** del
ac70: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
ac80: 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66  ing journals. If
ac90: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
aca0: 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20  wrong while.    
acb0: 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65  ** this is happe
acc0: 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65  ning we don't re
acd0: 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69  ally care. The i
ace0: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a  ntegrity of the.
acf0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
ad00: 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75  on is already gu
ad10: 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f  aranteed, but so
ad20: 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20  me stray 'cold' 
ad30: 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20  journals.    ** 
ad40: 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f  may be lying aro
ad50: 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  und. Returning a
ad60: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e  n error code won
ad70: 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e  't help matters.
ad80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61  .    */.    disa
ad90: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
ada0: 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73  _errors();.    s
adb0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
adc0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66  nMalloc();.    f
add0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
ade0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
adf0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
ae00: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
ae10: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
ae20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
ae30: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
ae40: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pBt);.      }. 
ae50: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ae60: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
ae70: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
ae80: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
ae90: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  s();..    sqlite
aea0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
aeb0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
aec0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
aed0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
aee0: 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65   checks that the
aef0: 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 56   sqlite3.activeV
af00: 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 72  dbeCnt count var
af10: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
af20: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
af30: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
af40: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
af50: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
af60: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
af70: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
af80: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
af90: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
afa0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
afb0: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
afc0: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
afd0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
afe0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
aff0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
b000: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
b010: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
b020: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
b030: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
b040: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
b050: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
b060: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
b070: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
b080: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 70 20  nWrite = 0;.  p 
b090: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77  = db->pVdbe;.  w
b0a0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69  hile( p ){.    i
b0b0: 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
b0c0: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70  E_MAGIC_RUN && p
b0d0: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ->pc>=0 ){.     
b0e0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
b0f0: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
b100: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
b110: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
b120: 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ext;.  }.  asser
b130: 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69  t( cnt==db->acti
b140: 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 61  veVdbeCnt );.  a
b150: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
b160: 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 20  b->writeVdbeCnt 
b170: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
b180: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
b190: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
b1a0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79  ./*.** For every
b1b0: 20 42 74 72 65 65 20 74 68 61 74 20 69 6e 20 64   Btree that in d
b1c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b1d0: 6f 6e 20 64 62 20 77 68 69 63 68 20 0a 2a 2a 20  on db which .** 
b1e0: 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
b1f0: 64 2c 20 22 74 72 69 70 22 20 6f 72 20 69 6e 76  d, "trip" or inv
b200: 61 6c 69 64 61 74 65 20 65 61 63 68 20 63 75 72  alidate each cur
b210: 73 6f 72 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42  sor in.** that B
b220: 74 72 65 65 20 6d 69 67 68 74 20 68 61 76 65 20  tree might have 
b230: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
b240: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
b250: 0a 2a 2a 20 63 61 6e 20 6e 65 76 65 72 20 62 65  .** can never be
b260: 20 75 73 65 64 20 61 67 61 69 6e 2e 20 20 54 68   used again.  Th
b270: 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
b280: 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f  a rollback.*** o
b290: 63 63 75 72 73 2e 20 20 57 65 20 68 61 76 65 20  ccurs.  We have 
b2a0: 74 6f 20 74 72 69 70 20 61 6c 6c 20 74 68 65 20  to trip all the 
b2b0: 6f 74 68 65 72 20 63 75 72 73 6f 72 73 2c 20 65  other cursors, e
b2c0: 76 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72  ven.** cursor fr
b2d0: 6f 6d 20 6f 74 68 65 72 20 56 4d 73 20 69 6e 20  om other VMs in 
b2e0: 64 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61  different databa
b2f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a  se connections,.
b300: 2a 2a 20 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20  ** so that none 
b310: 6f 66 20 74 68 65 6d 20 74 72 79 20 74 6f 20 75  of them try to u
b320: 73 65 20 74 68 65 20 64 61 74 61 20 61 74 20 77  se the data at w
b330: 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 77 65 72  hich they.** wer
b340: 65 20 70 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77  e pointing and w
b350: 68 69 63 68 20 6e 6f 77 20 6d 61 79 20 68 61 76  hich now may hav
b360: 65 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 64  e been changed d
b370: 75 65 0a 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c  ue.** to the rol
b380: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d  lback..**.** Rem
b390: 65 6d 62 65 72 20 74 68 61 74 20 61 20 72 6f 6c  ember that a rol
b3a0: 6c 62 61 63 6b 20 63 61 6e 20 64 65 6c 65 74 65  lback can delete
b3b0: 20 74 61 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65   tables complete
b3c0: 20 61 6e 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20   and.** reorder 
b3d0: 72 6f 6f 74 70 61 67 65 73 2e 20 20 53 6f 20 69  rootpages.  So i
b3e0: 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69  t is not suffici
b3f0: 65 6e 74 20 6a 75 73 74 20 74 6f 20 73 61 76 65  ent just to save
b400: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 6f 66  .** the state of
b410: 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 57 65   the cursor.  We
b420: 20 68 61 76 65 20 74 6f 20 69 6e 76 61 6c 69 64   have to invalid
b430: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ate the cursor.*
b440: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  * so that it is 
b450: 6e 65 76 65 72 20 75 73 65 64 20 61 67 61 69 6e  never used again
b460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b470: 20 69 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f   invalidateCurso
b480: 72 73 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65  rsOnModifiedBtre
b490: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
b4a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
b4b0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
b4c0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
b4d0: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
b4e0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 26  pBt;.    if( p &
b4f0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
b500: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
b510: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
b520: 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
b530: 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b  , SQLITE_ABORT);
b540: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
b550: 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
b560: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
b570: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
b580: 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
b590: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
b5a0: 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
b5b0: 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
b5c0: 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
b5d0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
b5e0: 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
b5f0: 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
b600: 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
b610: 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
b620: 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
b630: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
b640: 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
b650: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
b660: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
b670: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
b680: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64  tion is commtted
b690: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
b6a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
b6b0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
b6c0: 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
b6d0: 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
b6e0: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
b6f0: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
b700: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
b710: 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
b720: 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
b730: 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
b740: 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
b750: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
b760: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 26   p->iStatement &
b770: 26 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  & db->nStatement
b780: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b790: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
b7a0: 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
b7b0: 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
b7c0: 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
b7d0: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
b7e0: 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
b7f0: 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
b800: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
b810: 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
b820: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
b830: 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
b840: 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
b850: 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
b860: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
b870: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
b880: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
b890: 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
b8a0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
b8b0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
b8c0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
b8d0: 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
b8e0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
b8f0: 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
b900: 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
b910: 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
b920: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
b930: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
b940: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
b950: 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
b960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
b970: 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
b980: 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
b990: 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
b9a0: 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
b9b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b9c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b9d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b9e0: 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
b9f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ba00: 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
ba10: 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
ba20: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
ba30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ba40: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  }../*.** If SQLi
ba50: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
ba60: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
ba70: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
ba80: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
ba90: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
baa0: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
bab0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
bac0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
bad0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
bae0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
baf0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
bb00: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
bb10: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
bb20: 20 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20   it.** sets the 
bb30: 42 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62  BtShared.db memb
bb40: 65 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68  er of each of th
bb50: 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
bb60: 74 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a  tures, ensuring.
bb70: 2a 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  ** that the corr
bb80: 65 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ect busy-handler
bb90: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
bba0: 6f 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64  oked if required
bbb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74  ..**.** If SQLit
bbc0: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73  e is not threads
bbd0: 61 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70  afe but does sup
bbe0: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68  port shared-cach
bbf0: 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20  e mode, then.** 
bc00: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
bc10: 72 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65  rAll() is invoke
bc20: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
bc30: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
bc40: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
bc50: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
bc60: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
bc70: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
bc80: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
bc90: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
bca0: 4d 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c  M. Of course onl
bcb0: 79 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68  y a subset of th
bcc0: 65 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ese structures.*
bcd0: 2a 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73  * will be access
bce0: 65 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e  ed by the VM, an
bcf0: 64 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56  d we could use V
bd00: 64 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f  dbe.btreeMask to
bd10: 20 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20   figure.** that 
bd20: 73 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20  subset out, but 
bd30: 74 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61  there is no adva
bd40: 6e 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73  ntage to doing s
bd50: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  o..**.** If SQLi
bd60: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
bd70: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
bd80: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
bd90: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
bda0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
bdb0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66   a no-op..*/.#if
bdc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bdd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f  _SHARED_CACHE.vo
bde0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75  id sqlite3VdbeMu
bdf0: 74 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64  texArrayEnter(Vd
be00: 62 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  be *p){.#if SQLI
be10: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
be20: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65  sqlite3BtreeMute
be30: 78 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e  xArrayEnter(&p->
be40: 61 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20  aMutex);.#else. 
be50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
be60: 65 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65  erAll(p->db);.#e
be70: 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ndif.}.#endif../
be80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
be90: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
bea0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
beb0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
bec0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
bed0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
bee0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
bef0: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
bf00: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
bf10: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
bf20: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
bf30: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
bf40: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
bf50: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
bf60: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
bf70: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
bf80: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
bf90: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
bfa0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
bfb0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
bfc0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
bfd0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
bfe0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
bff0: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
c000: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
c010: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
c020: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
c030: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
c040: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
c050: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
c060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
c070: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
c080: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
c090: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
c0a0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
c0b0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
c0c0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
c0d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
c0e0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
c0f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
c120: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
c130: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
c140: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
c150: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
c160: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
c170: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
c180: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
c190: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
c1a0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
c1b0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
c1c0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
c1d0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
c1e0: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
c1f0: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
c200: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
c210: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
c220: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
c230: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
c240: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
c250: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
c260: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
c270: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
c280: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
c290: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
c2a0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
c2b0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
c2c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
c2d0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
c2e0: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
c2f0: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
c300: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
c310: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
c320: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
c330: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
c340: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
c350: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
c360: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
c370: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
c380: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
c390: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
c3a0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
c3b0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65  MEM;.  }.  close
c3c0: 41 6c 6c 43 75 72 73 6f 72 73 45 78 63 65 70 74  AllCursorsExcept
c3d0: 41 63 74 69 76 65 56 74 61 62 73 28 70 29 3b 0a  ActiveVtabs(p);.
c3e0: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
c3f0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
c400: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c410: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
c420: 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
c430: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
c440: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
c450: 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
c460: 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
c470: 61 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  arted */.  if( p
c480: 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69  ->pc>=0 ){.    i
c490: 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
c4a0: 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
c4b0: 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
c4c0: 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
c4d0: 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
c4e0: 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
c4f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
c500: 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
c510: 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
c520: 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
c530: 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
c540: 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
c550: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
c560: 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65  beMutexArrayEnte
c570: 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
c580: 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
c590: 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
c5a0: 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
c5b0: 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
c5c0: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
c5d0: 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
c5e0: 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
c5f0: 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
c610: 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
c620: 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
c630: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
c640: 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
c650: 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
c660: 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
c670: 72 65 61 64 2d 6f 6e 6c 79 2c 20 77 65 20 6e 65  read-only, we ne
c680: 65 64 20 64 6f 20 6e 6f 20 72 6f 6c 6c 62 61 63  ed do no rollbac
c690: 6b 20 61 74 20 61 6c 6c 2e 20 4f 74 68 65 72 77  k at all. Otherw
c6a0: 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 70 72  ise,.      ** pr
c6b0: 6f 63 65 65 64 20 77 69 74 68 20 74 68 65 20 73  oceed with the s
c6c0: 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
c6d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c6e0: 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
c6f0: 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
c700: 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
c710: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
c720: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
c730: 43 4b 45 44 20 26 26 20 70 2d 3e 75 73 65 73 53  CKED && p->usesS
c740: 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  tmtJournal ){.  
c750: 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
c760: 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
c770: 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
c780: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
c790: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
c7a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d 72 63    }else if( (mrc
c7b0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
c7c0: 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
c7d0: 4c 4c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL).            
c7e0: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 75 73 65         && p->use
c7f0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
c800: 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
c810: 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
c820: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
c830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c840: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
c850: 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
c860: 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
c870: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
c880: 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
c890: 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
c8a0: 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
c8b0: 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
c8c0: 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
c8d0: 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
c8e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
c8f0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f  validateCursorsO
c900: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28  nModifiedBtrees(
c910: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  db);.          s
c920: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
c930: 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  l(db);.         
c940: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
c950: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
c960: 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
c970: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
c980: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
c990: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
c9a0: 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
c9b0: 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
c9c0: 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79  this is the only
c9d0: 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a   active writer .
c9e0: 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20      ** VM, then 
c9f0: 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63  we do either a c
ca00: 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
ca10: 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  k of the current
ca20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20   transaction. . 
ca30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
ca40: 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c  e: This block al
ca50: 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f  so runs if one o
ca60: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
ca70: 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20  rors handled .  
ca80: 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f    ** above has o
ca90: 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f  ccurred. .    */
caa0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
cab0: 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20  3VtabInSync(db) 
cac0: 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74  .     && db->aut
cad0: 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26  oCommit .     &&
cae0: 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e   db->writeVdbeCn
caf0: 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  t==(p->readOnly=
cb00: 3d 30 29 20 0a 20 20 20 20 20 26 26 20 28 64 62  =0) .     && (db
cb10: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
cb20: 5f 43 6f 6d 6d 69 74 42 75 73 79 29 3d 3d 30 0a  _CommitBusy)==0.
cb30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
cb40: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
cb50: 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
cb60: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
cb70: 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
cb80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
cb90: 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
cba0: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 61 6e  flag is true, an
cbb0: 64 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  d the vdbe progr
cbc0: 61 6d 20 77 61 73 20 0a 20 20 20 20 20 20 20 20  am was .        
cbd0: 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  ** successful or
cbe0: 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
cbf0: 27 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 54 68  ' constraint. Th
cc00: 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69  is means a commi
cc10: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  t .        ** is
cc20: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20   required..     
cc30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
cc40: 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
cc50: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , p);.        if
cc60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
cc70: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  Y ){.          s
cc80: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78  qlite3BtreeMutex
cc90: 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61  ArrayLeave(&p->a
cca0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Mutex);.        
ccb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ccc0: 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
ccd0: 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
cce0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ccf0: 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
cd00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
cd10: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b  RollbackAll(db);
cd20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
cd30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
cd40: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
cd50: 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
cd60: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
cd70: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
cd80: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
cd90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
cda0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
cdb0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
cdc0: 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
cdd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
cde0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
cdf0: 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
ce00: 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
ce10: 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
ce20: 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
ce30: 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
ce40: 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
ce50: 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
ce60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
ce70: 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
ce80: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
ce90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cea0: 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43       invalidateC
ceb0: 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 64  ursorsOnModified
cec0: 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 20  Btrees(db);.    
ced0: 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
cee0: 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  ackAll(db);.    
cef0: 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
cf00: 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
cf10: 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
cf20: 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
cf30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
cf40: 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
cf50: 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
cf60: 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
cf70: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
cf80: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
cf90: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
cfa0: 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
cfb0: 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
cfc0: 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
cfd0: 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
cfe0: 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
cff0: 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
d000: 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
d010: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
d020: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
d030: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
d040: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
d050: 74 68 65 6e 20 73 65 74 20 74 68 65 20 65 72 72  then set the err
d060: 6f 72 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 74  or.    ** code t
d070: 6f 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e  o the new value.
d080: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d090: 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
d0a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d0b0: 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
d0c0: 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
d0d0: 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
d0e0: 20 72 63 20 26 26 20 28 70 2d 3e 72 63 3d 3d 53   rc && (p->rc==S
d0f0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72  QLITE_OK || p->r
d100: 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  c==SQLITE_CONSTR
d110: 41 49 4e 54 29 20 29 7b 0a 20 20 20 20 20 20 20  AINT) ){.       
d120: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
d130: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
d140: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
d150: 67 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  g);.        p->z
d160: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
d170: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
d180: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
d190: 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
d1a0: 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
d1b0: 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
d1c0: 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
d1d0: 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
d1e0: 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
d1f0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d200: 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
d210: 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
d220: 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
d230: 74 4f 6e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20  tOn && p->pc>=0 
d240: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74  ){.      if( eSt
d250: 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50  atementOp!=SAVEP
d260: 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
d270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d280: 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
d290: 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a  b, p->nChange);.
d2a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d2b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d2c0: 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30  SetChanges(db, 0
d2d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d2e0: 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
d2f0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
d300: 20 52 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d   Rollback or com
d310: 6d 69 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63  mit any schema c
d320: 68 61 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75  hanges that occu
d330: 72 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  rred. */.    if(
d340: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
d350: 4b 20 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53  K && db->flags&S
d360: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d370: 67 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ges ){.      sql
d380: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
d390: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
d3a0: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
d3b0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53  = (db->flags | S
d3c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d3d0: 67 65 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ges);.    }..   
d3e0: 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
d3f0: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
d400: 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 41 72  ite3BtreeMutexAr
d410: 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75  rayLeave(&p->aMu
d420: 74 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tex);.  }..  /* 
d430: 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
d440: 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
d450: 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
d460: 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
d470: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
d480: 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61  >=0 ){.    db->a
d490: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a  ctiveVdbeCnt--;.
d4a0: 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
d4b0: 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62  Only ){.      db
d4c0: 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d  ->writeVdbeCnt--
d4d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d4e0: 72 74 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64  rt( db->activeVd
d4f0: 62 65 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65  beCnt>=db->write
d500: 56 64 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20  VdbeCnt );.  }. 
d510: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
d520: 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
d530: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
d540: 74 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e  t(db);.  if( p->
d550: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d560: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
d570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d580: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
d590: 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
d5a0: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
d5b0: 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
d5c0: 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
d5d0: 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
d5e0: 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
d5f0: 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
d600: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
d610: 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
d620: 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
d630: 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
d640: 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
d650: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
d660: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
d670: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
d680: 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
d690: 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
d6a0: 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65  ( db->activeVdbe
d6b0: 43 6e 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  Cnt>0 || db->aut
d6c0: 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
d6d0: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
d6e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d6f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
d700: 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73   Each VDBE holds
d710: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
d720: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
d730: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61  qlite3_step() ca
d740: 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20  ll.** in p->rc. 
d750: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d760: 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62  ts that result b
d770: 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  ack to SQLITE_OK
d780: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d790: 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65  3VdbeResetStepRe
d7a0: 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  sult(Vdbe *p){. 
d7b0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
d7c0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  OK;.}../*.** Cle
d7d0: 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
d7e0: 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
d7f0: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
d800: 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
d810: 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
d820: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
d830: 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
d840: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
d850: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
d860: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d870: 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
d880: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
d890: 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
d8a0: 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
d8b0: 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
d8c0: 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
d8d0: 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
d8e0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
d8f0: 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
d900: 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
d910: 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
d920: 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
d930: 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
d940: 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
d950: 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
d960: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
d970: 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
d980: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
d990: 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
d9a0: 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
d9b0: 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
d9c0: 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
d9d0: 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
d9e0: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
d9f0: 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
da00: 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
da10: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f   now..  */.  (vo
da20: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
da30: 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  On(db);.  sqlite
da40: 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 20 20  3VdbeHalt(p);.  
da50: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
da60: 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a 20 20 2f  etyOff(db);..  /
da70: 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61  * If the VDBE ha
da80: 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61  s be run even pa
da90: 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72  rtially, then tr
daa0: 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72  ansfer the error
dab0: 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65   code.  ** and e
dac0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
dad0: 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20  m the VDBE into 
dae0: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
daf0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75  e structure.  Bu
db00: 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44  t.  ** if the VD
db10: 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  BE has just been
db20: 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20   set to run but 
db30: 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  has not actually
db40: 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20   executed any.  
db50: 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ** instructions 
db60: 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d  yet, leave the m
db70: 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72  ain database err
db80: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  or information u
db90: 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20  nchanged..  */. 
dba0: 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
dbb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 45 72 72  .    if( p->zErr
dbc0: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
dbd0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
dbe0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 73  alloc();.      s
dbf0: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
dc00: 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 2c 70 2d  r(db->pErr,-1,p-
dc10: 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 54 45 5f  >zErrMsg,SQLITE_
dc20: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e  UTF8,SQLITE_TRAN
dc30: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 73 71  SIENT);.      sq
dc40: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
dc50: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 64 62  lloc();.      db
dc60: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 2d 3e 72  ->errCode = p->r
dc70: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
dc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
dc90: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 70 2d  rrMsg);.      p-
dca0: 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
dcb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
dcc0: 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  c ){.      sqlit
dcd0: 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72  e3Error(db, p->r
dce0: 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  c, 0);.    }else
dcf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
dd00: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
dd10: 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  OK, 0);.    }.  
dd20: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
dd30: 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
dd40: 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
dd50: 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
dd60: 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
dd70: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
dd80: 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
dd90: 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
dda0: 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
ddb0: 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
ddc0: 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
ddd0: 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
dde0: 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
ddf0: 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
de00: 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
de10: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
de20: 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 73  p->rc, 0);.    s
de30: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
de40: 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
de50: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
de60: 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
de70: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
de80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
de90: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
dea0: 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
deb0: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
dec0: 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
ded0: 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
dee0: 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
def0: 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
df00: 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
df10: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
df20: 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
df30: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
df40: 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
df50: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
df60: 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
df70: 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
df80: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
df90: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
dfa0: 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
dfb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dfc0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
dfd0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
dfe0: 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
dff0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
e000: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
e010: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
e020: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e030: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
e040: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
e050: 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20  ut, "%6d %10lld 
e060: 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20  %8lld ",.       
e070: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
e080: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
e090: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
e0a0: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
e0b0: 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
e0c0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
e0d0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
e0e0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
e0f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
e100: 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70  intOp(out, i, &p
e110: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20  ->aOp[i]);.     
e120: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28   }.      fclose(
e130: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  out);.    }.  }.
e140: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69  #endif.  p->magi
e150: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  c = VDBE_MAGIC_I
e160: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  NIT;.  return p-
e170: 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  >rc & db->errMas
e180: 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65  k;.}. ./*.** Cle
e190: 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65  an up and delete
e1a0: 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78   a VDBE after ex
e1b0: 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e  ecution.  Return
e1c0: 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63   an integer whic
e1d0: 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  h is.** the resu
e1e0: 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20  lt code.  Write 
e1f0: 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
e200: 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45  e text into *pzE
e210: 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrMsg..*/.int sq
e220: 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a  lite3VdbeFinaliz
e230: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  e(Vdbe *p){.  in
e240: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e250: 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
e260: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
e270: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44   || p->magic==VD
e280: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b  BE_MAGIC_HALT ){
e290: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e2a0: 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20  3VdbeReset(p);. 
e2b0: 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 26     assert( (rc &
e2c0: 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29   p->db->errMask)
e2d0: 3d 3d 72 63 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ==rc );.  }else 
e2e0: 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
e2f0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b  BE_MAGIC_INIT ){
e300: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e310: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
e320: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
e330: 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
e340: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  rc;.}../*.** Cal
e350: 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  l the destructor
e360: 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74   for each auxdat
e370: 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65  a entry in pVdbe
e380: 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a  Func for which.*
e390: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
e3a0: 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20  ing bit in mask 
e3b0: 69 73 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61  is clear.  Auxda
e3c0: 74 61 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e  ta entries beyon
e3d0: 64 20 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61  d 31.** are alwa
e3e0: 79 73 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54  ys destroyed.  T
e3f0: 6f 20 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75  o destroy all au
e400: 78 64 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63  xdata entries, c
e410: 61 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  all this.** rout
e420: 69 6e 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30  ine with mask==0
e430: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e440: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
e450: 74 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64  ta(VdbeFunc *pVd
e460: 62 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b  beFunc, int mask
e470: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
e480: 72 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75  r(i=0; i<pVdbeFu
e490: 6e 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a  nc->nAux; i++){.
e4a0: 20 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61      struct AuxDa
e4b0: 74 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62  ta *pAux = &pVdb
e4c0: 65 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b  eFunc->apAux[i];
e4d0: 0a 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c  .    if( (i>31 |
e4e0: 7c 20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29  | !(mask&(((u32)
e4f0: 31 29 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78  1)<<i))) && pAux
e500: 2d 3e 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20  ->pAux ){.      
e510: 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
e520: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
e530: 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
e540: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
e550: 20 20 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78        pAux->pAux
e560: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
e570: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
e580: 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
e590: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
e5a0: 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
e5b0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
e5c0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
e5d0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
e5e0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
e5f0: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
e600: 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
e610: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
e620: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
e630: 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
e640: 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
e650: 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
e660: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
e670: 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
e680: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
e690: 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28  pPrev;.  }.  if(
e6a0: 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 4f   p->aOp ){.    O
e6b0: 70 20 2a 70 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *pOp = p->aOp;
e6c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
e6d0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 2c 20 70 4f 70  p->nOp; i++, pOp
e6e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50  ++){.      freeP
e6f0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
e700: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
e710: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
e720: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  UG.      sqlite3
e730: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e  DbFree(db, pOp->
e740: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69  zComment);.#endi
e750: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d  f     .    }.  }
e760: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
e770: 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
e780: 56 61 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Var);.  sqlite3D
e790: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c 61  bFree(db, p->aLa
e7a0: 62 65 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  bel);.  releaseM
e7b0: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
e7c0: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
e7d0: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
e7e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e7f0: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
e800: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e810: 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
e820: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
e830: 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 73  _MAGIC_DEAD;.  s
e840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
e850: 20 70 2d 3e 61 4f 70 29 3b 0a 20 20 73 71 6c 69   p->aOp);.  sqli
e860: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
e870: 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 6c 69 74  >pFree);.  sqlit
e880: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
e890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 4d  .}../*.** If a M
e8a0: 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
e8b0: 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
e8c0: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
e8d0: 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
e8e0: 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 52 65 74  MoveTo now.  Ret
e8f0: 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
e900: 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 65 54 6f  e.  If no MoveTo
e910: 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 74 68 69   is pending, thi
e920: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 6f 65  s.** routine doe
e930: 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 20 72 65  s nothing and re
e940: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
e950: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
e960: 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
e970: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
e980: 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65    if( p->deferre
e990: 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69  dMoveto ){.    i
e9a0: 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
e9b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
e9c0: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
e9d0: 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
e9e0: 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61  nt;.#endif.    a
e9f0: 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c  ssert( p->isTabl
ea00: 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  e );.    rc = sq
ea10: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
ea20: 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 72  Unpacked(p->pCur
ea30: 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74  sor, 0, p->movet
ea40: 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73  oTarget, 0, &res
ea50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
ea60: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
ea70: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 6b 65  ->lastRowid = ke
ea80: 79 54 6f 49 6e 74 28 70 2d 3e 6d 6f 76 65 74 6f  yToInt(p->moveto
ea90: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 70 2d 3e  Target);.    p->
eaa0: 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20 41  rowidIsValid = A
eab0: 4c 57 41 59 53 28 72 65 73 3d 3d 30 29 20 3f 31  LWAYS(res==0) ?1
eac0: 3a 30 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  :0;.    if( NEVE
ead0: 52 28 72 65 73 3c 30 29 20 29 7b 0a 20 20 20 20  R(res<0) ){.    
eae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
eaf0: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73  reeNext(p->pCurs
eb00: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 20  or, &res);.     
eb10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
eb20: 20 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65   rc;.    }.#ifde
eb30: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
eb40: 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
eb50: 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
eb60: 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
eb70: 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
eb80: 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
eb90: 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
eba0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75  }else if( p->pCu
ebb0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rsor ){.    int 
ebc0: 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
ebd0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
ebe0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
ebf0: 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
ec00: 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
ec10: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ec20: 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
ec30: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
ec40: 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
ec50: 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
ec60: 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a  p->nullRow = 1;.
ec70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
ec80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ec90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
eca0: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
ecb0: 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
ecc0: 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
ecd0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
ece0: 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
ecf0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
ed00: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
ed10: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
ed20: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
ed30: 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
ed40: 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
ed50: 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
ed60: 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
ed70: 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
ed80: 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
ed90: 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
eda0: 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
edb0: 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
edc0: 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
edd0: 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
ede0: 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
edf0: 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
ee00: 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
ee10: 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
ee20: 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
ee30: 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
ee40: 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
ee50: 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
ee60: 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
ee70: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
ee80: 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
ee90: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
eea0: 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
eeb0: 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
eec0: 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
eed0: 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
eee0: 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
eef0: 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
ef00: 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
ef10: 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
ef20: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
ef30: 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
ef40: 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
ef50: 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
ef60: 74 61 20 62 6c 6f 62 20 73 65 70 65 72 61 74 65  ta blob seperate
ef70: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
ef80: 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
ef90: 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
efa0: 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
efb0: 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
efc0: 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
efd0: 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
efe0: 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
eff0: 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
f000: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
f010: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
f020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
f030: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
f040: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
f050: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
f060: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
f070: 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
f080: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
f090: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
f0c0: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
f0d0: 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
f0f0: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
f100: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
f110: 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
f120: 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
f130: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
f140: 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
f170: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
f180: 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
f190: 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
f1a0: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
f1b0: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
f1c0: 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
f1d0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
f1e0: 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
f1f0: 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
f200: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
f210: 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
f220: 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
f230: 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
f240: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
f250: 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
f260: 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
f270: 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
f280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f290: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
f2a0: 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
f2b0: 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
f2c0: 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
f2d0: 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
f2e0: 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
f2f0: 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
f300: 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
f310: 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
f320: 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
f330: 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
f340: 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
f350: 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
f360: 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
f370: 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
f380: 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
f390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f3a0: 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
f3b0: 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
f3c0: 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
f3d0: 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
f3e0: 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
f3f0: 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
f400: 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  mat){.  int flag
f410: 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
f420: 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28  .  int n;..  if(
f430: 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
f440: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
f450: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
f460: 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20  &MEM_Int ){.    
f470: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
f480: 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20  ether to use 1, 
f490: 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74  2, 4, 6 or 8 byt
f4a0: 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e  es. */.#   defin
f4b0: 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28  e MAX_6BYTE ((((
f4c0: 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c  i64)0x00008000)<
f4d0: 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20  <32)-1).    i64 
f4e0: 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  i = pMem->u.i;. 
f4f0: 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66     u64 u;.    if
f500: 28 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ( file_format>=4
f510: 20 26 26 20 28 69 26 31 29 3d 3d 69 20 29 7b 0a   && (i&1)==i ){.
f520: 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
f530: 75 33 32 29 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u32)i;.    }.   
f540: 20 75 20 3d 20 69 3c 30 20 3f 20 2d 69 20 3a 20   u = i<0 ? -i : 
f550: 69 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32  i;.    if( u<=12
f560: 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  7 ) return 1;.  
f570: 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
f580: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
f590: 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
f5a0: 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
f5b0: 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
f5c0: 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
f5d0: 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
f5e0: 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
f5f0: 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
f600: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
f610: 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
f620: 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
f630: 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
f640: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
f650: 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
f660: 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70  Blob) );.  n = p
f670: 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c  Mem->n;.  if( fl
f680: 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
f690: 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d  {.    n += pMem-
f6a0: 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20  >u.nZero;.  }.  
f6b0: 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a  assert( n>=0 );.
f6c0: 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
f6d0: 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
f6e0: 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
f6f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f700: 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
f710: 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
f720: 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
f730: 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
f740: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
f750: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
f760: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
f770: 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
f780: 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
f790: 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
f7a0: 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
f7b0: 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
f7c0: 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
f7d0: 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
f7e0: 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
f7f0: 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
f800: 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
f810: 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
f820: 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
f830: 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
f840: 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
f850: 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
f860: 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
f870: 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
f880: 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
f890: 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
f8a0: 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
f8b0: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
f8c0: 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
f8d0: 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
f8e0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
f8f0: 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
f900: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
f910: 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
f920: 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
f930: 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
f940: 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
f950: 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
f960: 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
f970: 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
f980: 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
f990: 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
f9a0: 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
f9b0: 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
f9c0: 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
f9d0: 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
f9e0: 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
f9f0: 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
fa00: 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
fa10: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
fa20: 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
fa30: 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
fa40: 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
fa50: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
fa60: 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
fa70: 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
fa80: 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
fa90: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
faa0: 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
fab0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
fac0: 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
fad0: 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
fae0: 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
faf0: 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
fb00: 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
fb10: 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
fb20: 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
fb30: 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
fb40: 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
fb50: 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
fb60: 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
fb70: 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
fb80: 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
fb90: 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
fba0: 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
fbb0: 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
fbc0: 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
fbd0: 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
fbe0: 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
fbf0: 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
fc00: 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
fc10: 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
fc20: 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
fc30: 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
fc40: 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
fc50: 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
fc60: 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
fc70: 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
fc80: 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
fc90: 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
fca0: 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
fcb0: 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
fcc0: 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
fcd0: 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
fce0: 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
fcf0: 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
fd00: 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
fd10: 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
fd20: 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
fd30: 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
fd40: 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
fd50: 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
fd60: 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
fd70: 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
fd80: 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
fd90: 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
fda0: 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
fdb0: 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
fdc0: 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
fdd0: 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
fde0: 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
fdf0: 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
fe00: 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
fe10: 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
fe20: 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
fe30: 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
fe40: 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
fe50: 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
fe60: 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
fe70: 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
fe80: 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
fe90: 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
fea0: 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
feb0: 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
fec0: 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
fed0: 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
fee0: 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
fef0: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
ff00: 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
ff10: 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
ff20: 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
ff30: 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
ff40: 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
ff50: 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
ff60: 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
ff70: 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
ff80: 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
ff90: 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
ffa0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
ffb0: 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
ffc0: 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
ffd0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
ffe0: 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
fff0: 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
10000 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
10010 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
10020 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
10030 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
10040 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
10050 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
10060 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
10070 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
10080 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
10090 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
100a0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
100b0 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74  uf[].  nBuf must
100c0 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61   always be.** la
100d0 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
100e0 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
100f0 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  eld.  Except, if
10100 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a   the field is.**
10110 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a   a blob with a z
10120 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c  ero-filled tail,
10130 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68   then buf[] migh
10140 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69  t be just the ri
10150 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68  ght.** size to h
10160 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65  old everything e
10170 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65  xcept for the ze
10180 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20  ro-filled tail. 
10190 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20   If buf[].** is 
101a0 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20  only big enough 
101b0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d  to hold the non-
101c0 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65  zero prefix, the
101d0 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61  n only write tha
101e0 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f  t.** prefix into
101f0 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20   buf[].  But if 
10200 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65  buf[] is large e
10210 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f  nough to hold bo
10220 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78  th the.** prefix
10230 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68   and the tail th
10240 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65  en write the pre
10250 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20  fix and set the 
10260 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a  tail to all.** z
10270 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eros..**.** Retu
10280 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
10290 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
102a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66  written into buf
102b0 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  [].  The number.
102c0 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  ** of bytes in t
102d0 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74  he zero-filled t
102e0 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20  ail is included 
102f0 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  in the return va
10300 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74  lue only.** if t
10310 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20  hose bytes were 
10320 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e  zeroed in buf[].
10330 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33  .*/ .int sqlite3
10340 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38  VdbeSerialPut(u8
10350 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c   *buf, int nBuf,
10360 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20   Mem *pMem, int 
10370 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20  file_format){.  
10380 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20  u32 serial_type 
10390 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
103a0 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69  ialType(pMem, fi
103b0 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 69 6e  le_format);.  in
103c0 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74  t len;..  /* Int
103d0 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f  eger and Real */
103e0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
103f0 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f  pe<=7 && serial_
10400 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36  type>0 ){.    u6
10410 34 20 76 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  4 v;.    int i;.
10420 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
10430 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
10440 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
10450 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  )==sizeof(pMem->
10460 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
10470 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c  py(&v, &pMem->r,
10480 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20   sizeof(v));.   
10490 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
104a0 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20  anFloat(v);.    
104b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d  }else{.      v =
104c0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
104d0 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20  }.    len = i = 
104e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
104f0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
10500 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72  type);.    asser
10510 74 28 20 6c 65 6e 3c 3d 6e 42 75 66 20 29 3b 0a  t( len<=nBuf );.
10520 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 29      while( i-- )
10530 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 3d  {.      buf[i] =
10540 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20   (u8)(v&0xFF);. 
10550 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20       v >>= 8;.  
10560 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c    }.    return l
10570 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  en;.  }..  /* St
10580 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a  ring or blob */.
10590 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
105a0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73  e>=12 ){.    ass
105b0 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28  ert( pMem->n + (
105c0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
105d0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75  EM_Zero)?pMem->u
105e0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20  .nZero:0).      
105f0 20 20 20 20 20 20 20 3d 3d 20 73 71 6c 69 74 65         == sqlite
10600 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
10610 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20  en(serial_type) 
10620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
10630 4d 65 6d 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a  Mem->n<=nBuf );.
10640 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e      len = pMem->
10650 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75  n;.    memcpy(bu
10660 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
10670 3b 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e  ;.    if( pMem->
10680 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
10690 20 29 7b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d   ){.      len +=
106a0 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
106b0 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 6e 42        if( len>nB
106c0 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  uf ){.        le
106d0 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 20 20 20 20  n = nBuf;.      
106e0 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  }.      memset(&
106f0 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c  buf[pMem->n], 0,
10700 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20   len-pMem->n);. 
10710 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10720 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
10730 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
10740 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
10750 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10760 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20  Deserialize the 
10770 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65  data blob pointe
10780 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73  d to by buf as s
10790 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61  erial type seria
107a0 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74  l_type.** and st
107b0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69  ore the result i
107c0 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20  n pMem.  Return 
107d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
107e0 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e  tes read..*/ .in
107f0 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t sqlite3VdbeSer
10800 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
10810 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
10820 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
10830 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
10840 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
10850 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
10860 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
10870 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
10880 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
10890 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
108a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
108b0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
108c0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
108d0 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  ){.  switch( ser
108e0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
108f0 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65  case 10:   /* Re
10900 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
10910 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73  e use */.    cas
10920 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 11:   /* Reser
10930 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
10940 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30  se */.    case 0
10950 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a  : {  /* NULL */.
10960 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
10970 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
10980 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10990 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
109a0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
109b0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
109c0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69   pMem->u.i = (si
109d0 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d  gned char)buf[0]
109e0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
109f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
10a00 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
10a10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
10a20 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
10a30 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
10a40 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
10a50 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29   (((signed char)
10a60 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75  buf[0])<<8) | bu
10a70 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  f[1];.      pMem
10a80 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
10a90 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
10aa0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
10ab0 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
10ac0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
10ad0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
10ae0 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63  .i = (((signed c
10af0 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29  har)buf[0])<<16)
10b00 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c   | (buf[1]<<8) |
10b10 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70   buf[2];.      p
10b20 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
10b30 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
10b40 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
10b50 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
10b60 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
10b70 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
10b80 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c  ->u.i = (buf[0]<
10b90 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c  <24) | (buf[1]<<
10ba0 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38  16) | (buf[2]<<8
10bb0 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20  ) | buf[3];.    
10bc0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
10bd0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72  MEM_Int;.      r
10be0 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20  eturn 4;.    }. 
10bf0 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20     case 5: { /* 
10c00 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  6-byte signed in
10c10 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75  teger */.      u
10c20 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64  64 x = (((signed
10c30 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38   char)buf[0])<<8
10c40 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20  ) | buf[1];.    
10c50 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32    u32 y = (buf[2
10c60 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d  ]<<24) | (buf[3]
10c70 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c  <<16) | (buf[4]<
10c80 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20  <8) | buf[5];.  
10c90 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20      x = (x<<32) 
10ca0 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  | y;.      pMem-
10cb0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
10cc0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
10cd0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
10ce0 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
10cf0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
10d00 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
10d10 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
10d20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
10d30 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
10d40 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34  int */.      u64
10d50 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b   x;.      u32 y;
10d60 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
10d70 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
10d80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
10d90 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
10da0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
10db0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
10dc0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
10dd0 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
10de0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
10df0 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
10e00 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
10e10 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
10e20 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
10e30 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
10e40 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
10e50 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
10e60 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
10e70 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
10e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
10e90 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
10ea0 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
10eb0 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
10ec0 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
10ed0 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
10ee0 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
10ef0 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
10f00 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
10f10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
10f20 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
10f30 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
10f40 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
10f50 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
10f60 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75  f..      x = (bu
10f70 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66  f[0]<<24) | (buf
10f80 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b  [1]<<16) | (buf[
10f90 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b  2]<<8) | buf[3];
10fa0 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b  .      y = (buf[
10fb0 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35  4]<<24) | (buf[5
10fc0 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d  ]<<16) | (buf[6]
10fd0 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20  <<8) | buf[7];. 
10fe0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
10ff0 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20   | y;.      if( 
11000 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29  serial_type==6 )
11010 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e  {.        pMem->
11020 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
11030 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
11040 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
11050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11060 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
11070 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a  eof(x)==8 && siz
11080 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20  eof(pMem->r)==8 
11090 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d  );.        swapM
110a0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
110b0 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  x);.        memc
110c0 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c  py(&pMem->r, &x,
110d0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
110e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
110f0 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28   = sqlite3IsNaN(
11100 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e  pMem->r) ? MEM_N
11110 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
11120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11130 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20  turn 8;.    }.  
11140 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
11150 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
11160 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
11170 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
11180 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
11190 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
111a0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
111b0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
111c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
111d0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
111e0 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 28       int len = (
111f0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
11200 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
11210 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
11220 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
11230 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
11240 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
11250 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
11260 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  &0x01 ){.       
11270 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
11280 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68  EM_Str | MEM_Eph
11290 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  em;.      }else{
112a0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
112b0 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20  lags = MEM_Blob 
112c0 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20  | MEM_Ephem;.   
112d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
112e0 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
112f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
11300 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
11310 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
11320 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
11330 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65  in pKey[], parse
11340 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69   the.** record i
11350 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65  nto a UnpackedRe
11360 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20  cord structure. 
11370 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
11380 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72  r to.** that str
11390 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  ucture..**.** Th
113a0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
113b0 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65  on might provide
113c0 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f   szSpace bytes o
113d0 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  f memory.** spac
113e0 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68  e at pSpace.  Th
113f0 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  is space can be 
11400 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
11410 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62   returned.** VDb
11420 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74  eParsedRecord st
11430 72 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73  ructure if it is
11440 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20   large enough.  
11450 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20  If it is.** not 
11460 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63  big enough, spac
11470 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
11480 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
11490 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  c()..**.** The r
114a0 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72  eturned structur
114b0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  e should be clos
114c0 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ed by a call to.
114d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  ** sqlite3VdbeDe
114e0 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
114f0 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b  rd()..*/ .Unpack
11500 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65  edRecord *sqlite
11510 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
11520 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  k(.  KeyInfo *pK
11530 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49  eyInfo,     /* I
11540 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
11550 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d   the record form
11560 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79  at */.  int nKey
11570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11580 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69  * Size of the bi
11590 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
115a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
115b0 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  y,      /* The b
115c0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
115d0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
115e0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
115f0 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
11600 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  lable to hold th
11610 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
11620 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 20 20  t szSpace       
11630 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11640 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
11650 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  s */.){.  const 
11660 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
11670 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
11680 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65  igned char *)pKe
11690 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  y;.  UnpackedRec
116a0 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20  ord *p;  /* The 
116b0 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
116c0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74  that we will ret
116d0 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  urn */.  int nBy
116e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
116f0 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65  Memory space nee
11700 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69  ded to hold p, i
11710 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
11720 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20   d;.  u32 idx;. 
11730 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
11740 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
11750 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
11760 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
11770 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74  Mem *pMem;.  int
11780 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
11790 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70   /* Increase pSp
117a0 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 63 68  ace by this much
117b0 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   to 8-byte align
117c0 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20   it */.  .  /*. 
117d0 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   ** We want to s
117e0 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
117f0 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
11800 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
11810 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
11820 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
11830 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
11840 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
11850 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
11860 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
11870 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
11880 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
11890 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
118a0 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
118b0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
118c0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
118d0 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
118e0 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d  & 7;.  pSpace +=
118f0 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65   nOff;.  szSpace
11900 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74   -= nOff;.  nByt
11910 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
11920 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
11930 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
11940 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
11950 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
11960 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20  te>szSpace ){.  
11970 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
11980 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
11990 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
119a0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
119b0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66  turn 0;.    p->f
119c0 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f  lags = UNPACKED_
119d0 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41  NEED_FREE | UNPA
119e0 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
119f0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
11a00 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
11a10 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20  ord*)pSpace;.   
11a20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41   p->flags = UNPA
11a30 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f  CKED_NEED_DESTRO
11a40 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79  Y;.  }.  p->pKey
11a50 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
11a60 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
11a70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
11a80 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d  + 1;.  p->aMem =
11a90 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28   pMem = (Mem*)&(
11aa0 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
11ab0 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
11ac0 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
11ad0 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
11ae0 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20  ALIGNMENT(pMem) 
11af0 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  );.  idx = getVa
11b00 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
11b10 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72  dr);.  d = szHdr
11b20 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69  ;.  u = 0;.  whi
11b30 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26  le( idx<szHdr &&
11b40 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a   u<p->nField ){.
11b50 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
11b60 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d  ype;..    idx +=
11b70 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
11b80 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f  ey[idx], serial_
11b90 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 64  type);.    if( d
11ba0 3e 3d 6e 4b 65 79 20 26 26 20 73 71 6c 69 74 65  >=nKey && sqlite
11bb0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
11bc0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3e  en(serial_type)>
11bd0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70  0 ) break;.    p
11be0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
11bf0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
11c00 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
11c10 6f 2d 3e 64 62 3b 0a 20 20 20 20 70 4d 65 6d 2d  o->db;.    pMem-
11c20 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20  >flags = 0;.    
11c30 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20  pMem->zMalloc = 
11c40 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
11c50 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
11c60 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
11c70 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
11c80 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75     pMem++;.    u
11c90 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
11ca0 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
11cb0 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
11cc0 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20  ->nField = u;.  
11cd0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b  return (void*)p;
11ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11cf0 6f 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20  outine destroys 
11d00 61 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  a UnpackedRecord
11d10 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
11d20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
11d30 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  eUnpackedRecord(
11d40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
11d50 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
11d60 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20     if( p->flags 
11d70 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f  & UNPACKED_NEED_
11d80 44 45 53 54 52 4f 59 20 29 7b 0a 20 20 20 20 20  DESTROY ){.     
11d90 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 4d 65   int i;.      Me
11da0 6d 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 66  m *pMem;.      f
11db0 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 2d 3e  or(i=0, pMem=p->
11dc0 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c  aMem; i<p->nFiel
11dd0 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b 29 7b  d; i++, pMem++){
11de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
11df0 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  m->zMalloc ){.  
11e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11e10 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d  dbeMemRelease(pM
11e20 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  em);.        }. 
11e30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11e40 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26 20   if( p->flags & 
11e50 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f 46 52  UNPACKED_NEED_FR
11e60 45 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EE ){.      sqli
11e70 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65  te3DbFree(p->pKe
11e80 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20  yInfo->db, p);. 
11e90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11ea0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11eb0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
11ec0 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
11ed0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
11ee0 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
11ef0 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
11f00 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
11f10 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
11f20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
11f30 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
11f40 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
11f50 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
11f60 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
11f70 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
11f80 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
11f90 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
11fa0 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
11fb0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
11fc0 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
11fd0 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
11fe0 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
11ff0 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
12000 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
12010 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
12020 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65  Record..**.** Ke
12030 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e  y1 and Key2 do n
12040 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61  ot have to conta
12050 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  in the same numb
12060 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a  er of fields..**
12070 20 54 68 65 20 6b 65 79 20 77 69 74 68 20 66 65   The key with fe
12080 77 65 72 20 66 69 65 6c 64 73 20 69 73 20 75 73  wer fields is us
12090 75 61 6c 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c  ually compares l
120a0 65 73 73 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a  ess than the .**
120b0 20 6c 6f 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f   longer key.  Ho
120c0 77 65 76 65 72 20 69 66 20 74 68 65 20 55 4e 50  wever if the UNP
120d0 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c  ACKED_INCRKEY fl
120e0 61 67 73 20 69 6e 20 70 50 4b 65 79 32 20 69 73  ags in pPKey2 is
120f0 20 73 65 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20   set.** and the 
12100 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 20  common prefixes 
12110 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
12120 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
12130 6e 20 6b 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66  n key2..** Or if
12140 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41   the UNPACKED_MA
12150 54 43 48 5f 50 52 45 46 49 58 20 66 6c 61 67 20  TCH_PREFIX flag 
12160 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 70  is set and the p
12170 72 65 66 69 78 65 73 20 61 72 65 0a 2a 2a 20 65  refixes are.** e
12180 71 75 61 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b  qual, then the k
12190 65 79 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  eys are consider
121a0 65 64 20 74 6f 20 62 65 20 65 71 75 61 6c 20 61  ed to be equal a
121b0 6e 64 0a 2a 2a 20 74 68 65 20 70 61 72 74 73 20  nd.** the parts 
121c0 62 65 79 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f  beyond the commo
121d0 6e 20 70 72 65 66 69 78 20 61 72 65 20 69 67 6e  n prefix are ign
121e0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ored..**.** If t
121f0 68 65 20 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f  he UNPACKED_IGNO
12200 52 45 5f 52 4f 57 49 44 20 66 6c 61 67 20 69 73  RE_ROWID flag is
12210 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 6c   set, then the l
12220 61 73 74 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74  ast byte of.** t
12230 68 65 20 68 65 61 64 65 72 20 6f 66 20 70 4b 65  he header of pKe
12240 79 31 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  y1 is ignored.  
12250 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
12260 61 74 20 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61  at pKey1 is.** a
12270 6e 20 69 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64  n index key, and
12280 20 74 68 75 73 20 65 6e 64 73 20 77 69 74 68 20   thus ends with 
12290 61 20 72 6f 77 69 64 20 76 61 6c 75 65 2e 20 20  a rowid value.  
122a0 54 68 65 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a  The last byte.**
122b0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 77   of the header w
122c0 69 6c 6c 20 74 68 65 72 65 66 6f 72 65 20 62 65  ill therefore be
122d0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
122e0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a   of the rowid:.*
122f0 2a 20 6f 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33  * one of 1, 2, 3
12300 2c 20 34 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72  , 4, 5, 6, 8, or
12310 20 39 20 2d 20 74 68 65 20 69 6e 74 65 67 65 72   9 - the integer
12320 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
12330 2a 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  * The serial typ
12340 65 20 6f 66 20 74 68 65 20 66 69 6e 61 6c 20 72  e of the final r
12350 6f 77 69 64 20 77 69 6c 6c 20 61 6c 77 61 79 73  owid will always
12360 20 62 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74   be a single byt
12370 65 2e 0a 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e  e..** By ignorin
12380 67 20 74 68 69 73 20 6c 61 73 74 20 62 79 74 65  g this last byte
12390 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2c 20   of the header, 
123a0 77 65 20 66 6f 72 63 65 20 74 68 65 20 63 6f 6d  we force the com
123b0 70 61 72 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67  parison.** to ig
123c0 6e 6f 72 65 20 74 68 65 20 72 6f 77 69 64 20 61  nore the rowid a
123d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 6b 65 79  t the end of key
123e0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
123f0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
12400 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  re(.  int nKey1,
12410 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
12420 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
12430 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
12440 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
12450 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
12460 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20  */.){.  int d1; 
12470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
12480 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
12490 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
124a0 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
124b0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
124c0 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
124d0 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
124e0 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
124f0 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
12500 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12510 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
12520 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
12530 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20    int nField;.  
12540 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
12550 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12560 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
12570 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
12580 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
12590 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
125a0 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
125b0 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
125c0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31  pKeyInfo;.  mem1
125d0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
125e0 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
125f0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
12600 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30    mem1.flags = 0
12610 3b 0a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  ;.  mem1.u.i = 0
12620 3b 20 20 2f 2a 20 6e 6f 74 20 6e 65 65 64 65 64  ;  /* not needed
12630 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
12640 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
12650 6e 67 20 2a 2f 0a 20 20 6d 65 6d 31 2e 7a 4d 61  ng */.  mem1.zMa
12660 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 0a 20 20 69  lloc = 0;.  .  i
12670 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
12680 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
12690 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b  ;.  d1 = szHdr1;
126a0 0a 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 66  .  if( pPKey2->f
126b0 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f  lags & UNPACKED_
126c0 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 29 7b 0a  IGNORE_ROWID ){.
126d0 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b 0a 20 20      szHdr1--;.  
126e0 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65  }.  nField = pKe
126f0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20  yInfo->nField;. 
12700 20 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48   while( idx1<szH
12710 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
12720 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20 20 75  >nField ){.    u
12730 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
12740 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
12750 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
12760 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
12770 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
12780 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
12790 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
127a0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
127b0 74 79 70 65 31 20 29 3b 0a 20 20 20 20 69 66 28  type1 );.    if(
127c0 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 73 71   d1>=nKey1 && sq
127d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
127e0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
127f0 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b 3b 0a  pe1)>0 ) break;.
12800 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
12810 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
12820 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
12830 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
12840 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
12850 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
12860 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
12870 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
12880 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
12890 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
128a0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
128b0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
128c0 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Mem[i],.        
128d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128e0 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f 20 70 4b     i<nField ? pK
128f0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
12900 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72   : 0);.    if( r
12910 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  c!=0 ){.      br
12920 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
12930 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 65  ++;.  }.  if( me
12940 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  m1.zMalloc ) sql
12950 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
12960 73 65 28 26 6d 65 6d 31 29 3b 0a 0a 20 20 2f 2a  se(&mem1);..  /*
12970 20 49 66 20 74 68 65 20 50 52 45 46 49 58 5f 53   If the PREFIX_S
12980 45 41 52 43 48 20 66 6c 61 67 20 69 73 20 73 65  EARCH flag is se
12990 74 20 61 6e 64 20 61 6c 6c 20 66 69 65 6c 64 73  t and all fields
129a0 20 65 78 63 65 70 74 20 74 68 65 20 66 69 6e 61   except the fina
129b0 6c 0a 20 20 2a 2a 20 72 6f 77 69 64 20 66 69 65  l.  ** rowid fie
129c0 6c 64 20 77 65 72 65 20 65 71 75 61 6c 2c 20 74  ld were equal, t
129d0 68 65 6e 20 63 6c 65 61 72 20 74 68 65 20 50 52  hen clear the PR
129e0 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67  EFIX_SEARCH flag
129f0 20 61 6e 64 20 73 65 74 20 0a 20 20 2a 2a 20 70   and set .  ** p
12a00 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20  PKey2->rowid to 
12a10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12a20 20 72 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20   rowid field in 
12a30 28 70 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a  (pKey1, nKey1)..
12a40 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65    ** This is use
12a50 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 6e  d by the OP_IsUn
12a60 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a  ique opcode..  *
12a70 2f 0a 20 20 69 66 28 20 28 70 50 4b 65 79 32 2d  /.  if( (pPKey2-
12a80 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45  >flags & UNPACKE
12a90 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 29  D_PREFIX_SEARCH)
12aa0 20 26 26 20 69 3d 3d 28 70 50 4b 65 79 32 2d 3e   && i==(pPKey2->
12ab0 6e 46 69 65 6c 64 2d 31 29 20 29 7b 0a 20 20 20  nField-1) ){.   
12ac0 20 61 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73   assert( idx1==s
12ad0 7a 48 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20  zHdr1 && rc );. 
12ae0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
12af0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
12b00 29 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 66  );.    pPKey2->f
12b10 6c 61 67 73 20 26 3d 20 7e 55 4e 50 41 43 4b 45  lags &= ~UNPACKE
12b20 44 5f 50 52 45 46 49 58 5f 53 45 41 52 43 48 3b  D_PREFIX_SEARCH;
12b30 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 72 6f 77  .    pPKey2->row
12b40 69 64 20 3d 20 6d 65 6d 31 2e 75 2e 69 3b 0a 20  id = mem1.u.i;. 
12b50 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 30 20   }..  if( rc==0 
12b60 29 7b 0a 20 20 20 20 2f 2a 20 72 63 3d 3d 30 20  ){.    /* rc==0 
12b70 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
12b80 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
12b90 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
12ba0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 6c 6c  s and.    ** all
12bb0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
12bc0 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
12bd0 65 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20  e equal. If the 
12be0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59  UNPACKED_INCRKEY
12bf0 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
12c00 73 65 74 2c 20 74 68 65 6e 20 62 72 65 61 6b 20  set, then break 
12c10 74 68 65 20 74 69 65 20 62 79 20 74 72 65 61 74  the tie by treat
12c20 69 6e 67 20 6b 65 79 32 20 61 73 20 6c 61 72 67  ing key2 as larg
12c30 65 72 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68  er..    ** If th
12c40 65 20 55 50 41 43 4b 45 44 5f 50 52 45 46 49 58  e UPACKED_PREFIX
12c50 5f 4d 41 54 43 48 20 66 6c 61 67 20 69 73 20 73  _MATCH flag is s
12c60 65 74 2c 20 74 68 65 6e 20 6b 65 79 73 20 77 69  et, then keys wi
12c70 74 68 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 69 78  th common prefix
12c80 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 63 6f  es.    ** are co
12c90 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 65  nsidered to be e
12ca0 71 75 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  qual.  Otherwise
12cb0 2c 20 74 68 65 20 6c 6f 6e 67 65 72 20 6b 65 79  , the longer key
12cc0 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   is the .    ** 
12cd0 6c 61 72 67 65 72 2e 20 20 41 73 20 69 74 20 68  larger.  As it h
12ce0 61 70 70 65 6e 73 2c 20 74 68 65 20 70 50 4b 65  appens, the pPKe
12cf0 79 32 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  y2 will always b
12d00 65 20 74 68 65 20 6c 6f 6e 67 65 72 0a 20 20 20  e the longer.   
12d10 20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20   ** if there is 
12d20 61 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  a difference..  
12d30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 4b    */.    if( pPK
12d40 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50  ey2->flags & UNP
12d50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 20 29 7b  ACKED_INCRKEY ){
12d60 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a  .      rc = -1;.
12d70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
12d80 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e  Key2->flags & UN
12d90 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41  PACKED_PREFIX_MA
12da0 54 43 48 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  TCH ){.      /* 
12db0 4c 65 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20  Leave rc==0 */. 
12dc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 78     }else if( idx
12dd0 31 3c 73 7a 48 64 72 31 20 29 7b 0a 20 20 20 20  1<szHdr1 ){.    
12de0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
12df0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
12e00 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
12e10 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e   && i<pKeyInfo->
12e20 6e 46 69 65 6c 64 0a 20 20 20 20 20 20 20 20 20  nField.         
12e30 20 20 20 20 20 20 26 26 20 70 4b 65 79 49 6e 66        && pKeyInf
12e40 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  o->aSortOrder[i]
12e50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 63   ){.    rc = -rc
12e60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
12e70 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70  rc;.}. ../*.** p
12e80 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
12e90 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
12ea0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
12eb0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
12ec0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
12ed0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
12ee0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
12ef0 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
12f00 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
12f10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
12f20 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
12f30 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
12f40 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
12f50 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
12f60 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
12f70 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
12f80 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
12f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
12fa0 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
12fb0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
12fc0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
12fd0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
12fe0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
12ff0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
13000 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Rowid(BtCursor *
13010 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
13020 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
13030 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
13040 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
13050 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
13060 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
13070 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
13080 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
13090 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
130a0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
130b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
130c0 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
130d0 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
130e0 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
130f0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
13100 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
13110 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
13120 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
13130 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
13140 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
13150 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
13160 70 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  ption */.  sqlit
13170 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
13180 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
13190 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
131a0 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
131b0 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
131c0 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ff) ){.    retur
131d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
131e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
131f0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
13200 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
13210 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
13220 20 2a 2f 0a 20 20 6d 2e 66 6c 61 67 73 20 3d 20   */.  m.flags = 
13230 30 3b 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20  0;.  m.db = 0;. 
13240 20 6d 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a   m.zMalloc = 0;.
13250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
13260 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
13270 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65  Cur, 0, (int)nCe
13280 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
13290 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
132a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
132b0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
132c0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
132d0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
132e0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
132f0 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
13300 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
13310 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 32 20  tcase( szHdr==2 
13320 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
13330 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
13340 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
13350 72 3c 32 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<2 || (int)szHd
13360 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
13370 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
13380 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
13390 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
133a0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
133b0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
133c0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
133d0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
133e0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
133f0 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
13400 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
13410 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
13420 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
13430 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
13440 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
13450 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
13460 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
13470 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
13480 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
13490 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
134a0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
134b0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
134c0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
134d0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
134e0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
134f0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
13500 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
13510 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
13520 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
13530 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
13540 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
13550 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
13560 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
13570 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
13580 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
13590 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
135a0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b  eLen(typeRowid);
135b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 6e  .  testcase( m.n
135c0 2d 6c 65 6e 52 6f 77 69 64 3d 3d 73 7a 48 64 72  -lenRowid==szHdr
135d0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
135e0 6c 79 28 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 3c  ly(m.n-lenRowid<
135f0 73 7a 48 64 72 29 20 29 7b 0a 20 20 20 20 67 6f  szHdr) ){.    go
13600 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
13610 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
13620 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
13630 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
13640 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
13650 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
13660 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
13670 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
13680 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
13690 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
136a0 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
136b0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
136c0 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
136d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
136e0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
136f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13700 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
13710 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
13720 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
13730 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
13740 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
13750 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
13760 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
13770 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
13780 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29  ( m.zMalloc!=0 )
13790 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
137a0 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
137b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
137c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
137d0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
137e0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
137f0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
13800 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
13810 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74   to against.** t
13820 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e  he key string in
13830 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 68   pKey (of length
13840 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 69   nKey).  Write i
13850 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62  nto *pRes a numb
13860 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65  er.** that is ne
13870 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
13880 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20   positive if pC 
13890 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
138a0 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72  ual to,.** or gr
138b0 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 2e  eater than pKey.
138c0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
138d0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
138e0 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 74  *.** pKey is eit
138f0 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
13900 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
13910 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
13920 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
13930 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
13940 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
13950 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
13960 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
13970 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
13980 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
13990 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
139a0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
139b0 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
139c0 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
139d0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
139e0 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
139f0 65 79 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63  ey..**.** pUnpac
13a00 6b 65 64 20 6d 61 79 20 62 65 20 61 6e 20 75 6e  ked may be an un
13a10 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
13a20 66 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 49 66  f pKey,nKey.  If
13a30 20 70 55 6e 70 61 63 6b 65 64 20 69 73 0a 2a 2a   pUnpacked is.**
13a40 20 73 75 70 70 6c 69 65 64 20 69 74 20 69 73 20   supplied it is 
13a50 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
13a60 20 70 4b 65 79 2c 6e 4b 65 79 2e 0a 2a 2f 0a 69   pKey,nKey..*/.i
13a70 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
13a80 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56  xKeyCompare(.  V
13a90 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
13aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
13ab0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
13ac0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
13ad0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
13ae0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 2f 2a 20  *pUnpacked,  /* 
13af0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
13b00 20 6f 66 20 70 4b 65 79 20 61 6e 64 20 6e 4b 65   of pKey and nKe
13b10 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  y */.  int *res 
13b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b30 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
13b40 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
13b50 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
13b60 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
13b70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
13b80 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
13b90 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
13ba0 20 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74   m;..  sqlite3Bt
13bb0 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c  reeKeySize(pCur,
13bc0 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 69   &nCellKey);.  i
13bd0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c  f( nCellKey<=0 |
13be0 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66  | nCellKey>0x7ff
13bf0 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65  fffff ){.    *re
13c00 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
13c10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13c20 0a 20 20 6d 2e 64 62 20 3d 20 30 3b 0a 20 20 6d  .  m.db = 0;.  m
13c30 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 6d 2e  .flags = 0;.  m.
13c40 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 72  zMalloc = 0;.  r
13c50 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
13c60 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e  emFromBtree(pC->
13c70 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 69 6e 74  pCursor, 0, (int
13c80 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
13c90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
13ca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13cb0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 55 6e 70  }.  assert( pUnp
13cc0 61 63 6b 65 64 2d 3e 66 6c 61 67 73 20 26 20 55  acked->flags & U
13cd0 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52  NPACKED_IGNORE_R
13ce0 4f 57 49 44 20 29 3b 0a 20 20 2a 72 65 73 20 3d  OWID );.  *res =
13cf0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
13d00 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
13d10 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
13d20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
13d30 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
13d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13d60 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
13d70 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
13d80 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
13d90 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
13da0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
13db0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13dc0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
13dd0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
13de0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
13df0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
13e00 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
13e10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13e20 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
13e30 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
13e40 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
13e50 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
13e60 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
13e70 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
13e80 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
13e90 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
13ea0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
13eb0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
13ec0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
13ed0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
13ee0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
13ef0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
13f00 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
13f10 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
13f20 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
13f30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
13f40 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
13f50 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
13f60 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
13f70 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
13f80 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
13f90 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
13fa0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
13fb0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
13fc0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
13fd0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
13fe0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
13ff0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
14000 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
14010 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
14020 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
14030 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
14040 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
14050 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
14060 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
14070 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
14080 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
14090 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
140a0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
140b0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
140c0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
140d0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
140e0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
140f0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
14100 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
14110 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
14120 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
14130 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
14140 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
14150 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
14160 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
14170 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
14180 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
14190 2d 3e 64 62 3b 0a 7d 0a                          ->db;.}.