/ Hex Artifact Content
Login

Artifact 236cc1afd82ab542fc752ed760471ac816cb7902:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73  ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63  qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22  lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74   new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f  abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64  .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a  beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a  >db;.  Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d    p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20  zeof(Vdbe) );.  
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  n 0;.  p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  b;.  if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56  be ){.    db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d    }.  p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d   db->pVdbe;.  p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62  >pPrev = 0;.  db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70  ->pVdbe = p;.  p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e  AGIC_INIT;.  p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a  e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20  ->nLabel==0 );. 
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68  *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72  e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c  qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29  int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72  {.  assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73  epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a  PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50  LLOG).  if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72  repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  n;.#endif.  asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29  rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71  ;.  p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70  lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70  ->db, z, n);.  p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20  ->isPrepareV2 = 
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b  (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61   the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61  ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f  red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33  ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65   Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75   *)pStmt;.  retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72  rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53  epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e   Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44  t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a  BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c  beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64   Vdbe *pB){.  Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20  be tmp, *pTmp;. 
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61   char *zTmp;.  a
0780: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70  ssert( pA->db==p
0790: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d  B->db );.  tmp =
07a0: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70   *pA;.  *pA = *p
07b0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a  B;.  *pB = tmp;.
07c0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65    pTmp = pA->pNe
07d0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20  xt;.  pA->pNext 
07e0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70  = pB->pNext;.  p
07f0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b  B->pNext = pTmp;
0800: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50  .  pTmp = pA->pP
0810: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76  rev;.  pA->pPrev
0820: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20   = pB->pPrev;.  
0830: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70  pB->pPrev = pTmp
0840: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a  ;.  zTmp = pA->z
0850: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20  Sql;.  pA->zSql 
0860: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42  = pB->zSql;.  pB
0870: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20  ->zSql = zTmp;. 
0880: 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65 56 32   pB->isPrepareV2
0890: 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61 72 65   = pA->isPrepare
08a0: 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  V2;.}../*.** Res
08b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70  ize the Vdbe.aOp
08c0: 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 69   array so that i
08d0: 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e 4f  t is at least nO
08e0: 70 20 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65  p elements large
08f0: 72 20 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20 63  r .** than its c
0900: 75 72 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70  urrent size. nOp
0910: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
0920: 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  o be less than o
0930: 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30  r equal.** to 10
0940: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a  24/sizeof(Op)..*
0950: 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f  *.** If an out-o
0960: 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f  f-memory error o
0970: 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 69  ccurs while resi
0980: 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20  zing the array, 
0990: 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
09a0: 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20  _NOMEM. In this 
09b0: 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e  case Vdbe.aOp an
09c0: 64 20 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f 63  d Parse.nOpAlloc
09d0: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68   remain .** unch
09e0: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73  anged (this is s
09f0: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64  o that any opcod
0a00: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63  es already alloc
0a10: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20  ated can be .** 
0a20: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f  correctly deallo
0a30: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
0a40: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
0a50: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   Vdbe)..*/.stati
0a60: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61  c int growOpArra
0a70: 79 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e  y(Vdbe *v, int n
0a80: 4f 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70  Op){.  VdbeOp *p
0a90: 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 20  New;.  Parse *p 
0aa0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20  = v->pParse;..  
0ab0: 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 54 45  /* The SQLITE_TE
0ac0: 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53  ST_REALLOC_STRES
0ad0: 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  S compile-time o
0ae0: 70 74 69 6f 6e 20 69 73 20 64 65 73 69 67 6e 65  ption is designe
0af0: 64 20 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a 20  d to force.  ** 
0b00: 6d 6f 72 65 20 66 72 65 71 75 65 6e 74 20 72 65  more frequent re
0b10: 61 6c 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63 65  allocs and hence
0b20: 20 70 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f 70   provide more op
0b30: 70 6f 72 74 75 6e 69 74 69 65 73 20 66 6f 72 20  portunities for 
0b40: 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20  .  ** simulated 
0b50: 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 20 53 51 4c  OOM faults.  SQL
0b60: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0b70: 5f 53 54 52 45 53 53 20 69 73 20 67 65 6e 65 72  _STRESS is gener
0b80: 61 6c 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20 64  ally used.  ** d
0b90: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e  uring testing on
0ba0: 6c 79 2e 20 20 57 69 74 68 20 53 51 4c 49 54 45  ly.  With SQLITE
0bb0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
0bc0: 52 45 53 53 20 67 72 6f 77 20 74 68 65 20 6f 70  RESS grow the op
0bd0: 20 61 72 72 61 79 0a 20 20 2a 2a 20 62 79 20 74   array.  ** by t
0be0: 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75  he minimum* amou
0bf0: 6e 74 20 72 65 71 75 69 72 65 64 20 75 6e 74 69  nt required unti
0c00: 6c 20 74 68 65 20 73 69 7a 65 20 72 65 61 63 68  l the size reach
0c10: 65 73 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a  es 512.  Normal.
0c20: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 28    ** operation (
0c30: 77 69 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 54  without SQLITE_T
0c40: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0c50: 53 53 29 20 69 73 20 74 6f 20 64 6f 75 62 6c 65  SS) is to double
0c60: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
0c70: 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 70  * size of the op
0c80: 20 61 72 72 61 79 20 6f 72 20 61 64 64 20 31 4b   array or add 1K
0c90: 42 20 6f 66 20 73 70 61 63 65 2c 20 77 68 69 63  B of space, whic
0ca0: 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
0cb0: 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
0cc0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cd0: 53 54 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e 65  STRESS.  int nNe
0ce0: 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  w = (p->nOpAlloc
0cf0: 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41 6c  >=512 ? p->nOpAl
0d00: 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41 6c  loc*2 : p->nOpAl
0d10: 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a  loc+nOp);.#else.
0d20: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d    int nNew = (p-
0d30: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e  >nOpAlloc ? p->n
0d40: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74  OpAlloc*2 : (int
0d50: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  )(1024/sizeof(Op
0d60: 29 29 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  )));.  UNUSED_PA
0d70: 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23 65  RAMETER(nOp);.#e
0d80: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
0d90: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f  nOp<=(1024/sizeo
0da0: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65  f(Op)) );.  asse
0db0: 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e 4f  rt( nNew>=(p->nO
0dc0: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20  pAlloc+nOp) );. 
0dd0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
0de0: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20  bRealloc(p->db, 
0df0: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a  v->aOp, nNew*siz
0e00: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20  eof(Op));.  if( 
0e10: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  pNew ){.    p->n
0e20: 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65  OpAlloc = sqlite
0e30: 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d  3DbMallocSize(p-
0e40: 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a 65 6f  >db, pNew)/sizeo
0e50: 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61 4f  f(Op);.    v->aO
0e60: 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  p = pNew;.  }.  
0e70: 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53  return (pNew ? S
0e80: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
0e90: 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 23 69 66  E_NOMEM);.}..#if
0ea0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
0eb0: 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ./* This routine
0ec0: 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65   is just a conve
0ed0: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
0ee0: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
0ef0: 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72  that will.** fir
0f00: 65 20 61 66 74 65 72 20 65 61 63 68 20 6f 70 63  e after each opc
0f10: 6f 64 65 20 69 73 20 69 6e 73 65 72 74 65 64 20  ode is inserted 
0f20: 61 6e 64 20 64 69 73 70 6c 61 79 65 64 20 75 73  and displayed us
0f30: 69 6e 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76  ing.** "PRAGMA v
0f40: 64 62 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f  dbe_addoptrace=o
0f50: 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  n"..*/.static vo
0f60: 69 64 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72  id test_addop_br
0f70: 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a  eakpoint(void){.
0f80: 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d    static int n =
0f90: 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e   0;.  n++;.}.#en
0fa0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  dif../*.** Add a
0fb0: 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e   new instruction
0fc0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
0fd0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72  instructions cur
0fe0: 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56  rent in the.** V
0ff0: 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65  DBE.  Return the
1000: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
1010: 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  new instruction.
1020: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
1030: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20  s:.**.**    p   
1040: 20 20 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e              Poin
1050: 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a  ter to the VDBE.
1060: 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20  **.**    op     
1070: 20 20 20 20 20 20 20 20 20 54 68 65 20 6f 70 63           The opc
1080: 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73  ode for this ins
1090: 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20  truction.**.**  
10a0: 20 20 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20    p1, p2, p3    
10b0: 20 20 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a    Operands.**.**
10c0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
10d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66  () function to f
10f0: 69 78 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e  ix an address an
1100: 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  d.** the sqlite3
1110: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 66  VdbeChangeP4() f
1120: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67  unction to chang
1130: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
1140: 68 65 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64  he P4.** operand
1150: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1160: 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65 20  VdbeAddOp3(Vdbe 
1170: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1180: 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20  p1, int p2, int 
1190: 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p3){.  int i;.  
11a0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20  VdbeOp *pOp;..  
11b0: 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73  i = p->nOp;.  as
11c0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
11d0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
11e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e  );.  assert( op>
11f0: 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a  0 && op<0xff );.
1200: 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73 65 2d    if( p->pParse-
1210: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a  >nOpAlloc<=i ){.
1220: 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72      if( growOpAr
1230: 72 61 79 28 70 2c 20 31 29 20 29 7b 0a 20 20 20  ray(p, 1) ){.   
1240: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1250: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b   }.  }.  p->nOp+
1260: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
1270: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
1280: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20  code = (u8)op;. 
1290: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20   pOp->p5 = 0;.  
12a0: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
12b0: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
12c0: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20  pOp->p3 = p3;.  
12d0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
12e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
12f0: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  4_NOTUSED;.#ifde
1300: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1310: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
1320: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  .  pOp->zComment
1330: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
1340: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1350: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
1360: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
1370: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
1380: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20     int jj, kk;. 
1390: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
13a0: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
13b0: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a    for(jj=kk=0; j
13c0: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  j<SQLITE_N_COLCA
13d0: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  CHE; jj++){.    
13e0: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13f0: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e  he *x = pParse->
1400: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a  aColCache + jj;.
1410: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65        if( x->iLe
1420: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1430: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52  heLevel || x->iR
1440: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  eg==0 ) continue
1450: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
1460: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c   r[%d]={%d:%d}",
1470: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61   x->iReg, x->iTa
1480: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29  ble, x->iColumn)
1490: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20  ;.      kk++;.  
14a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29    }.    if( kk )
14b0: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
14c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
14d0: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
14e0: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73  aOp[i]);.    tes
14f0: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1500: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  nt();.  }.#endif
1510: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
1520: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c  FILE.  pOp->cycl
1530: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63  es = 0;.  pOp->c
1540: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
1550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1560: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70  E_COVERAGE.  pOp
1570: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a  ->iSrcLine = 0;.
1580: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1590: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
15a0: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
15b0: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
15c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
15d0: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
15e0: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
15f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1600: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1610: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1620: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1630: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1640: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
1650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1660: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
1670: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
1680: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1690: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
16a0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
16b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  }.../*.** Add an
16c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
16d0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
16e0: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e  ue as a pointer.
16f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1700: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62  dbeAddOp4(.  Vdb
1710: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1720: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f   /* Add the opco
1730: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f  de to this VM */
1740: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
1750: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
1760: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  w opcode */.  in
1770: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20  t p1,           
1780: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72    /* The P1 oper
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c  and */.  int p2,
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a  The P2 operand *
17c0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20  /.  int p3,     
17d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
17e0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63  3 operand */.  c
17f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
1800: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65     /* The P4 ope
1810: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
1820: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a  type          /*
1830: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65   P4 operand type
1840: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
1850: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1860: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1870: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
1880: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1890: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34  p, addr, zP4, p4
18a0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  type);.  return 
18b0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
18c0: 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63  dd an OP_ParseSc
18d0: 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68  hema opcode.  Th
18e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72  is routine is br
18f0: 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a  oken out from.**
1900: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1910: 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65  p4() since it ne
1920: 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64  eds to also need
1930: 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74  s to mark all bt
1940: 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e  rees.** as havin
1950: 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a  g been used..**.
1960: 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74  ** The zWhere st
1970: 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62  ring must have b
1980: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  een obtained fro
1990: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
19a0: 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ()..** This rout
19b0: 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77  ine will take ow
19c0: 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61  nership of the a
19d0: 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
19e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19f0: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1a00: 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  maOp(Vdbe *p, in
1a10: 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68  t iDb, char *zWh
1a20: 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  ere){.  int j;. 
1a30: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1a40: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1a50: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
1a60: 20 69 44 62 2c 20 30 2c 20 30 29 3b 0a 20 20 73   iDb, 0, 0);.  s
1a70: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
1a80: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 57 68 65  P4(p, addr, zWhe
1a90: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
1aa0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
1ab0: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
1ac0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
1ad0: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
1ae0: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
1af0: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
1b00: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
1b10: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
1b20: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1b30: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
1b40: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
1b50: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
1b60: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
1b70: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
1b80: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
1b90: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
1ba0: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
1bb0: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
1bc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1be0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
1bf0: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
1c00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
1c10: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1c20: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
1c30: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
1c40: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
1c50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
1c60: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1c70: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1c80: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
1c90: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
1ca0: 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45 5f  p, addr, SQLITE_
1cb0: 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20  INT_TO_PTR(p4), 
1cc0: 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65 74  P4_INT32);.  ret
1cd0: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1ce0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1cf0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
1d00: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
1d10: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
1d20: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
1d30: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
1d40: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
1d50: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
1d60: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
1d70: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
1d80: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
1d90: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
1da0: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
1db0: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
1dc0: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
1dd0: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
1de0: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
1df0: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
1e00: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
1e10: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
1e20: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
1e30: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
1e40: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
1e50: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
1e60: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
1e70: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
1e80: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
1e90: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
1ea0: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
1eb0: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
1ec0: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
1ed0: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
1ee0: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
1ef0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
1f00: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
1f10: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
1f20: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
1f30: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
1f40: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
1f50: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1f60: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
1f70: 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73  Vdbe *v){.  Pars
1f80: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
1f90: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e  ;.  int i = p->n
1fa0: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
1fb0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
1fc0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1fd0: 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29    if( (i & (i-1)
1fe0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61  )==0 ){.    p->a
1ff0: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
2000: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
2010: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
2020: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29           (i*2+1)
2050: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
2060: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
2070: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
2080: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
2090: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
20a0: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn -1-i;.}../*.*
20b0: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20  * Resolve label 
20c0: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64  "x" to be the ad
20d0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
20e0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
20f0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e  .** be inserted.
2100: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20    The parameter 
2110: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65  "x" must have be
2120: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2130: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  .** a prior call
2140: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d   to sqlite3VdbeM
2150: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76  akeLabel()..*/.v
2160: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
2170: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65  esolveLabel(Vdbe
2180: 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50   *v, int x){.  P
2190: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
21a0: 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 2d  rse;.  int j = -
21b0: 31 2d 78 3b 0a 20 20 61 73 73 65 72 74 28 20 76  1-x;.  assert( v
21c0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
21d0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
21e0: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65  sert( j<p->nLabe
21f0: 6c 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  l );.  if( ALWAY
2200: 53 28 6a 3e 3d 30 29 20 26 26 20 70 2d 3e 61 4c  S(j>=0) && p->aL
2210: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2220: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f  Label[j] = v->nO
2230: 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69 78  p;.  }.  p->iFix
2240: 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d 20  edOp = v->nOp - 
2250: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
2260: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
2270: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
2280: 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e 0a  e run one time..
2290: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22a0: 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28 56  dbeRunOnlyOnce(V
22b0: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
22c0: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a 7d  nOnlyOnce = 1;.}
22d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
22e0: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
22f0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
2300: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
2310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2320: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
2330: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
2340: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
2350: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
2360: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
2370: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
2380: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
2390: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
23a0: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
23b0: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
23c0: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
23d0: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
23e0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
23f0: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
2400: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
2410: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
2420: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
2430: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
2440: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
2470: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
2480: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
2490: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
24a0: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
24b0: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
24c0: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
24d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
24e0: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
24f0: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
2500: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
2510: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
2520: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
2530: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
2560: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
2570: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
2580: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
2590: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
25a0: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
25b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
25e0: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
25f0: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
2620: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
2630: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
2640: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
2650: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
2660: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
2670: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
2680: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
2690: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
26a0: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
26b0: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
26c0: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
26d0: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
26e0: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
26f0: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
2700: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
2710: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
2720: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
2730: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
2740: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
2750: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
2760: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
2770: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
2780: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
2790: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
27a0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
27b0: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
27c0: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
27d0: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
27e0: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
27f0: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
2800: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
2810: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
2820: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
2830: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
2840: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
2850: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
2860: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
2870: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
2880: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
2890: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
28a0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
28b0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
28c0: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
28d0: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
28e0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
28f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2900: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
2910: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
2920: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
2930: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
2940: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
2950: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
2960: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
2970: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
2980: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2990: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
29a0: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
29b0: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
29c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
29e0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
29f0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
2a00: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
2a10: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
2a20: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
2a30: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
2a40: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
2a50: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
2a60: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
2a70: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
2a80: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
2a90: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
2aa0: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
2ab0: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
2ac0: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
2ad0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
2ae0: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
2af0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2b00: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
2b10: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
2b20: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
2b30: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
2b40: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
2b50: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
2b60: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
2b70: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
2b80: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
2b90: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
2ba0: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
2bb0: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
2bc0: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
2bd0: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
2be0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
2bf0: 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a 2a 20 54 68  traint).**.** Th
2c00: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
2c10: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
2c20: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
2c30: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
2c40: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
2c50: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
2c60: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
2c70: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
2c80: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
2c90: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
2ca0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
2cb0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
2cc0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
2cd0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
2ce0: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
2cf0: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
2d00: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
2d10: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
2d20: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
2d30: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
2d40: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
2d50: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
2d60: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
2d70: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
2d80: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
2d90: 72 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  rt = 0;.  Op *pO
2da0: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2db0: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2dc0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2dd0: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2de0: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2df0: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2e00: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2e10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2e20: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2e30: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2e40: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2e50: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2e60: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2e70: 50 5f 56 52 65 6e 61 6d 65 20 0a 23 69 66 6e 64  P_VRename .#ifnd
2e80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
2e90: 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 20  OREIGN_KEY.     
2ea0: 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  || (opcode==OP_F
2eb0: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d  kCounter && pOp-
2ec0: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70  >p1==0 && pOp->p
2ed0: 32 3d 3d 31 29 20 0a 23 65 6e 64 69 66 0a 20 20  2==1) .#endif.  
2ee0: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
2ef0: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
2f00: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
2f10: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
2f20: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
2f30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
2f40: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
2f50: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
2f60: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
2f70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2f80: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
2f90: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2fa0: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20  Iter.apSub);..  
2fb0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
2fc0: 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  f hasAbort==mayA
2fd0: 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61  bort. Or if a ma
2fe0: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63  lloc failure occ
2ff0: 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d  urred..  ** If m
3000: 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68  alloc failed, th
3010: 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c  en the while() l
3020: 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f  oop above may no
3030: 74 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a  t have iterated.
3040: 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c    ** through all
3050: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73   opcodes and has
3060: 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74  Abort may be set
3070: 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65   incorrectly. Re
3080: 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66  turn.  ** true f
3090: 6f 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20  or this case to 
30a0: 70 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65  prevent the asse
30b0: 72 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c  rt() in the call
30c0: 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66  ers frame.  ** f
30d0: 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f  rom failing.  */
30e0: 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64  .  return ( v->d
30f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
3100: 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79  || hasAbort==may
3110: 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69  Abort );.}.#endi
3120: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3130: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3140: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3150: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3160: 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  ** Loop through 
3170: 74 68 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b  the program look
3180: 69 6e 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65  ing for P2 value
3190: 73 20 74 68 61 74 20 61 72 65 20 6e 65 67 61 74  s that are negat
31a0: 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69  ive.** on jump i
31b0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61  nstructions.  Ea
31c0: 63 68 20 73 75 63 68 20 76 61 6c 75 65 20 69 73  ch such value is
31d0: 20 61 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c   a label.  Resol
31e0: 76 65 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20  ve the.** label 
31f0: 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
3200: 32 20 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63  2 value to its c
3210: 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20  orrect non-zero 
3220: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  value..**.** Thi
3230: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
3240: 6c 65 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61  led once after a
3250: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20  ll opcodes have 
3260: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a  been inserted..*
3270: 2a 0a 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70  *.** Variable *p
3280: 4d 61 78 46 75 6e 63 41 72 67 73 20 69 73 20 73  MaxFuncArgs is s
3290: 65 74 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  et to the maximu
32a0: 6d 20 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50  m value of any P
32b0: 32 20 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74  2 argument .** t
32c0: 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  o an OP_Function
32d0: 2c 20 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20  , OP_AggStep or 
32e0: 4f 50 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64  OP_VFilter opcod
32f0: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20  e. This is used 
3300: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  by .** sqlite3Vd
3310: 62 65 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f  beMakeReady() to
3320: 20 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61   size the Vdbe.a
3330: 70 41 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a  pArg[] array..**
3340: 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61  .** The Op.opfla
3350: 67 73 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  gs field is set 
3360: 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a  on all opcodes..
3370: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
3380: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56  esolveP2Values(V
3390: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61  dbe *p, int *pMa
33a0: 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e  xFuncArgs){.  in
33b0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41  t i;.  int nMaxA
33c0: 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41  rgs = *pMaxFuncA
33d0: 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a  rgs;.  Op *pOp;.
33e0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
33f0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = p->pParse;.  i
3400: 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61  nt *aLabel = pPa
3410: 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70  rse->aLabel;.  p
3420: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
3430: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
3440: 20 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d   0;.  for(pOp=p-
3450: 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31  >aOp, i=p->nOp-1
3460: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70  ; i>=0; i--, pOp
3470: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f  ++){.    u8 opco
3480: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3490: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20  ;..    /* NOTE: 
34a0: 42 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74  Be sure to updat
34b0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
34c0: 77 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72  when adding or r
34d0: 65 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63  emoving.    ** c
34e0: 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73  ases from this s
34f0: 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77  witch! */.    sw
3500: 69 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a  itch( opcode ){.
3510: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75        case OP_Fu
3520: 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61  nction:.      ca
3530: 73 65 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b  se OP_AggStep: {
3540: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
3550: 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p5>nMaxArgs ) 
3560: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
3570: 70 35 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  p5;.        brea
3580: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
3590: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
35a0: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
35b0: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
35c0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
35d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
35e0: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
35f0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
3600: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
3610: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
3620: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
3630: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
3640: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3650: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
3660: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
3670: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
3680: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
3690: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
36a0: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
36b0: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
36c0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
36d0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
36e0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
36f0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
3700: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
3710: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3720: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
3730: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
3740: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
3750: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
3760: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
3770: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
3780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3790: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
37a0: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
37b0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
37c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
37d0: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
37e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
37f0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
3800: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
3810: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
3820: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
3830: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
3840: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
3850: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
3860: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
3870: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
3880: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
3890: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
38a0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
38b0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
38c0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
38d0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
38e0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
38f0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
3900: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
3920: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
3930: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
3940: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
3950: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
3960: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
3970: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
3980: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
3990: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
39a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
39b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
39c0: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
39d0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
39e0: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
39f0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
3a00: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
3a10: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
3a20: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3a30: 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73  -1-pOp->p2<pPars
3a40: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
3a50: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
3a60: 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b  bel[-1-pOp->p2];
3a70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
3a80: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
3a90: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
3aa0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
3ab0: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
3ac0: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
3ad0: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
3ae0: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
3af0: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
3b00: 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c  r!=0 || DbMaskAl
3b10: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
3b20: 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sk) );.}../*.** 
3b30: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
3b40: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
3b50: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
3b60: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
3b70: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
3b80: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
3b90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
3ba0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
3bb0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
3bc0: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
3bd0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3be0: 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
3bf0: 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
3c00: 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f   of opcodes asso
3c10: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
3c20: 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
3c30: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
3c40: 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20  ment. It is the 
3c50: 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
3c60: 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72  bility.** to arr
3c70: 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65 74  ange for the ret
3c80: 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62  urned array to b
3c90: 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
3ca0: 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a  ed using the .**
3cb0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
3cc0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  () function..**.
3cd0: 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
3ce0: 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65  ing, *pnOp is se
3cf0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
3d00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3d10: 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72  e returned.** ar
3d20: 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61  ray. Also, *pnMa
3d30: 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20 74  xArg is set to t
3d40: 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73  he larger of its
3d50: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
3d60: 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  nd .** the numbe
3d70: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3d80: 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d  the Vdbe.apArg[]
3d90: 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64 20   array required 
3da0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 0a  to execute the .
3db0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67  ** returned prog
3dc0: 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ram..*/.VdbeOp *
3dd0: 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f  sqlite3VdbeTakeO
3de0: 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20  pArray(Vdbe *p, 
3df0: 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a  int *pnOp, int *
3e00: 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62  pnMaxArg){.  Vdb
3e10: 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f  eOp *aOp = p->aO
3e20: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70  p;.  assert( aOp
3e30: 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   && !p->db->mall
3e40: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f  ocFailed );..  /
3e50: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c  * Check that sql
3e60: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
3e70: 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c  e() was not call
3e80: 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f  ed on this VM */
3e90: 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61 73  .  assert( DbMas
3ea0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
3eb0: 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73  eMask) );..  res
3ec0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
3ed0: 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e  pnMaxArg);.  *pn
3ee0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70  Op = p->nOp;.  p
3ef0: 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74  ->aOp = 0;.  ret
3f00: 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aOp;.}../*.*
3f10: 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69  * Add a whole li
3f20: 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73  st of operations
3f30: 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
3f40: 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e  n stack.  Return
3f50: 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20   the.** address 
3f60: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  of the first ope
3f70: 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f  ration added..*/
3f80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
3f90: 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a  AddOpList(Vdbe *
3fa0: 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65  p, int nOp, Vdbe
3fb0: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
3fc0: 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b  p, int iLineno){
3fd0: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61  .  int addr;.  a
3fe0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
3ff0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4000: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
4010: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
4020: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
4030: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
4040: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
4050: 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20  n 0;.  }.  addr 
4060: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
4070: 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b  ALWAYS(nOp>0) ){
4080: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
4090: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
40a0: 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20   *pIn = aOp;.   
40b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
40c0: 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20   i++, pIn++){.  
40d0: 20 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e      int p2 = pIn
40e0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65  ->p2;.      Vdbe
40f0: 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61  Op *pOut = &p->a
4100: 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20  Op[i+addr];.    
4110: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d    pOut->opcode =
4120: 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pIn->opcode;.  
4130: 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70      pOut->p1 = p
4140: 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66  In->p1;.      if
4150: 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( p2<0 ){.      
4160: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4170: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
4180: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20  pOut->opcode] & 
4190: 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20  OPFLG_JUMP );.  
41a0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
41b0: 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29   addr + ADDR(p2)
41c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
41d0: 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20         pOut->p2 
41e0: 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = p2;.      }.  
41f0: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70      pOut->p3 = p
4200: 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f  In->p3;.      pO
4210: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  ut->p4type = P4_
4220: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70  NOTUSED;.      p
4230: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
4240: 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20       pOut->p5 = 
4250: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
4260: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
4270: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70  COMMENTS.      p
4280: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20  Out->zComment = 
4290: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  0;.#endif.#ifdef
42a0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
42b0: 45 52 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74  ERAGE.      pOut
42c0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
42d0: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
42e0: 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e      (void)iLinen
42f0: 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  o;.#endif.#ifdef
4300: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4310: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
4320: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
4330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
4340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
4350: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
4360: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
4370: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  addr]);.      }.
4380: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
4390: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a   p->nOp += nOp;.
43a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64    }.  return add
43b0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  r;.}../*.** Chan
43c0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
43d0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
43e0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
43f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4400: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4410: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4420: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4430: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
4440: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
4450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4460: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
4470: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
4480: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
4490: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
44a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44b0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
44c0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
44d0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
44e0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
44f0: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4500: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4510: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4520: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4530: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4540: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
4550: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
4560: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
4570: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
4580: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
4590: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
45a0: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
45b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
45c0: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
45d0: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
45e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
45f0: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4600: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4610: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4620: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4630: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4640: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
4650: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
4660: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
4670: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
4680: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4690: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
46a0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
46b0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
46c0: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
46d0: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
46e0: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
46f0: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4700: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4710: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4720: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4730: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4740: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4750: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4760: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4770: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4780: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4790: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
47a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
47b0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
47c0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
47d0: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
47e0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
47f0: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4800: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4810: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4820: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4830: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4850: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4860: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4870: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4880: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4890: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
48a0: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
48b0: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
48c0: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
48d0: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
48e0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
48f0: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
4900: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
4910: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
4920: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
4930: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
4940: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
4950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4960: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4970: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4980: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
4990: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
49a0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
49b0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
49c0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
49d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
49e0: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
49f0: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
4a00: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
4a10: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
4a20: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
4a30: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
4a40: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
4a50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a60: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
4a70: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
4a80: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
4a90: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
4aa0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
4ab0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
4ac0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
4ad0: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
4ae0: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
4af0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
4b00: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4b10: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
4b20: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4b30: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4b40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4b50: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4b60: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
4b70: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4b80: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4b90: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
4ba0: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
4bb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4bc0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4bd0: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
4be0: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4bf0: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4c00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
4c10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4c20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4c30: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4c40: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4c50: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4c60: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4c70: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4c90: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
4ca0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4cb0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
4cd0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
4ce0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
4cf0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
4d00: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
4d10: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
4d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
4d30: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
4d40: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20  lloc);.         
4d50: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4d60: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
4d70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4d80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4d90: 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20  se P4_VTAB : {. 
4da0: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
4db0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4dc0: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
4dd0: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29  ck((VTable *)p4)
4de0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4e00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
4e10: 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
4e20: 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64  ated for aOp and
4e30: 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61   any p4 values a
4e40: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
4e50: 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74  .** opcodes cont
4e60: 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66  ained within. If
4e70: 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c   aOp is not NULL
4e80: 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
4e90: 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f  o contain .** nO
4ea0: 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73  p entries. .*/.s
4eb0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
4ec0: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
4ed0: 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c  e3 *db, Op *aOp,
4ee0: 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28   int nOp){.  if(
4ef0: 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a   aOp ){.    Op *
4f00: 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70  pOp;.    for(pOp
4f10: 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e  =aOp; pOp<&aOp[n
4f20: 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  Op]; pOp++){.   
4f30: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4f40: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4f50: 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51  p4.p);.#ifdef SQ
4f60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4f70: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4f80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4f90: 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  (db, pOp->zComme
4fa0: 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20  nt);.#endif     
4fb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4fc0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
4fd0: 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69  Op);.}../*.** Li
4fe0: 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61  nk the SubProgra
4ff0: 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  m object passed 
5000: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
5010: 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20  gument into the 
5020: 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61  linked.** list a
5030: 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72  t Vdbe.pSubProgr
5040: 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73  am. This list is
5050: 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20   used to delete 
5060: 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a  all sub-program.
5070: 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20  ** objects when 
5080: 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e  the VM is no lon
5090: 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f  ger required..*/
50a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
50b0: 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28  eLinkSubProgram(
50c0: 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62  Vdbe *pVdbe, Sub
50d0: 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70  Program *p){.  p
50e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d  ->pNext = pVdbe-
50f0: 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64  >pProgram;.  pVd
5100: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70  be->pProgram = p
5110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
5120: 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20  e the opcode at 
5130: 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f  addr into OP_Noo
5140: 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  p.*/.void sqlite
5150: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5160: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  p(Vdbe *p, int a
5170: 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72  ddr){.  if( addr
5180: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56  <p->nOp ){.    V
5190: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
51a0: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20  >aOp[addr];.    
51b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
51c0: 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28  >db;.    freeP4(
51d0: 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c  db, pOp->p4type,
51e0: 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20   pOp->p4.p);.   
51f0: 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20   memset(pOp, 0, 
5200: 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b  sizeof(pOp[0]));
5210: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  .    pOp->opcode
5220: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
5230: 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70  if( addr==p->nOp
5240: 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20  -1 ) p->nOp--;. 
5250: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
5260: 76 65 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f  ve the last opco
5270: 64 65 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 69  de inserted.*/.i
5280: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  nt sqlite3VdbeDe
5290: 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28  letePriorOpcode(
52a0: 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b  Vdbe *p, u8 op){
52b0: 0a 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31  .  if( (p->nOp-1
52c0: 29 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  )>(p->pParse->iF
52d0: 69 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f  ixedOp) && p->aO
52e0: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f  p[p->nOp-1].opco
52f0: 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71  de==op ){.    sq
5300: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5310: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
5320: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  1);.    return 1
5330: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
5340: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5350: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
5360: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34   value of the P4
5370: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
5380: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
5390: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
53a0: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
53b0: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
53c0: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
53d0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
53e0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
53f0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
5400: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
5410: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
5420: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
5430: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a  e program..**.**
5440: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68   If n>=0 then th
5450: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20  e P4 operand is 
5460: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67  dynamic, meaning
5470: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a   that a copy of.
5480: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73  ** the string is
5490: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   made into memor
54a0: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
54b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
54c0: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20  ..** A value of 
54d0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20  n==0 means copy 
54e0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20  bytes of zP4 up 
54f0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67  to and including
5500: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75   the.** first nu
5510: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30  ll byte.  If n>0
5520: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62   then copy n+1 b
5530: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20  ytes of zP4..** 
5540: 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73  .** Other values
5550: 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43   of n (P4_STATIC
5560: 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63  , P4_COLLSEQ etc
5570: 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  .) indicate that
5580: 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zP4 points.** t
5590: 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74  o a string or st
55a0: 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
55b0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78  guaranteed to ex
55c0: 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65  ist for the life
55d0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56  time of.** the V
55e0: 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61  dbe. In these ca
55f0: 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20  ses we can just 
5600: 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72  copy the pointer
5610: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c  ..**.** If addr<
5620: 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34  0 then change P4
5630: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
5640: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69  ently inserted i
5650: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5660: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5670: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
5680: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
5690: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
56a0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
56b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
56c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
56d0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
56e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
56f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
5700: 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  T );.  if( p->aO
5710: 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p==0 || db->mall
5720: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
5730: 69 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29  if( n!=P4_VTAB )
5740: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64  {.      freeP4(d
5750: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63  b, n, (void*)*(c
5760: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20  har**)&zP4);.   
5770: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   }.    return;. 
5780: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
5790: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
57a0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29  t( addr<p->nOp )
57b0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
57c0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
57d0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70  nOp - 1;.  }.  p
57e0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64  Op = &p->aOp[add
57f0: 72 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  r];.  assert( pO
5800: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f  p->p4type==P4_NO
5810: 54 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20  TUSED.       || 
5820: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
5830: 49 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20  INT32.       || 
5840: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
5850: 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65  KEYINFO );.  fre
5860: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
5870: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
5880: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30  .  pOp->p4.p = 0
5890: 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e  ;.  if( n==P4_IN
58a0: 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  T32 ){.    /* No
58b0: 74 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73  te: this cast is
58c0: 20 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74   safe, because t
58d0: 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70  he origin data p
58e0: 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a  oint was an int.
58f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20      ** that was 
5900: 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74  cast to a (const
5910: 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20   char *). */.   
5920: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c   pOp->p4.i = SQL
5930: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a  ITE_PTR_TO_INT(z
5940: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
5950: 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b  type = P4_INT32;
5960: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34  .  }else if( zP4
5970: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e  ==0 ){.    pOp->
5980: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f  p4.p = 0;.    pO
5990: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  p->p4type = P4_N
59a0: 4f 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  OTUSED;.  }else 
59b0: 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46  if( n==P4_KEYINF
59c0: 4f 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  O ){.    pOp->p4
59d0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
59e0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
59f0: 20 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20   = P4_KEYINFO;. 
5a00: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
5a10: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70  _VTAB ){.    pOp
5a20: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
5a30: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
5a40: 74 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a  type = P4_VTAB;.
5a50: 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c      sqlite3VtabL
5a60: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50  ock((VTable *)zP
5a70: 34 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  4);.    assert( 
5a80: 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d  ((VTable *)zP4)-
5a90: 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  >db==p->db );.  
5aa0: 7d 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b  }else if( n<0 ){
5ab0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5ac0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
5ad0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
5ae0: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
5af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
5b00: 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74  n==0 ) n = sqlit
5b10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b  e3Strlen30(zP4);
5b20: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  .    pOp->p4.z =
5b30: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
5b40: 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29  p(p->db, zP4, n)
5b50: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5b60: 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a  e = P4_DYNAMIC;.
5b70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
5b80: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
5b90: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
5ba0: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
5bb0: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
5bc0: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
5bd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5be0: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
5bf0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
5c00: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
5c10: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5c20: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5c30: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
5c40: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
5c50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
5c60: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
5c70: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
5c80: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
5c90: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
5cb0: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
5cc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5cd0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
5ce0: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
5cf0: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
5d00: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
5d10: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
5d20: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
5d30: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
5d40: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
5d50: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
5d60: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
5d70: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
5d80: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
5d90: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
5da0: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
5db0: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
5dc0: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
5dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5de0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
5df0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5e00: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
5e10: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
5e20: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
5e30: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
5e40: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
5e50: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
5e60: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
5e70: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
5e80: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
5e90: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
5ea0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
5eb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5ec0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
5ed0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5ee0: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
5ef0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
5f00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
5f10: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
5f20: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
5f30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5f40: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5f50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5f60: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
5f70: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
5f80: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
5f90: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
5fa0: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
5fb0: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
5fc0: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
5fd0: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
5fe0: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
5ff0: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6000: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6010: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6020: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6030: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6040: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
6050: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
6060: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
6070: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
6080: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
6090: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
60a0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
60b0: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
60c0: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
60d0: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
60e0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
60f0: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
6100: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
6110: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
6120: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
6130: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
6140: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
6150: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
6160: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
6170: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
6180: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
6190: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
61a0: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
61b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
61c0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
61d0: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
61e0: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
61f0: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
6200: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
6210: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
6220: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
6230: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
6240: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
6250: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
6260: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
6270: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
6280: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
6290: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
62a0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
62b0: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
62c0: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
62d0: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
62e0: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
62f0: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
6300: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
6310: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
6320: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
6330: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
6340: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
6350: 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61  * after a OOM fa
6360: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
6370: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
6380: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
6390: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
63a0: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
63b0: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
63c0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
63d0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
63e0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
63f0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
6400: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
6410: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
6420: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
6430: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
6440: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
6450: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
6460: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
6470: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
6480: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
6490: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
64a0: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
64b0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
64c0: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
64d0: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
64e0: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
64f0: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
6500: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
6510: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
6520: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
6530: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
6540: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
6550: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
6560: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6570: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
6580: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
6590: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
65a0: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
65b0: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
65c0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
65d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
65e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
65f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6600: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
6610: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
6620: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6630: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
6640: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
6650: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
6660: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6670: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
6680: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
6690: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
66a0: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
66b0: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
66c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
66d0: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
66e0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
66f0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
6700: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
6710: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
6720: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
6730: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
6740: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
6750: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
6760: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
6770: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
6780: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
6790: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
67a0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
67b0: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
67c0: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
67d0: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
67e0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
67f0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
6800: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
6810: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
6820: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
6830: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
6840: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
6850: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
6860: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
6870: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
6880: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
6890: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
68a0: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
68b0: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
68c0: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
68d0: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
68e0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
68f0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
6900: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
6910: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
6920: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
6930: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
6940: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
6950: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
6960: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
6970: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6980: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
6990: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
69a0: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
69b0: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
69c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
69d0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
69e0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
69f0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
6a00: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
6a10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6a20: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
6a30: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
6a40: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
6a50: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
6a60: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
6a70: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
6a80: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
6a90: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
6aa0: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
6ab0: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
6ac0: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
6ad0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
6ae0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
6af0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
6b00: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  zOpName = sq
6b10: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
6b20: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20  pOp->opcode);.  
6b30: 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  nOpName = sqlite
6b40: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d  3Strlen30(zOpNam
6b50: 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d  e);.  if( zOpNam
6b60: 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a  e[nOpName+1] ){.
6b70: 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20      int seenCom 
6b80: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  = 0;.    char c;
6b90: 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d  .    zSynopsis =
6ba0: 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e   zOpName += nOpN
6bb0: 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72  ame + 1;.    for
6bc0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
6bd0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
6be0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
6bf0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
6c00: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
6c10: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
6c20: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
6c30: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
6c40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6c50: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
6c60: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
6c70: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
6c80: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
6c90: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
6ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6cb0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
6cc0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
6cd0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
6ce0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
6cf0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
6d00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
6d10: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
6d20: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
6d30: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
6d40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6d50: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6d60: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
6d70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6d80: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
6d90: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
6da0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
6db0: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
6dc0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
6dd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
6de0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
6df0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
6e00: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
6e10: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
6e20: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
6e30: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
6e40: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
6e60: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
6e70: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
6e80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6e90: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
6ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6eb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6ec0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
6ed0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
6ee0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
6ef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
6f00: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
6f10: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
6f20: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
6f30: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
6f40: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
6f50: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
6f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f70: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
6f80: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
6f90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6fa0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
6fb0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
6fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
6fd0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
6fe0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
6ff0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
7000: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7010: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7020: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
7030: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
7040: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
7050: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
7060: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
7070: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
7080: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
7090: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
70a0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
70b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
70c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
70d0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
70e0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
70f0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7100: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7110: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7120: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
7130: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
7140: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
7150: 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65  BUG */...#if !de
7160: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7170: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
7180: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
7190: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
71a0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
71b0: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
71c0: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
71d0: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
71e0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
71f0: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
7200: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
7210: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
7220: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
7230: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
7240: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
7250: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
7260: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
7270: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
7280: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
7290: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
72a0: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
72b0: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
72c0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
72d0: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
72e0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
72f0: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
7300: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
7310: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
7320: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
7330: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
7340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7350: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7360: 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b  Temp, "k(%d", pK
7370: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
7380: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
7390: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
73a0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
73b0: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
73c0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
73d0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
73e0: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
73f0: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
7400: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
7410: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
7420: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c  ll->zName : "nil
7430: 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ";.        int n
7440: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
7450: 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  30(zColl);.     
7460: 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d     if( n==6 && m
7470: 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  emcmp(zColl,"BIN
7480: 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20  ARY",6)==0 ){.  
7490: 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
74a0: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  "B";.          n
74b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
74c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
74d0: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
74e0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
74f0: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
7500: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7520: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
7530: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66   ',';.        if
7540: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
7550: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
7560: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
7570: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
7580: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
7590: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f  y(&zTemp[i], zCo
75a0: 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ll, n+1);.      
75b0: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
75c0: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
75d0: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
75e0: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
75f0: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
7600: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
7610: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7620: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
7630: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
7640: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
7650: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
7660: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7670: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
7680: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
7690: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
76a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
76b0: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
76c0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
76d0: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
76e0: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
76f0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7700: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
7710: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
7720: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
7730: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7740: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7750: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
7760: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7770: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
7780: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
7790: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
77a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
77b0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
77c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
77d0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
77e0: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
77f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7800: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7810: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
7820: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7830: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7840: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
7850: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
7860: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7870: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7880: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
7890: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
78a0: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
78b0: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
78c0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
78d0: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
78e0: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
78f0: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
7900: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7910: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7920: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
7930: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
7940: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
7950: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
7960: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
7970: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7980: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
7990: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a  16g", pMem->r);.
79a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
79b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
79c0: 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  M_Null ){.      
79d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
79e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
79f0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
7a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
7a10: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
7a20: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
7a30: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
7a40: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
7a50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a60: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
7a70: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7a80: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
7a90: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
7aa0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
7ab0: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
7ac0: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
7ad0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ae0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7af0: 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56  "vtab:%p:%p", pV
7b00: 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64  tab, pVtab->pMod
7b10: 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ule);.      brea
7b20: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
7b30: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
7b40: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
7b50: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7b60: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e  Temp, zTemp, "in
7b70: 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20  tarray");.      
7b80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7b90: 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47   case P4_SUBPROG
7ba0: 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RAM: {.      sql
7bb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7bc0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f  emp, zTemp, "pro
7bd0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72  gram");.      br
7be0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7bf0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20  ase P4_ADVANCE: 
7c00: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d  {.      zTemp[0]
7c10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
7c20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
7c30: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50  ault: {.      zP
7c40: 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20  4 = pOp->p4.z;. 
7c50: 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20       if( zP4==0 
7c60: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
7c70: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20   zTemp;.        
7c80: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
7c90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7ca0: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30    assert( zP4!=0
7cb0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34   );.  return zP4
7cc0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
7cd0: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65  * Declare to the
7ce0: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42   Vdbe that the B
7cf0: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64  Tree object at d
7d00: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65  b->aDb[i] is use
7d10: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65  d..**.** The pre
7d20: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
7d30: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e   need to know in
7d40: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d   advance the com
7d50: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20  plete set of.** 
7d60: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7d70: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  es that will be 
7d80: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20  use.  A mask of 
7d90: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a  these databases.
7da0: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64  ** is maintained
7db0: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b   in p->btreeMask
7dc0: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61  .  The p->lockMa
7dd0: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  sk value is the 
7de0: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e  subset of.** p->
7df0: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74  btreeMask of dat
7e00: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7e10: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e   require a lock.
7e20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7e30: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64  VdbeUsesBtree(Vd
7e40: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20  be *p, int i){. 
7e50: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
7e60: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26   i<p->db->nDb &&
7e70: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79   i<(int)sizeof(y
7e80: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61  DbMask)*8 );.  a
7e90: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69  ssert( i<(int)si
7ea0: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73  zeof(p->btreeMas
7eb0: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b  k)*8 );.  DbMask
7ec0: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  Set(p->btreeMask
7ed0: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31  , i);.  if( i!=1
7ee0: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
7ef0: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e  Sharable(p->db->
7f00: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20  aDb[i].pBt) ){. 
7f10: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e     DbMaskSet(p->
7f20: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20  lockMask, i);.  
7f30: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  }.}..#if !define
7f40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
7f50: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
7f60: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
7f70: 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  >0./*.** If SQLi
7f80: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
7f90: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
7fa0: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
7fb0: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
7fc0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7fd0: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
7fe0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
7ff0: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
8000: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
8010: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
8020: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
8030: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
8040: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
8050: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
8060: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
8070: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
8080: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
8090: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
80a0: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
80b0: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
80c0: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
80d0: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
80e0: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
80f0: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
8100: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
8110: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
8120: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
8130: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
8140: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
8150: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
8160: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
8170: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
8180: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
8190: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
81a0: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
81b0: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
81c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
81d0: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
81e0: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
81f0: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
8200: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
8210: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
8220: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8230: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
8240: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
8250: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
8260: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
8270: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
8280: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
8290: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
82a0: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
82b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
82c0: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
82d0: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
82e0: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
82f0: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
8300: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
8310: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
8320: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
8330: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
8340: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
8350: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
8360: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
8370: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
8380: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
8390: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
83a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
83b0: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
83c0: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
83d0: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
83e0: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
83f0: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
8400: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
8410: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
8420: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
8430: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
8440: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
8450: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
8460: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
8470: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
8480: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
8490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
84a0: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
84b0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
84c0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
84d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
84e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
84f0: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
8500: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
8510: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
8520: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
8530: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
8540: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
8550: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
8560: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8570: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
8580: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8590: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
85a0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
85b0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
85c0: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
85d0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
85e0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
85f0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
8600: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
8610: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
8620: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
8630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8640: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
8650: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
8660: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8670: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8680: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8690: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
86a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
86b0: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
86c0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
86d0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
86e0: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
86f0: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
8700: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
8710: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
8720: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
8730: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8740: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
8750: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
8760: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
8770: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
8780: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
8790: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
87a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
87b0: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
87c0: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
87d0: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
87e0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
87f0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
8800: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
8810: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
8820: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
8830: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
8840: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
8850: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
8860: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
8870: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
8880: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
8890: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
88a0: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
88b0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
88c0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
88d0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
88e0: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
88f0: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
8900: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
8910: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
8920: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
8930: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
8940: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
8950: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
8960: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
8970: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
8980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
8990: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
89a0: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
89b0: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
89c0: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
89d0: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
89e0: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
89f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
8a00: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
8a10: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
8a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8a30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
8a40: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
8a50: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
8a60: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20      Mem *pEnd;. 
8a70: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
8a80: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d   p->db;.    u8 m
8a90: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64  alloc_failed = d
8aa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b  b->mallocFailed;
8ab0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42  .    if( db->pnB
8ac0: 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20  ytesFreed ){.   
8ad0: 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e     for(pEnd=&p[N
8ae0: 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b  ]; p<pEnd; p++){
8af0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8b00: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
8b10: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a  alloc);.      }.
8b20: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
8b30: 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64    }.    for(pEnd
8b40: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20  =&p[N]; p<pEnd; 
8b50: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  p++){.      asse
8b60: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
8b70: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
8b80: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
8b90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
8ba0: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
8bb0: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
8bc0: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
8bd0: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
8be0: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
8bf0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
8c00: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
8c10: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
8c20: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
8c30: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
8c40: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
8c50: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
8c60: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
8c70: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
8c80: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
8c90: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
8ca0: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
8cb0: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
8cc0: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
8cd0: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
8ce0: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
8cf0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
8d00: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
8d10: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
8d20: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
8d30: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
8d40: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
8d50: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
8d60: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
8d70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
8d80: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
8d90: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
8da0: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
8db0: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
8dc0: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
8dd0: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
8de0: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
8df0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
8e00: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
8e10: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
8e20: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
8e30: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
8e40: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
8e50: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
8e60: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
8e70: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
8e80: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
8e90: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
8ea0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8eb0: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
8ec0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8ed0: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
8ee0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ef0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
8f00: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
8f10: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8f20: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
8f30: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
8f40: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
8f50: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
8f60: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
8f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8f80: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
8f90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8fa0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  p->zMalloc ){.  
8fb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8fc0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
8fd0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
8fe0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
8ff0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
9000: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
9010: 69 6e 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ined;.    }.    
9020: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9030: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
9040: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
9050: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
9060: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
9070: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
9080: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
9090: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
90a0: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
90b0: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
90c0: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
90d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
90e0: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
90f0: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
9100: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
9110: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
9120: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
9130: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
9140: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
9150: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
9160: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
9170: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
9180: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
9190: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
91a0: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
91b0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
91c0: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
91d0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
91e0: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
91f0: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
9200: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
9210: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
9220: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
9230: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
9240: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
9250: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
9260: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
9270: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
9280: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
9290: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
92a0: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
92b0: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
92c0: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
92d0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
92e0: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
92f0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
9300: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
9310: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
9320: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
9330: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
9340: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
9350: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
9360: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
9370: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
9380: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
9390: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
93a0: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
93b0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
93c0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
93d0: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
93e0: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
93f0: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
9400: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
9410: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
9420: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
9430: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
9440: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9450: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
9460: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
9470: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
9480: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
9490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
94a0: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
94b0: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
94e0: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
94f0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
9500: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
9530: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
9540: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
9550: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9570: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
9580: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
9590: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95b0: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
95c0: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
95d0: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
95e0: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9600: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
9610: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
9620: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9650: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
9660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9680: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
9690: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
96a0: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
96b0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
96c0: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
96d0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
96e0: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
96f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
9700: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
9710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
9720: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
9730: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
9740: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
9750: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
9760: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
9770: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
9780: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
9790: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
97a0: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
97b0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
97c0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
97d0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
97e0: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
97f0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
9800: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
9810: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
9820: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
9830: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
9840: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
9850: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
9860: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9870: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
9880: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
9890: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
98a0: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
98b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
98c0: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
98d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
98e0: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
98f0: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
9900: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
9910: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9920: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
9930: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
9940: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
9950: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
9960: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
9970: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
9980: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
9990: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
99a0: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
99b0: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
99c0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
99d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
99e0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
99f0: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
9a00: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
9a10: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
9a20: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
9a30: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
9a40: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
9a50: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
9a60: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
9a70: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
9a80: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
9a90: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
9aa0: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
9ab0: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
9ac0: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
9ad0: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
9ae0: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
9af0: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
9b00: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
9b10: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
9b20: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
9b30: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
9b40: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
9b50: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
9b60: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
9b70: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
9b80: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
9b90: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
9ba0: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
9bb0: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
9bc0: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
9bd0: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
9be0: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
9bf0: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
9c00: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
9c10: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
9c20: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
9c30: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
9c40: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
9c50: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
9c60: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
9c70: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
9c80: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
9c90: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
9ca0: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
9cb0: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
9cc0: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
9cd0: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
9ce0: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
9cf0: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
9d00: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
9d10: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
9d20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9d30: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
9d40: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
9d50: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
9d60: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
9d70: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
9d80: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
9d90: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
9da0: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
9db0: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
9dc0: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
9dd0: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
9de0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
9df0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
9e00: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
9e10: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
9e20: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
9e30: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9e40: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
9e50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
9e60: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
9e70: 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
9e80: 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72  "%s", sqlite3Err
9e90: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
9ea0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
9eb0: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
9ec0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
9ed0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
9ee0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
9ef0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
9f00: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
9f10: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
9f20: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
9f30: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
9f40: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
9f50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9f60: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
9f70: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
9f80: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
9f90: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
9fa0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
9fb0: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
9fc0: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
9fd0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
9fe0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
9ff0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
a000: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
a010: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
a020: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
a030: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
a040: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
a050: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
a060: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
a070: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
a080: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a090: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
a0a0: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
a0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a0d0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
a0e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a0f0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
a100: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
a110: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
a120: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
a130: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
a140: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
a150: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
a160: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
a170: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
a180: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
a190: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a1a0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
a1b0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
a1c0: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
a1d0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
a1e0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
a1f0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
a200: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
a210: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
a220: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
a230: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
a240: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
a250: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a260: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
a270: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
a280: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
a290: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
a2a0: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
a2b0: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
a2c0: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
a2d0: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
a2e0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
a2f0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
a300: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
a310: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
a320: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
a330: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
a340: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
a350: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a360: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
a370: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
a380: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
a390: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
a3a0: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
a3b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a3c0: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
a3d0: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
a3e0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
a3f0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
a400: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
a410: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
a420: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
a430: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
a440: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
a450: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
a460: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
a470: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
a480: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
a490: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
a4a0: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
a4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a4c0: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
a4d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a4e0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a4f0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
a520: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
a530: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
a540: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
a550: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
a560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a570: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
a580: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
a590: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a5a0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
a5b0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
a5e0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a5f0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
a600: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33  eMemGrow(pMem, 3
a610: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20  2, 0) ){        
a620: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20      /* P4 */.   
a630: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
a640: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
a650: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
a660: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a670: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
a680: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
a690: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
a6a0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
a6b0: 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20  pMem->z, 32);.  
a6c0: 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d    if( zP4!=pMem-
a6d0: 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >z ){.      sqli
a6e0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72  te3VdbeMemSetStr
a6f0: 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20  (pMem, zP4, -1, 
a700: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b  SQLITE_UTF8, 0);
a710: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a720: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
a730: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
a740: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
a750: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
a760: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
a770: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a780: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b  .    }.    pMem+
a790: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  +;..    if( p->e
a7a0: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
a7b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
a7c0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20  beMemGrow(pMem, 
a7d0: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  4, 0) ){.       
a7e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a7f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a800: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
a810: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
a820: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
a830: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a840: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
a850: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
a860: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a870: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
a880: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
a890: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
a8a0: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
a8b0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
a8c0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
a8d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a8e0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a8f0: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
a900: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a910: 28 70 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29  (pMem, 500, 0) )
a920: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a930: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
a940: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
a950: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
a960: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
a970: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a980: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
a990: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
a9a0: 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  n = displayComme
a9b0: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65  nt(pOp, zP4, pMe
a9c0: 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20  m->z, 500);.    
a9d0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a9e0: 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65  LITE_UTF8;.#else
a9f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
aa00: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20  gs = MEM_Null;  
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20       /* Comment 
aa30: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  */.#endif.    }.
aa40: 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  .    p->nResColu
aa50: 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65  mn = 8 - 4*(p->e
aa60: 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70  xplain-1);.    p
aa70: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26  ->pResultSet = &
aa80: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20  p->aMem[1];.    
aa90: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
aaa0: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
aab0: 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65  TE_ROW;.  }.  re
aac0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
aad0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
aae0: 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66  _EXPLAIN */..#if
aaf0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
ab00: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
ab10: 20 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73   SQL that was us
ab20: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  ed to generate a
ab30: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a   VDBE program..*
ab40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
ab50: 62 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20  bePrintSql(Vdbe 
ab60: 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *p){.  const cha
ab70: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *z = 0;.  if( 
ab80: 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a  p->zSql ){.    z
ab90: 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65   = p->zSql;.  }e
aba0: 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d  lse if( p->nOp>=
abb0: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56  1 ){.    const V
abc0: 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d  dbeOp *pOp = &p-
abd0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28  >aOp[0];.    if(
abe0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
abf0: 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34  _Init && pOp->p4
ac00: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  .z!=0 ){.      z
ac10: 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20   = pOp->p4.z;.  
ac20: 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
ac30: 65 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20  e3Isspace(*z) ) 
ac40: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  z++;.    }.  }. 
ac50: 20 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28   if( z ) printf(
ac60: 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a  "SQL: [%s]\n", z
ac70: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
ac80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
ac90: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
aca0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
acb0: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f  NABLE_IOTRACE)./
acc0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f  *.** Print an IO
acd0: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68  TRACE message sh
ace0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e  owing SQL conten
acf0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
ad00: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c  e3VdbeIOTraceSql
ad10: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
ad20: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20   nOp = p->nOp;. 
ad30: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
ad40: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61  if( sqlite3IoTra
ad50: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ce==0 ) return;.
ad60: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65    if( nOp<1 ) re
ad70: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70  turn;.  pOp = &p
ad80: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20  ->aOp[0];.  if( 
ad90: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
ada0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
adb0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  z!=0 ){.    int 
adc0: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a  i, j;.    char z
add0: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  [1000];.    sqli
ade0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
adf0: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c  eof(z), z, "%s",
ae00: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20   pOp->p4.z);.   
ae10: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65   for(i=0; sqlite
ae20: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20  3Isspace(z[i]); 
ae30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a  i++){}.    for(j
ae40: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
ae50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ae60: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29  3Isspace(z[i]) )
ae70: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  {.        if( z[
ae80: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20  i-1]!=' ' ){.   
ae90: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
aea0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ' ';.        }. 
aeb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
aec0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69      z[j++] = z[i
aed0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
aee0: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20  .    z[j] = 0;. 
aef0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
af00: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29  e("SQL %s\n", z)
af10: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
af20: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  * !SQLITE_OMIT_T
af30: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45  RACE && SQLITE_E
af40: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f  NABLE_IOTRACE */
af50: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
af60: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69   space from a fi
af70: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20  xed size buffer 
af80: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
af90: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20  nter to.** that 
afa0: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66  space.  If insuf
afb0: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73  ficient space is
afc0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75   available, retu
afd0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
afe0: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65  he pBuf paramete
aff0: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  r is the initial
b000: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e   value of a poin
b010: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a  ter which will.*
b020: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65  * receive the ne
b030: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20  w memory.  pBuf 
b040: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c  is normally NULL
b050: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f  .  If pBuf is no
b060: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65  t.** NULL, it me
b070: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ans that memory 
b080: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64  space has alread
b090: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
b0a0: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69   and that.** thi
b0b0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
b0c0: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e   not allocate an
b0d0: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57  y new memory.  W
b0e0: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a  hen pBuf is not.
b0f0: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72  ** NULL simply r
b100: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c  eturn pBuf.  Onl
b110: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d  y allocate new m
b120: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e  emory space when
b130: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c   pBuf.** is NULL
b140: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73  ..**.** nByte is
b150: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
b160: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65  ytes of space ne
b170: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46  eded..**.** *ppF
b180: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76  rom points to av
b190: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e  ailable space an
b1a0: 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f  d pEnd points to
b1b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
b1c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61  ** available spa
b1d0: 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20  ce.  When space 
b1e0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70  is allocated, *p
b1f0: 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65  pFrom is advance
b200: 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e  d past.** the en
b210: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  d of the allocat
b220: 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20  ed space..**.** 
b230: 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75  *pnByte is a cou
b240: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62  nter of the numb
b250: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
b260: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66  pace that have f
b270: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f  ailed.** to allo
b280: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20  cate.  If there 
b290: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20  is insufficient 
b2a0: 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d  space in *ppFrom
b2b0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
b2c0: 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e  ** request, then
b2d0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
b2e0: 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74  te by the amount
b2f0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e   of the request.
b300: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b310: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76  *allocSpace(.  v
b320: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
b330: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74      /* Where ret
b340: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c  urn pointer will
b350: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20   be stored */.  
b360: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
b370: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b380: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  f bytes to alloc
b390: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ate */.  u8 **pp
b3a0: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a  From,         /*
b3b0: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74   IN/OUT: Allocat
b3c0: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a  e from *ppFrom *
b3d0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20  /.  u8 *pEnd,   
b3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
b3f0: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61  ter to 1 byte pa
b400: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70  st the end of *p
b410: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a  pFrom buffer */.
b420: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20    int *pnByte   
b430: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
b440: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  ocation cannot b
b450: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e  e made, incremen
b460: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a  t *pnByte */.){.
b470: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
b480: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a  BYTE_ALIGNMENT(*
b490: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28  ppFrom) );.  if(
b4a0: 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70   pBuf ) return p
b4b0: 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  Buf;.  nByte = R
b4c0: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
b4d0: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e  if( &(*ppFrom)[n
b4e0: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b  Byte] <= pEnd ){
b4f0: 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69  .    pBuf = (voi
b500: 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20  d*)*ppFrom;.    
b510: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65  *ppFrom += nByte
b520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
b530: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b  pnByte += nByte;
b540: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42  .  }.  return pB
b550: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
b560: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
b570: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
b580: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
b590: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
b5a0: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
b5b0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
b5c0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
b5d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
b5e0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
b5f0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
b600: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
b610: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
b620: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
b630: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
b640: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
b650: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
b660: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
b670: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
b680: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
b690: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
b6a0: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
b6b0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
b6c0: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
b6d0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
b6e0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
b6f0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b700: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
b710: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
b720: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
b730: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
b740: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
b750: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
b760: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b770: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
b780: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
b790: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
b7a0: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
b7b0: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
b7c0: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
b7d0: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
b7e0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
b7f0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
b800: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
b810: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
b820: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
b830: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
b840: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
b850: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
b860: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
b870: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
b880: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
b890: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
b8a0: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
b8b0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
b8c0: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
b8d0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
b8e0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
b8f0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
b900: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
b910: 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b  allocating stack
b920: 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69   space and initi
b930: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
b940: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
b950: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
b960: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
b970: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
b980: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
b990: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
b9a0: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
b9b0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
b9c0: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
b9d0: 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f  led exact once o
b9e0: 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61 6c  n a each virtual
b9f0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
ba00: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
ba10: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
ba20: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
ba30: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
ba40: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
ba50: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
ba60: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68   is called, futh
ba70: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  er calls to .** 
ba80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba90: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  () functions are
baa0: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68   prohibited.  Th
bab0: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f  is routine disco
bac0: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64  nnects.** the Vd
bad0: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73  be from the Pars
bae0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65  e object that he
baf0: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74  lped generate it
bb00: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20   so that the.** 
bb10: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73  the Vdbe becomes
bb20: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20   an independent 
bb30: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50  entity and the P
bb40: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20  arse object can 
bb50: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e  be.** destroyed.
bb60: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73  .**.** Use the s
bb70: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
bb80: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  () procedure to 
bb90: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61  restore a virtua
bba0: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a  l machine back.*
bbb0: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c  * to its initial
bbc0: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20   state after it 
bbd0: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f  has been run..*/
bbe0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
bbf0: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64  eMakeReady(.  Vd
bc00: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
bc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc20: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61  The VDBE */.  Pa
bc30: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20  rse *pParse     
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
bc60: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
bc70: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
bc80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
bc90: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bca0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b  n */.  int nVar;
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bcd0: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  of parameters */
bce0: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20  .  int nMem;    
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56    /* Number of V
bd10: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65  M memory registe
bd20: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  rs */.  int nCur
bd30: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  sor;            
bd40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bd50: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75   of cursors requ
bd60: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  ired */.  int nA
bd70: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rg;             
bd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bd90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bda0: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a  in subprograms *
bdb0: 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20  /.  int nOnce;  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bde0: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74  OP_Once instruct
bdf0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ions */.  int n;
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
be20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
be30: 20 2a 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20   *zCsr;         
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be50: 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65  Memory available
be60: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
be70: 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20  */.  u8 *zEnd;  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be90: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
bea0: 65 20 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64  e past allocated
beb0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
bec0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
bee0: 6f 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65  ow much extra me
bef0: 6d 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a  mory is needed *
bf00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  /..  assert( p!=
bf10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bf20: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
bf30: 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
bf40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
bf50: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
bf60: 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72  _INIT );.  asser
bf70: 74 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50  t( pParse==p->pP
bf80: 61 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70  arse );.  db = p
bf90: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
bfa0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bfb0: 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20  ==0 );.  nVar = 
bfc0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20  pParse->nVar;.  
bfd0: 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nMem = pParse->n
bfe0: 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d  Mem;.  nCursor =
bff0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
c000: 20 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e   nArg = pParse->
c010: 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65  nMaxArg;.  nOnce
c020: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65   = pParse->nOnce
c030: 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30  ;.  if( nOnce==0
c040: 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a   ) nOnce = 1; /*
c050: 20 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74   Ensure at least
c060: 20 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e   one byte in p->
c070: 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20  aOnceFlag[] */. 
c080: 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20   .  /* For each 
c090: 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c  cursor required,
c0a0: 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61   also allocate a
c0b0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65   memory cell. Me
c0c0: 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  mory.  ** cells 
c0d0: 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29  (nMem+1-nCursor)
c0e0: 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76  ..nMem, inclusiv
c0f0: 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  e, will never be
c100: 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68   used by.  ** th
c110: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20  e vdbe program. 
c120: 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65  Instead they are
c130: 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
c140: 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a  e space for.  **
c150: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
c160: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
c170: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
c180: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
c190: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
c1a0: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
c1b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
c1c0: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
c1d0: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
c1e0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
c1f0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
c200: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
c210: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
c220: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
c230: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
c240: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
c250: 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  r;..  /* Allocat
c260: 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f  e space for memo
c270: 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51  ry registers, SQ
c280: 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42  L variables, VDB
c290: 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20  E cursors and . 
c2a0: 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20   ** an array to 
c2b0: 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63  marshal SQL func
c2c0: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69  tion arguments i
c2d0: 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d  n..  */.  zCsr =
c2e0: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d   (u8*)&p->aOp[p-
c2f0: 3e 6e 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20  >nOp];          
c300: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c    /* Memory aval
c310: 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61  iable for alloca
c320: 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d  tion */.  zEnd =
c330: 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50   (u8*)&p->aOp[pP
c340: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b  arse->nOpAlloc];
c350: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c360: 70 61 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72  past end of zCsr
c370: 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65  [] */..  resolve
c380: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
c390: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
c3a0: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
c3b0: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
c3c0: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
c3d0: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
c3e0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
c3f0: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
c400: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
c410: 7d 0a 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c  }.  memset(zCsr,
c420: 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a   0, zEnd-zCsr);.
c430: 20 20 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20    zCsr += (zCsr 
c440: 2d 20 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61  - (u8*)0)&7;.  a
c450: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
c460: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72  E_ALIGNMENT(zCsr
c470: 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65  ) );.  p->expire
c480: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
c490: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
c4a0: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
c4b0: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
c4c0: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
c4d0: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
c4e0: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
c4f0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
c500: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
c510: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
c520: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
c530: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
c540: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
c550: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
c560: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
c570: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
c580: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
c590: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
c5a0: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
c5b0: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
c5c0: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
c5d0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
c5e0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
c5f0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
c600: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
c610: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
c620: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
c630: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
c640: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c650: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
c660: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
c670: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
c680: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
c690: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
c6a0: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
c6b0: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
c6c0: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
c6d0: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
c6e0: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
c6f0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
c700: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c710: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
c720: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c730: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
c740: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
c750: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c760: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
c770: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
c780: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
c790: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
c7a0: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
c7b0: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
c7c0: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
c7d0: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
c7e0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
c7f0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
c800: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
c810: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
c820: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
c830: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
c860: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
c870: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
c880: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
c890: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26  ceFlag, nOnce, &
c8a0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c8b0: 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79  te);.    if( nBy
c8c0: 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  te ){.      p->p
c8d0: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
c8e0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
c8f0: 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Byte);.    }.   
c900: 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65   zCsr = p->pFree
c910: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43  ;.    zEnd = &zC
c920: 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68  sr[nByte];.  }wh
c930: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
c940: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c950: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
c960: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
c970: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
c980: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
c990: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
c9a0: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
c9b0: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
c9c0: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
c9d0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
c9e0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
c9f0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
ca00: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
ca10: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
ca20: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72   ){.    p->nzVar
ca30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
ca40: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e  ;.    memcpy(p->
ca50: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61  azVar, pParse->a
ca60: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73  zVar, p->nzVar*s
ca70: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30  izeof(p->azVar[0
ca80: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ]));.    memset(
ca90: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30  pParse->azVar, 0
caa0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a  , pParse->nzVar*
cab0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
cac0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  zVar[0]));.  }. 
cad0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a   if( p->aMem ){.
cae0: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20      p->aMem--;  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f      /* aMem[] go
cb10: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20  es from 1..nMem 
cb20: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  */.    p->nMem =
cb30: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
cb40: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20         /*       
cb50: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d  not from 0..nMem
cb60: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d  -1 */.    for(n=
cb70: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29  1; n<=nMem; n++)
cb80: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
cb90: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
cba0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
cbb0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
cbc0: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
cbd0: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
cbe0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
cbf0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
cc00: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
cc10: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
cc20: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
cc30: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
cc40: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
cc50: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
cc60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cc70: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
cc80: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
cc90: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
cca0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
ccb0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
ccc0: 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c  ite3VdbeSorterCl
ccd0: 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b  ose(p->db, pCx);
cce0: 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20  .  if( pCx->pBt 
ccf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
cd00: 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42  reeClose(pCx->pB
cd10: 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  t);.    /* The p
cd20: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
cd30: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
cd40: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
cd50: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a  xists, by.    **
cd60: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
cd70: 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
cd80: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a  pCx->pCursor ){.
cd90: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
cda0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
cdb0: 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23  >pCursor);.  }.#
cdc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cdd0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
cde0: 20 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62    if( pCx->pVtab
cdf0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
ce00: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
ce10: 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d  r *pVtabCursor =
ce20: 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f   pCx->pVtabCurso
ce30: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  r;.    const sql
ce40: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f  ite3_module *pMo
ce50: 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73  dule = pVtabCurs
ce60: 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75  or->pVtab->pModu
ce70: 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61  le;.    p->inVta
ce80: 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20  bMethod = 1;.   
ce90: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
cea0: 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20  (pVtabCursor);. 
ceb0: 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68     p->inVtabMeth
cec0: 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  od = 0;.  }.#end
ced0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  if.}../*.** Copy
cee0: 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72   the values stor
cef0: 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72  ed in the VdbeFr
cf00: 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  ame structure to
cf10: 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a   its Vdbe. This.
cf20: 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20  ** is used, for 
cf30: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20  example, when a 
cf40: 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67  trigger sub-prog
cf50: 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f  ram is halted to
cf60: 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74   restore.** cont
cf70: 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  rol to the main 
cf80: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20  program..*/.int 
cf90: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
cfa0: 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d  Restore(VdbeFram
cfb0: 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64  e *pFrame){.  Vd
cfc0: 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e  be *v = pFrame->
cfd0: 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  v;.  v->aOnceFla
cfe0: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
cff0: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
d000: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
d010: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
d020: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
d030: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
d040: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
d050: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
d060: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
d070: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
d080: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
d090: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
d0a0: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
d0b0: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
d0c0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
d0d0: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
d0e0: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
d0f0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
d100: 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61  e;.  return pFra
d110: 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  me->pc;.}../*.**
d120: 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
d130: 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  rs..**.** Also r
d140: 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d  elease any dynam
d150: 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  ic memory held b
d160: 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20  y the VM in the 
d170: 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79  Vdbe.aMem memory
d180: 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e   .** cell array.
d190: 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
d1a0: 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79  ry as the memory
d1b0: 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20   cell array may 
d1c0: 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74  contain.** point
d1d0: 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65  ers to VdbeFrame
d1e0: 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20   objects, which 
d1f0: 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74  may in turn cont
d200: 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a  ain pointers to.
d210: 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e  ** open cursors.
d220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d230: 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
d240: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20  Vdbe *p){.  if( 
d250: 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20  p->pFrame ){.   
d260: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61   VdbeFrame *pFra
d270: 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61  me;.    for(pFra
d280: 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46  me=p->pFrame; pF
d290: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70  rame->pParent; p
d2a0: 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50  Frame=pFrame->pP
d2b0: 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69  arent);.    sqli
d2c0: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
d2d0: 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d  ore(pFrame);.  }
d2e0: 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30  .  p->pFrame = 0
d2f0: 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20  ;.  p->nFrame = 
d300: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43  0;..  if( p->apC
d310: 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  sr ){.    int i;
d320: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
d330: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
d340: 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73  {.      VdbeCurs
d350: 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73  or *pC = p->apCs
d360: 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  r[i];.      if( 
d370: 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pC ){.        sq
d380: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
d390: 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20  sor(p, pC);.    
d3a0: 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20      p->apCsr[i] 
d3b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
d3c0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e   }.  }.  if( p->
d3d0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65  aMem ){.    rele
d3e0: 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e  aseMemArray(&p->
d3f0: 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d  aMem[1], p->nMem
d400: 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
d410: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a  p->pDelFrame ){.
d420: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70      VdbeFrame *p
d430: 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61  Del = p->pDelFra
d440: 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46  me;.    p->pDelF
d450: 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61  rame = pDel->pPa
d460: 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  rent;.    sqlite
d470: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
d480: 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pDel);.  }..  /
d490: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78  * Delete any aux
d4a0: 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  data allocations
d4b0: 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20   made by the VM 
d4c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
d4d0: 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c  DeleteAuxData(p,
d4e0: 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72   -1, 0);.  asser
d4f0: 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d  t( p->pAuxData==
d500: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  0 );.}../*.** Cl
d510: 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66  ean up the VM af
d520: 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  ter execution..*
d530: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d540: 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  e will automatic
d550: 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63  ally close any c
d560: 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61  ursors, lists, a
d570: 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73  nd/or.** sorters
d580: 20 74 68 61 74 20 77 65 72 65 20 6c 65 66 74 20   that were left 
d590: 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64  open.  It also d
d5a0: 65 6c 65 74 65 73 20 74 68 65 20 76 61 6c 75 65  eletes the value
d5b0: 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65  s of.** variable
d5c0: 73 20 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20  s in the aVar[] 
d5d0: 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  array..*/.static
d5e0: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
d5f0: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
d600: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
d610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
d620: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
d630: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
d640: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
d650: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
d660: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
d670: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
d680: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
d690: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
d6a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
d6b0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
d6c0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
d6d0: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
d6e0: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
d6f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
d700: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  m ){.    for(i=1
d710: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b  ; i<=p->nMem; i+
d720: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d  +) assert( p->aM
d730: 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d  em[i].flags==MEM
d740: 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20  _Undefined );.  
d750: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
d760: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
d770: 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e  >zErrMsg);.  p->
d780: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70  zErrMsg = 0;.  p
d790: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
d7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
d7b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
d7c0: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74  ult columns that
d7d0: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d7e0: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a  d by this SQL.**
d7f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
d800: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63   is now set at c
d810: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74  ompile time, rat
d820: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a  her than during.
d830: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
d840: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
d850: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
d860: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20  _column_count() 
d870: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64  can.** be called
d880: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65   on an SQL state
d890: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69  ment before sqli
d8a0: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76  te3_step()..*/.v
d8b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
d8c0: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a  etNumCols(Vdbe *
d8d0: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d  p, int nResColum
d8e0: 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  n){.  Mem *pColN
d8f0: 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ame;.  int n;.  
d900: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
d910: 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d  >db;..  releaseM
d920: 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
d930: 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
d940: 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
d950: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
d960: 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
d970: 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d  .  n = nResColum
d980: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70  n*COLNAME_N;.  p
d990: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28  ->nResColumn = (
d9a0: 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a  u16)nResColumn;.
d9b0: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20    p->aColName = 
d9c0: 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a  pColName = (Mem*
d9d0: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
d9e0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
d9f0: 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20  Mem)*n );.  if( 
da00: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29  p->aColName==0 )
da10: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
da20: 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
da30: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73   pColName->flags
da40: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
da50: 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20   pColName->db = 
da60: 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e  p->db;.    pColN
da70: 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ame++;.  }.}../*
da80: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65  .** Set the name
da90: 20 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63   of the idx'th c
daa0: 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75  olumn to be retu
dab0: 72 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20  rned by the SQL 
dac0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e  statement..** zN
dad0: 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ame must be a po
dae0: 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74  inter to a nul t
daf0: 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
db00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
db10: 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61  l must be made a
db20: 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
db30: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d  qlite3VdbeSetNum
db40: 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cols()..**.** Th
db50: 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
db60: 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65  r, xDel, must be
db70: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44   one of SQLITE_D
db80: 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53  YNAMIC, SQLITE_S
db90: 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49  TATIC.** or SQLI
dba0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66  TE_TRANSIENT. If
dbb0: 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59   it is SQLITE_DY
dbc0: 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20  NAMIC, then the 
dbd0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a  buffer pointed.*
dbe0: 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69  * to by zName wi
dbf0: 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73  ll be freed by s
dc00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77  qlite3DbFree() w
dc10: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20  hen the vdbe is 
dc20: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e  destroyed..*/.in
dc30: 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  t sqlite3VdbeSet
dc40: 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20  ColName(.  Vdbe 
dc50: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
dc70: 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67  dbe being config
dc80: 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ured */.  int id
dc90: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
dca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
dcb0: 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e  dex of column zN
dcc0: 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a  ame applies to *
dcd0: 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20  /.  int var,    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
dd00: 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e  he COLNAME_* con
dd10: 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73  stants */.  cons
dd20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd40: 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
dd50: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d  r containing nam
dd60: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44  e */.  void (*xD
dd70: 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20  el)(void*)      
dd80: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
dd90: 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72  y management str
dda0: 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20  ategy for zName 
ddb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
ddc0: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
ddd0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70  .  assert( idx<p
dde0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a  ->nResColumn );.
ddf0: 20 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f    assert( var<CO
de00: 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28  LNAME_N );.  if(
de10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
de20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65  iled ){.    asse
de30: 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44  rt( !zName || xD
de40: 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d  el!=SQLITE_DYNAM
de50: 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IC );.    return
de60: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
de70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e   }.  assert( p->
de80: 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  aColName!=0 );. 
de90: 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d   pColName = &(p-
dea0: 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61  >aColName[idx+va
deb0: 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d  r*p->nResColumn]
dec0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
ded0: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
dee0: 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  ColName, zName, 
def0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
df00: 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74   xDel);.  assert
df10: 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d  ( rc!=0 || !zNam
df20: 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e  e || (pColName->
df30: 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21  flags&MEM_Term)!
df40: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
df50: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65  c;.}../*.** A re
df60: 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
df70: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d  saction may or m
df80: 61 79 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65  ay not be active
df90: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
dfa0: 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20  dle.** db. If a 
dfb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
dfc0: 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74  ctive, commit it
dfd0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 0a  . If there is a.
dfe0: 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ** write-transac
dff0: 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f  tion spanning mo
e000: 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
e010: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
e020: 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73  routine.** takes
e030: 20 63 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73   care of the mas
e040: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63  ter journal tric
e050: 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  kery..*/.static 
e060: 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73  int vdbeCommit(s
e070: 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
e080: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
e090: 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b   int nTrans = 0;
e0a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64    /* Number of d
e0b0: 61 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e  atabases with an
e0c0: 20 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72   active write-tr
e0d0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  ansaction */.  i
e0e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e0f0: 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f  K;.  int needXco
e100: 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65  mmit = 0;..#ifde
e110: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e120: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
e130: 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e  With this option
e140: 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  , sqlite3VtabSyn
e150: 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 74  c() is defined t
e160: 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a  o be simply .  *
e170: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70  * SQLITE_OK so p
e180: 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20   is not used. . 
e190: 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
e1a0: 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69  AMETER(p);.#endi
e1b0: 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  f..  /* Before d
e1c0: 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
e1d0: 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79  se, call the xSy
e1e0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f  nc() callback fo
e1f0: 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75  r any.  ** virtu
e200: 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73  al module tables
e210: 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73   written in this
e220: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
e230: 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62  is has to.  ** b
e240: 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65  e done before de
e250: 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65  termining whethe
e260: 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  r a master journ
e270: 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  al file is .  **
e280: 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e   required, as an
e290: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e2a0: 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74  k may add an att
e2b0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 20  ached database. 
e2c0: 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73   ** to the trans
e2d0: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
e2e0: 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
e2f0: 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f  ync(db, p);..  /
e300: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65  * This loop dete
e310: 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68  rmines (a) if th
e320: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68  e commit hook sh
e330: 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20  ould be invoked 
e340: 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77  and.  ** (b) how
e350: 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66   many database f
e360: 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77  iles have open w
e370: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
e380: 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63  s, not .  ** inc
e390: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20  luding the temp 
e3a0: 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73  database. (b) is
e3b0: 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75   important becau
e3c0: 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20  se if more than 
e3d0: 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61  .  ** one databa
e3e0: 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f  se file has an o
e3f0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
e400: 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20  ction, a master 
e410: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
e420: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  e is required fo
e430: 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d  r an atomic comm
e440: 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  it..  */ .  for(
e450: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e460: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e470: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65   i++){ .    Btre
e480: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e490: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
e4a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
e4b0: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
e4c0: 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74       needXcommit
e4d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e4e0: 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b  i!=1 ) nTrans++;
e4f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e500: 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
e510: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e520: 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
e530: 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65  ock(sqlite3Btree
e540: 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20  Pager(pBt));.   
e550: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
e560: 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
e570: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e590: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
e5a0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
e5b0: 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
e5c0: 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
e5d0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
e5e0: 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
e5f0: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
e600: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
e610: 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
e620: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
e630: 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
e640: 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
e650: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e660: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
e670: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
e680: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e690: 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
e6a0: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
e6b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
e6c0: 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
e6d0: 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
e6e0: 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
e6f0: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
e700: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
e710: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
e720: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
e730: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
e740: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
e750: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
e760: 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
e770: 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
e780: 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
e790: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e7a0: 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
e7b0: 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
e7c0: 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
e7d0: 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
e7e0: 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
e7f0: 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
e800: 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
e810: 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
e820: 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
e830: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
e840: 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
e850: 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
e860: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
e870: 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
e880: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e890: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e8a0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e8b0: 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
e8c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e8d0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
e8e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
e8f0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
e900: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
e910: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
e920: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
e930: 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
e940: 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
e950: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
e960: 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
e970: 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
e980: 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
e990: 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
e9a0: 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
e9b0: 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
e9c0: 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
e9d0: 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
e9e0: 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
e9f0: 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
ea00: 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
ea10: 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
ea20: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
ea30: 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
ea40: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
ea50: 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
ea60: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
ea70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
ea80: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
ea90: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
eaa0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
eab0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
eac0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ead0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
eae0: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
eaf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eb00: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
eb10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
eb20: 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
eb30: 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
eb40: 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
eb50: 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
eb60: 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
eb70: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
eb80: 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
eb90: 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
eba0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
ebb0: 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
ebc0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
ebd0: 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
ebe0: 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  omicly..  */.#if
ebf0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec00: 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a  _DISKIO.  else{.
ec10: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
ec20: 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73  *pVfs = db->pVfs
ec30: 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
ec40: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  nc = 0;.    char
ec50: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
ec60: 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
ec70: 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
ec80: 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
ec90: 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
eca0: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
ecb0: 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
ecc0: 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
ecd0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
ece0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
ecf0: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
ed00: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
ed10: 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
ed20: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
ed30: 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
ed40: 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
ed50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
ed60: 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
ed70: 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
ed80: 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
ed90: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
eda0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
edb0: 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
edc0: 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
edd0: 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
ede0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
edf0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64  ITE_NOMEM;.    d
ee00: 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
ee10: 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
ee20: 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
ee30: 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
ee40: 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
ee50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
ee60: 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
ee70: 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
ee80: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
ee90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
eea0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
eeb0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
eec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
eed0: 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
eee0: 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
eef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
ef00: 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
ef10: 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
ef20: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
ef30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ef40: 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
ef50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
ef60: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
ef70: 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
ef80: 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
ef90: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
efa0: 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
efb0: 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
efc0: 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
eff0: 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
f000: 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
f010: 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
f020: 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
f030: 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
f040: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
f050: 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
f060: 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
f070: 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
f080: 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
f090: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
f0a0: 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
f0b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
f0c0: 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
f0d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
f0e0: 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
f0f0: 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
f100: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f110: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
f120: 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
f130: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
f140: 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
f150: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
f160: 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
f170: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f180: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
f190: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
f1a0: 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
f1b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
f1c0: 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
f1d0: 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
f1e0: 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
f1f0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
f200: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
f210: 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
f220: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
f230: 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
f240: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
f250: 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
f260: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
f270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f280: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f290: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
f2a0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f2b0: 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
f2c0: 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
f2d0: 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
f2e0: 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
f2f0: 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
f300: 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
f310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
f320: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
f330: 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
f340: 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
f350: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
f360: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f370: 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
f380: 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
f390: 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
f3a0: 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
f3b0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f3c0: 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
f3d0: 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
f3e0: 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
f3f0: 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
f400: 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
f410: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
f420: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
f430: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
f440: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
f450: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
f460: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
f470: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
f480: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
f490: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
f4a0: 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
f4b0: 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
f4c0: 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
f4d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
f4e0: 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
f4f0: 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
f500: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
f510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f520: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
f530: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
f540: 66 28 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20  f( !needSync && 
f550: 21 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e  !sqlite3BtreeSyn
f560: 63 44 69 73 61 62 6c 65 64 28 70 42 74 29 20 29  cDisabled(pBt) )
f570: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
f580: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
f590: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
f5a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
f5b0: 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
f5c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f5d0: 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
f5e0: 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
f5f0: 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
f600: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
f610: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
f640: 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
f650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
f660: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
f670: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
f680: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f690: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
f6a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
f6b0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
f6c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f6d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
f6e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f6f0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
f700: 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
f710: 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
f720: 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
f730: 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
f740: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f750: 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26  needSync .     &
f760: 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44  & 0==(sqlite3OsD
f770: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
f780: 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53 51  tics(pMaster)&SQ
f790: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
f7a0: 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53  NTIAL).     && S
f7b0: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
f7c0: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d  sqlite3OsSync(pM
f7d0: 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59  aster, SQLITE_SY
f7e0: 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20  NC_NORMAL)).    
f7f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f800: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
f810: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ter);.      sqli
f820: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
f830: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
f840: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
f850: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
f860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
f870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f880: 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20  Sync all the db 
f890: 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69  files involved i
f8a0: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
f8b0: 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c  n. The same call
f8c0: 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65  .    ** sets the
f8d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f8e0: 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20  pointer in each 
f8f0: 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
f900: 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e  al. If.    ** an
f910: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65   error occurs he
f920: 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74  re, do not delet
f930: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f940: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
f950: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
f960: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
f970: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63 61  ing the first ca
f980: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
f990: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
f9a0: 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20  haseOne(), then 
f9b0: 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63  there is a chanc
f9c0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
f9d0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
f9e0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72   file will be or
f9f0: 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63  phaned. But we c
fa00: 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c  annot delete it,
fa10: 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
fa20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fa30: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73  al file name was
fa40: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
fa50: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
fa60: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65   file before the
fa70: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
fa80: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
fa90: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
faa0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
fab0: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
fac0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
fad0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
fae0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
faf0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fb00: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fb10: 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74  seOne(pBt, zMast
fb20: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
fb30: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73   }.    sqlite3Os
fb40: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
fb50: 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
fb60: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
fb70: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
fb80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fb90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fba0: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
fbb0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
fbc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c     }..    /* Del
fbd0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
fbe0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
fbf0: 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72  s commits the tr
fc00: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72  ansaction. After
fc10: 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68  .    ** doing th
fc20: 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  is the directory
fc30: 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e   is synced again
fc40: 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69   before any indi
fc50: 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72  vidual.    ** tr
fc60: 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20  ansaction files 
fc70: 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20  are deleted..   
fc80: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
fc90: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
fca0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a  s, zMaster, 1);.
fcb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
fcc0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
fcd0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
fce0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
fcf0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fd00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
fd10: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
fd20: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
fd30: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
fd40: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
fd50: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
fd60: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
fd70: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
fd80: 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
fd90: 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
fda0: 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
fdb0: 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
fdc0: 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
fdd0: 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
fde0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
fdf0: 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
fe00: 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
fe10: 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
fe20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
fe30: 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
fe40: 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
fe50: 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
fe60: 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
fe70: 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
fe80: 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
fe90: 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
fea0: 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
feb0: 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
fec0: 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
fed0: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
fee0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
fef0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ff00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
ff10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ff20: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
ff30: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ff40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
ff50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ff60: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
ff70: 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
ff80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ff90: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
ffa0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
ffb0: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
ffc0: 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
ffd0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
ffe0: 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
fff0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
10000 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
10010 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
10020 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
10030 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
10040 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
10050 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
10060 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
10070 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
10080 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
10090 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
100a0 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
100b0 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
100c0 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
100d0 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
100e0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
100f0 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
10100 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
10110 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
10120 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
10130 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
10140 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
10150 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
10160 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
10170 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
10180 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
10190 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
101a0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
101b0 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
101c0 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
101d0 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
101e0 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
101f0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
10200 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
10210 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
10220 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
10230 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
10240 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
10250 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
10260 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
10270 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
10280 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
10290 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
102a0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
102b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
102c0 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
102d0 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
102e0 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
102f0 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
10300 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
10310 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
10320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
10330 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
10340 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
10350 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
10360 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
10370 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
10380 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
10390 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
103a0 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
103b0 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
103c0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
103d0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
103e0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
103f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
10400 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
10410 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
10420 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
10430 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
10440 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
10450 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
10460 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
10470 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10480 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
10490 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
104a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
104b0 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
104c0 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
104d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
104e0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
104f0 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
10500 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
10510 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
10520 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10530 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
10540 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
10550 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
10560 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
10570 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
10580 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
10590 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
105a0 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
105b0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
105c0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
105d0 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
105e0 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
105f0 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
10600 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
10610 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
10620 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
10630 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
10640 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
10650 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
10660 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
10670 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
10680 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10690 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
106a0 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
106b0 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
106c0 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
106d0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
106e0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
106f0 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
10700 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
10710 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
10720 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
10730 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
10740 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
10750 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
10760 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
10770 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
10780 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
10790 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
107a0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
107b0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
107c0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
107d0 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
107e0 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
107f0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
10800 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
10810 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
10820 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
10830 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
10840 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
10850 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
10860 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
10870 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
10880 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
10890 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
108a0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
108b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
108c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
108d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
108e0 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
108f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10900 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
10910 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
10920 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
10930 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
10950 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10960 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
10980 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
10990 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
109a0 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
109b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
109c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
109d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
109e0 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
109f0 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
10a00 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
10a10 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
10a20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10a30 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
10a40 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
10a50 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
10a60 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
10a70 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
10a80 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
10a90 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
10aa0 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
10ab0 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
10ac0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
10ad0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
10ae0 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
10af0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
10b00 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
10b10 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
10b20 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
10b30 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
10b40 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
10b50 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
10b60 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
10b70 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
10b80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10b90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
10ba0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
10bb0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
10bc0 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
10bd0 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
10be0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10bf0 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
10c00 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
10c10 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
10c20 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
10c30 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
10c40 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
10c50 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
10c60 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
10c70 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
10c80 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
10c90 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
10ca0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
10cb0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
10cc0 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
10cd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10ce0 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
10cf0 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
10d00 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
10d10 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
10d20 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
10d30 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
10d40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
10d50 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
10d60 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
10d70 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10d80 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
10d90 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
10da0 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
10db0 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
10dc0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
10dd0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
10de0 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
10df0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
10e00 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
10e10 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
10e20 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
10e30 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
10e40 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
10e50 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
10e60 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
10e70 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
10e80 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
10e90 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
10ea0 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67  ring(&p->zErrMsg
10eb0 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b  , db, "FOREIGN K
10ec0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
10ed0 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
10ee0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
10ef0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10f00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
10f10 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
10f20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10f30 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
10f40 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
10f50 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
10f60 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
10f70 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
10f80 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
10f90 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
10fa0 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
10fb0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
10fc0 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
10fd0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
10fe0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
10ff0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
11000 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
11010 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
11020 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
11030 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
11040 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
11050 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
11060 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
11070 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
11080 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
11090 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
110a0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
110b0 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
110c0 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
110d0 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
110e0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
110f0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
11100 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
11110 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
11120 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
11130 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
11140 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
11150 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
11160 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11170 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
11180 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
111b0 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
111c0 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
111d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
111e0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
111f0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
11200 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
11210 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
11220 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
11230 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11240 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
11250 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
11260 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
11270 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
11280 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
11290 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
112a0 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
112b0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
112c0 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
112d0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
112e0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
112f0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
11300 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
11310 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
11320 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
11330 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
11340 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
11350 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
11360 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
11370 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
11380 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
11390 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
113a0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
113b0 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
113c0 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
113d0 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
113e0 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
113f0 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
11400 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
11410 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ..  if( p->db->m
11420 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11430 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
11440 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
11450 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  f( p->aOnceFlag 
11460 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63  ) memset(p->aOnc
11470 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e  eFlag, 0, p->nOn
11480 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65  ceFlag);.  close
11490 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20  AllCursors(p);. 
114a0 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56   if( p->magic!=V
114b0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b  DBE_MAGIC_RUN ){
114c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
114d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65  TE_OK;.  }.  che
114e0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
114f0 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f  db);..  /* No co
11500 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
11510 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70   needed if the p
11520 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61  rogram never sta
11530 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20  rted or if the. 
11540 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
11550 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20  t does not read 
11560 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62  or write a datab
11570 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20  ase file.  */.  
11580 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20  if( p->pc>=0 && 
11590 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a  p->bIsReader ){.
115a0 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f      int mrc;   /
115b0 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20  * Primary error 
115c0 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20  code from p->rc 
115d0 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  */.    int eStat
115e0 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20  ementOp = 0;.   
115f0 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72   int isSpecialEr
11600 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ror;            
11610 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69  /* Set to true i
11620 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72  f a 'special' er
11630 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c  ror */..    /* L
11640 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75  ock all btrees u
11650 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65  sed by the state
11660 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ment */.    sqli
11670 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b  te3VdbeEnter(p);
11680 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
11690 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  or one of the sp
116a0 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a  ecial errors */.
116b0 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20      mrc = p->rc 
116c0 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70  & 0xff;.    isSp
116d0 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63  ecialError = mrc
116e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
116f0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  | mrc==SQLITE_IO
11700 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERR.            
11710 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d           || mrc=
11720 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
11730 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  T || mrc==SQLITE
11740 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69  _FULL;.    if( i
11750 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b  sSpecialError ){
11760 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
11770 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d   query was read-
11780 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72  only and the err
11790 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
117a0 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20  E_INTERRUPT, .  
117b0 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61      ** no rollba
117c0 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e  ck is necessary.
117d0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c   Otherwise, at l
117e0 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74  east a savepoint
117f0 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73   .      ** trans
11800 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72  action must be r
11810 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65  olled back to re
11820 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
11830 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a  se to a .      *
11840 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  * consistent sta
11850 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  te..      **.   
11860 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68     ** Even if th
11870 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72  e statement is r
11880 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20  ead-only, it is 
11890 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72  important to per
118a0 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20  form.      ** a 
118b0 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61  statement or tra
118c0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
118d0 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20  k operation. If 
118e0 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20  the error .     
118f0 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69   ** occurred whi
11900 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  le writing to th
11910 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a  e journal, sub-j
11920 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61  ournal or databa
11930 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
11940 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65   as part of an e
11950 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70  ffort to free up
11960 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65   cache space (se
11970 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  e function.     
11980 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28   ** pagerStress(
11990 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74  ) in pager.c), t
119a0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72  he rollback is r
119b0 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f  equired to resto
119c0 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  re .      ** the
119d0 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73   pager to a cons
119e0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20  istent state..  
119f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
11a00 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c   !p->readOnly ||
11a10 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc!=SQLITE_INT
11a20 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20  ERRUPT ){.      
11a30 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49    if( (mrc==SQLI
11a40 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d  TE_NOMEM || mrc=
11a50 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26  =SQLITE_FULL) &&
11a60 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
11a70 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
11a80 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
11a90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11aa0 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  CK;.        }els
11ab0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
11ac0 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f  We are forced to
11ad0 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61   roll back the a
11ae0 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
11af0 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a  n. Before doing.
11b00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c            ** so,
11b10 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72   abort any other
11b20 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73   statements this
11b30 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c   handle currentl
11b40 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20  y has active..  
11b50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11b60 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
11b70 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
11b80 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
11b90 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  K);.          sq
11ba0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
11bb0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
11bc0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
11bd0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
11be0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11bf0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
11c00 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  r immediate fore
11c10 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f  ign key violatio
11c20 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ns. */.    if( p
11c30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11c40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11c50 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
11c60 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
11c70 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
11c80 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
11c90 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
11ca0 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
11cb0 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
11cc0 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
11cd0 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
11ce0 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
11cf0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
11d00 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
11d10 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
11d20 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
11d30 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
11d40 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
11d50 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
11d60 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
11d70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
11d80 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
11d90 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
11da0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
11db0 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65      && db->nVdbe
11dc0 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f  Write==(p->readO
11dd0 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
11de0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
11df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
11e00 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
11e10 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
11e20 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
11e30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11e40 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
11e50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
11e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11e70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
11e80 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
11e90 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
11ea0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11eb0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
11ec0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11ed0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
11ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
11ef0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
11f00 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
11f10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
11f20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
11f30 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11f40 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
11f50 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
11f60 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
11f70 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
11f80 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
11f90 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
11fa0 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
11fb0 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
11fc0 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
11fd0 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
11fe0 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
11ff0 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
12000 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
12010 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
12020 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
12030 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
12040 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
12050 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
12060 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
12070 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
12080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12090 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
120a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
120b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
120c0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
120d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
120e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
120f0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
12100 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
12110 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
12120 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12130 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  {.          db->
12140 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
12150 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
12160 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
12170 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
12180 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
12190 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
121a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
121b0 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
121c0 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20  hanges(db);.    
121d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
121e0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
121f0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
12200 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
12210 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e      }.      db->
12220 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
12230 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
12240 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b  tatementOp==0 ){
12250 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
12260 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
12270 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
12280 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20  E_Fail ){.      
12290 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
122a0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
122b0 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  SE;.      }else 
122c0 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  if( p->errorActi
122d0 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  on==OE_Abort ){.
122e0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65          eStateme
122f0 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54  ntOp = SAVEPOINT
12300 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20  _ROLLBACK;.     
12310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12320 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
12330 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
12340 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
12350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
12360 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
12370 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
12380 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
12390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
123a0 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65      /* If eState
123b0 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65  mentOp is non-ze
123c0 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65  ro, then a state
123d0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
123e0 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
123f0 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72   be committed or
12400 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61   rolled back. Ca
12410 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  ll sqlite3VdbeCl
12420 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74  oseStatement() t
12430 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20  o.    ** do so. 
12440 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  If this operatio
12450 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
12460 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  or, and the curr
12470 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ent statement.  
12480 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20    ** error code 
12490 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20  is SQLITE_OK or 
124a0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
124b0 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20  T, then promote 
124c0 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
124d0 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72  nt statement err
124e0 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a  or code..    */.
124f0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
12500 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63  ntOp ){.      rc
12510 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c   = sqlite3VdbeCl
12520 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20  oseStatement(p, 
12530 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20  eStatementOp);. 
12540 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
12550 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
12560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
12570 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  p->rc&0xff)==SQL
12580 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29  ITE_CONSTRAINT )
12590 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
125a0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
125b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
125c0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
125d0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45  .          p->zE
125e0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20  rrMsg = 0;.     
125f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
12600 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
12610 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
12620 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
12630 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
12640 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
12650 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
12660 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
12670 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
12680 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
12690 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  an INSERT, UPDAT
126a0 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20  E or DELETE and 
126b0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
126c0 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nsaction.    ** 
126d0 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  has been rolled 
126e0 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65  back, update the
126f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12700 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e  tion change-coun
12710 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ter. .    */.   
12720 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e   if( p->changeCn
12730 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28  tOn ){.      if(
12740 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53   eStatementOp!=S
12750 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12760 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12770 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
12780 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67  es(db, p->nChang
12790 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
127a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
127b0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64  VdbeSetChanges(d
127c0 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, 0);.      }. 
127d0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
127e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
127f0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  /* Release the l
12800 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ocks */.    sqli
12810 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
12820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61  .  }..  /* We ha
12830 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ve successfully 
12840 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  halted and close
12850 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72  d the VM.  Recor
12860 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  d this fact. */.
12870 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
12880 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41  {.    db->nVdbeA
12890 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28  ctive--;.    if(
128a0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20   !p->readOnly ) 
128b0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d  db->nVdbeWrite--
128c0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73  ;.    if( p->bIs
128d0 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64  Reader ) db->nVd
128e0 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73  beRead--;.    as
128f0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
12900 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65  ctive>=db->nVdbe
12910 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65  Read );.    asse
12920 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  rt( db->nVdbeRea
12930 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  d>=db->nVdbeWrit
12940 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
12950 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e   db->nVdbeWrite>
12960 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  =0 );.  }.  p->m
12970 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
12980 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41  C_HALT;.  checkA
12990 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29  ctiveVdbeCnt(db)
129a0 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
129b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
129c0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
129d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
129e0 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
129f0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
12a00 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20  t to true, then 
12a10 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  any locks that w
12a20 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79  ere held.  ** by
12a30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
12a40 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c  ave now been rel
12a50 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69  eased. Call sqli
12a60 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
12a70 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f  ocked() .  ** to
12a80 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75   invoke any requ
12a90 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ired unlock-noti
12aa0 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
12ab0 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  */.  if( db->aut
12ac0 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73  oCommit ){.    s
12ad0 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
12ae0 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20  Unlocked(db);.  
12af0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  }..  assert( db-
12b00 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c  >nVdbeActive>0 |
12b10 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  | db->autoCommit
12b20 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74  ==0 || db->nStat
12b30 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65  ement==0 );.  re
12b40 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c  turn (p->rc==SQL
12b50 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54  ITE_BUSY ? SQLIT
12b60 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f  E_BUSY : SQLITE_
12b70 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  OK);.}.../*.** E
12b80 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74  ach VDBE holds t
12b90 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
12ba0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
12bb0 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c  ite3_step() call
12bc0 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54  .** in p->rc.  T
12bd0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
12be0 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63   that result bac
12bf0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  k to SQLITE_OK..
12c00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
12c10 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75  dbeResetStepResu
12c20 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  lt(Vdbe *p){.  p
12c30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
12c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
12c50 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61  the error code a
12c60 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
12c70 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
12c80 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a  e VDBE passed.**
12c90 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
12ca0 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61  gument to its da
12cb0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73  tabase handle (s
12cc0 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c  o that they will
12cd0 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   be .** returned
12ce0 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   by calls to sql
12cf0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61  ite3_errcode() a
12d00 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  nd sqlite3_errms
12d10 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  g())..**.** This
12d20 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
12d30 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42  ot clear the VDB
12d40 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20  E error code or 
12d50 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a  message, just.**
12d60 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20   copies them to 
12d70 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
12d80 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
12d90 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
12da0 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  rror(Vdbe *p){. 
12db0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12dc0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
12dd0 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d   p->rc;.  if( p-
12de0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
12df0 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  u8 mallocFailed 
12e00 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  = db->mallocFail
12e10 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ed;.    sqlite3B
12e20 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
12e30 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ();.    if( db->
12e40 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45  pErr==0 ) db->pE
12e50 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
12e60 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
12e70 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
12e80 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
12e90 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
12ea0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
12eb0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
12ec0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
12ed0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
12ee0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
12ef0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
12f00 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20    db->errCode = 
12f10 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  rc;.  }else{.   
12f20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
12f30 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  , rc);.  }.  ret
12f40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
12f50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12f60 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20  SQLLOG./*.** If 
12f70 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  an SQLITE_CONFIG
12f80 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20  _SQLLOG hook is 
12f90 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74  registered and t
12fa0 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72  he VM has been r
12fb0 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69  un, .** invoke i
12fc0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
12fd0 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  d vdbeInvokeSqll
12fe0 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69  og(Vdbe *v){.  i
12ff0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
13000 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26  Config.xSqllog &
13010 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & v->rc==SQLITE_
13020 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26  OK && v->zSql &&
13030 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   v->pc>=0 ){.   
13040 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64   char *zExpanded
13050 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
13060 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53  pandSql(v, v->zS
13070 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ql);.    assert(
13080 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73   v->db->init.bus
13090 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
130a0 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20  zExpanded ){.   
130b0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
130c0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a  Config.xSqllog(.
130d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
130e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
130f0 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c  qllogArg, v->db,
13100 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20   zExpanded, 1.  
13110 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c      );.      sql
13120 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62  ite3DbFree(v->db
13130 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20  , zExpanded);.  
13140 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
13150 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76  # define vdbeInv
13160 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e  okeSqllog(x).#en
13170 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  dif../*.** Clean
13180 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72   up a VDBE after
13190 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64   execution but d
131a0 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
131b0 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a   VDBE just yet..
131c0 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  ** Write any err
131d0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f  or messages into
131e0 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74   *pzErrMsg.  Ret
131f0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63  urn the result c
13200 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72  ode..**.** After
13210 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13220 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73   run, the VDBE s
13230 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74  hould be ready t
13240 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a  o be executed.**
13250 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f   again..**.** To
13260 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74   look at it anot
13270 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f  her way, this ro
13280 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65  utine resets the
13290 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a   state of the.**
132a0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
132b0 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43   from VDBE_MAGIC
132c0 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47  _RUN or VDBE_MAG
132d0 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a  IC_HALT back to.
132e0 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  ** VDBE_MAGIC_IN
132f0 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IT..*/.int sqlit
13300 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65  e3VdbeReset(Vdbe
13310 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
13320 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  *db;.  db = p->d
13330 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  b;..  /* If the 
13340 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74  VM did not run t
13350 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20  o completion or 
13360 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65  if it encountere
13370 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c  d an.  ** error,
13380 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e   then it might n
13390 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c  ot have been hal
133a0 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53  ted properly.  S
133b0 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e  o halt.  ** it n
133c0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ow..  */.  sqlit
133d0 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a  e3VdbeHalt(p);..
133e0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45    /* If the VDBE
133f0 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e   has be run even
13400 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e   partially, then
13410 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72   transfer the er
13420 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e  ror code.  ** an
13430 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
13440 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e  from the VDBE in
13450 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
13460 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  base structure. 
13470 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65   But.  ** if the
13480 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62   VDBE has just b
13490 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62  een set to run b
134a0 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61  ut has not actua
134b0 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79  lly executed any
134c0 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f  .  ** instructio
134d0 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68  ns yet, leave th
134e0 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
134f0 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f  error informatio
13500 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a  n unchanged..  *
13510 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
13520 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f   ){.    vdbeInvo
13530 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20  keSqllog(p);.   
13540 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
13550 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20  sferError(p);.  
13560 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
13570 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
13580 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
13590 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  = 0;.    if( p->
135a0 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d  runOnlyOnce ) p-
135b0 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20  >expired = 1;.  
135c0 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20  }else if( p->rc 
135d0 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b  && p->expired ){
135e0 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69  .    /* The expi
135f0 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74  red flag was set
13600 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66   on the VDBE bef
13610 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61  ore the first ca
13620 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
13630 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72  ite3_step(). For
13640 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69   consistency (si
13650 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  nce sqlite3_step
13660 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61  () was.    ** ca
13670 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64  lled), set the d
13680 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
13690 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65   this case as we
136a0 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ll..    */.    s
136b0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
136c0 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  sg(db, p->rc, p-
136d0 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
136e0 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
136f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
13700 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
13710 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13720 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
13730 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
13740 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
13750 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
13760 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
13770 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
13780 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
13790 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
137a0 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
137b0 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
137c0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
137d0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
137e0 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
137f0 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
13800 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
13810 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
13820 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
13830 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
13840 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
13850 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
13860 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
13870 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13880 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13890 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
138a0 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
138b0 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
138c0 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
138d0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
138e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
138f0 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
13900 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
13910 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
13920 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
13930 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
13940 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
13950 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
13960 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
13970 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
13980 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
13990 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
139a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
139b0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
139c0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
139d0 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
139e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
139f0 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
13a00 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
13a10 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
13a20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13a30 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
13a40 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
13a50 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
13a60 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
13a70 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
13a80 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
13a90 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
13aa0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13ab0 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
13ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13ad0 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
13ae0 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
13af0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
13b00 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
13b10 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
13b20 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
13b30 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
13b40 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
13b50 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
13b60 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
13b70 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
13b80 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
13b90 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
13ba0 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
13bb0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
13bc0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
13bd0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
13be0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
13bf0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
13c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13c10 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
13c20 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13c40 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
13c50 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
13c60 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
13c70 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
13c80 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
13c90 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
13ca0 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
13cb0 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
13cc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13cd0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
13ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cf0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
13d00 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
13d10 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
13d20 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
13d30 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
13d40 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
13d50 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
13d60 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
13d70 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
13d80 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13d90 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
13da0 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
13db0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
13dc0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
13dd0 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
13de0 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
13df0 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
13e00 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
13e10 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
13e20 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
13e30 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
13e40 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
13e50 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
13e60 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
13e70 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
13e80 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
13e90 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
13ea0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
13eb0 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
13ec0 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
13ed0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
13ee0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
13ef0 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
13f00 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13f10 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
13f20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
13f30 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
13f40 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
13f50 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70  parameter corrsp
13f60 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
13f70 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
13f80 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
13f90 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
13fa0 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
13fb0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
13fc0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
13fd0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
13fe0 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
13ff0 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
14000 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
14010 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
14020 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
14030 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
14040 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
14050 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
14060 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
14070 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
14080 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
14090 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
140a0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
140b0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
140c0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
140d0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
140e0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
140f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
14100 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
14110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14120 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
14130 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
14140 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
14150 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
14160 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
14170 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14180 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
14190 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
141a0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
141b0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
141c0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
141d0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
141e0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
141f0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
14200 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
14210 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
14220 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
14230 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
14240 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
14250 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
14260 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14270 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
14280 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
14290 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
142a0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
142b0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
142c0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
142d0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
142e0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
142f0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
14300 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
14310 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14320 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
14330 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14340 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
14350 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
14360 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
14370 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
14380 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
14390 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
143a0 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
143b0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
143c0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
143d0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
143e0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
143f0 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
14400 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
14410 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
14420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14430 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
14440 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14450 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
14460 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14470 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
14480 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
14490 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
144a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
144b0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
144c0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
144d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
144e0 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69  _EXPLAIN).  sqli
144f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14500 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71  >zExplain);.  sq
14510 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14520 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65  p->pExplain);.#e
14530 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
14540 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
14550 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
14560 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
14570 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
14580 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
14590 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
145a0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
145b0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
145c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
145d0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
145e0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
145f0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
14600 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
14610 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
14620 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
14630 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14640 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
14650 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
14660 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
14670 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
14680 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
14690 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
146a0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
146b0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
146c0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
146d0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
146e0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
146f0 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
14700 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
14710 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
14720 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
14730 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
14740 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
14750 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
14760 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14770 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
14780 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
14790 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
147a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
147b0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
147c0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
147d0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
147e0 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
147f0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
14800 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
14810 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
14820 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
14830 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
14840 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
14850 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
14860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
14870 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
14880 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20  (p->pCursor, 0, 
14890 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
148a0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
148b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
148c0 0a 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20  .  p->lastRowid 
148d0 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  = p->movetoTarge
148e0 74 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20  t;.  if( res!=0 
148f0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14900 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
14910 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20  p->rowidIsValid 
14920 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
14930 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
14940 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
14950 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
14960 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
14970 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
14980 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
14990 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
149a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
149b0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
149c0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
149d0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
149e0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
149f0 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
14a00 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
14a10 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
14a20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
14a30 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
14a40 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
14a50 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
14a60 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
14a70 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
14a80 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 62   is suppose to b
14a90 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20  e pointing.  If 
14aa0 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65  the row was dele
14ab0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
14ac0 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  er the.** cursor
14ad0 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f 72  , set the cursor
14ae0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e   to point to a N
14af0 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ULL row..*/.stat
14b00 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
14b10 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76  INLINE handleMov
14b20 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 72  edCursor(VdbeCur
14b30 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  sor *p){.  int i
14b40 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72  sDifferentRow, r
14b50 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  c;.  assert( p->
14b60 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
14b70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
14b80 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
14b90 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29  ed(p->pCursor) )
14ba0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14bb0 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
14bc0 72 65 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26  re(p->pCursor, &
14bd0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b  isDifferentRow);
14be0 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75  .  p->cacheStatu
14bf0 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b  s = CACHE_STALE;
14c00 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65  .  if( isDiffere
14c10 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52  ntRow ) p->nullR
14c20 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  ow = 1;.  return
14c30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
14c40 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
14c50 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
14c60 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
14c70 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
14c80 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
14c90 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
14ca0 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
14cb0 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
14cc0 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
14cd0 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
14ce0 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
14cf0 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
14d00 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
14d10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
14d20 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
14d30 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
14d40 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
14d50 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
14d60 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
14d70 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
14d80 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
14d90 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
14da0 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
14db0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
14dc0 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
14dd0 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
14de0 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
14df0 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
14e00 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
14e10 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
14e20 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
14e30 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
14e40 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
14e50 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14e60 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
14e70 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
14e80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14e90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
14ea0 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
14eb0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
14ec0 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
14ed0 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74  oveto ){.    ret
14ee0 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72  urn handleDeferr
14ef0 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d  edMoveto(p);.  }
14f00 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74  .  if( sqlite3Bt
14f10 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
14f20 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b  d(p->pCursor) ){
14f30 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
14f40 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
14f50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
14f60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14f70 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
14f80 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
14f90 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
14fa0 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
14fb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
14fc0 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
14fd0 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
14fe0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14ff0 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
15000 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15010 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
15020 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
15030 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
15040 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
15050 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
15060 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
15070 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
15080 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
15090 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
150a0 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
150b0 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
150c0 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
150d0 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
150e0 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
150f0 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
15100 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
15110 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
15120 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
15130 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
15140 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
15150 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
15160 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
15170 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
15180 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
15190 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
151a0 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
151b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
151c0 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
151d0 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
151e0 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
151f0 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
15200 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
15210 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
15220 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
15230 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
15240 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
15250 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
15260 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
15270 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
15280 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
15290 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
152a0 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
152b0 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
152c0 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
152d0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
152e0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
152f0 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
15300 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
15310 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
15320 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15330 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
15340 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
15350 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15360 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15370 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
15380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15390 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
153a0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
153b0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
153c0 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
153d0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
153e0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
15410 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15420 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
15430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
15440 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15450 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15460 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
15470 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
15480 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15490 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
154a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154b0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
154c0 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
154d0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
154e0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
154f0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
15500 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
15510 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
15520 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15530 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
15540 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
15550 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
15580 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
15590 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
155a0 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
155b0 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
155c0 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
155d0 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
155e0 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
155f0 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
15600 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
15610 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
15620 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
15630 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
15640 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
15650 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
15660 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
15670 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
15680 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
15690 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
156a0 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
156b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
156c0 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
156d0 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29  int file_format)
156e0 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  {.  int flags = 
156f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75  pMem->flags;.  u
15700 33 32 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61  32 n;..  if( fla
15710 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
15720 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
15730 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15740 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
15750 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
15760 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
15770 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
15780 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
15790 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
157a0 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
157b0 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
157c0 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
157d0 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
157e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  0 ){.      if( i
157f0 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20  <(-MAX_6BYTE) ) 
15800 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20  return 6;.      
15810 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74  /* Previous test
15820 20 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20   prevents:  u = 
15830 2d 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34  -(-9223372036854
15840 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20  775808) */.     
15850 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c   u = -i;.    }el
15860 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b  se{.      u = i;
15870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
15880 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72  <=127 ){.      r
15890 65 74 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20  eturn ((i&1)==i 
158a0 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  && file_format>=
158b0 34 29 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20  4) ? 8+(u32)u : 
158c0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
158d0 20 75 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75   u<=32767 ) retu
158e0 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c  rn 2;.    if( u<
158f0 3d 38 33 38 38 36 30 37 20 29 20 72 65 74 75 72  =8388607 ) retur
15900 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 3;.    if( u<=
15910 32 31 34 37 34 38 33 36 34 37 20 29 20 72 65 74  2147483647 ) ret
15920 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75  urn 4;.    if( u
15930 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65  <=MAX_6BYTE ) re
15940 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75  turn 5;.    retu
15950 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
15960 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
15970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a  {.    return 7;.
15980 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d    }.  assert( pM
15990 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  em->db->mallocFa
159a0 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d  iled || flags&(M
159b0 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29  EM_Str|MEM_Blob)
159c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d   );.  assert( pM
159d0 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20  em->n>=0 );.  n 
159e0 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a  = (u32)pMem->n;.
159f0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45    if( flags & ME
15a00 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20  M_Zero ){.    n 
15a10 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  += pMem->u.nZero
15a20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
15a30 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
15a40 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
15a50 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ));.}../*.** Ret
15a60 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
15a70 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 65  f the data corre
15a80 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
15a90 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d  supplied serial-
15aa0 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  type..*/.u32 sql
15ab0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15ac0 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c  peLen(u32 serial
15ad0 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65  _type){.  if( se
15ae0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b  rial_type>=12 ){
15af0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72  .    return (ser
15b00 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
15b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61    }else{.    sta
15b20 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69  tic const u8 aSi
15b30 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32  ze[] = { 0, 1, 2
15b40 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c  , 3, 4, 6, 8, 8,
15b50 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20   0, 0, 0, 0 };. 
15b60 20 20 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b     return aSize[
15b70 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
15b80 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  }.}../*.** If we
15b90 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
15ba0 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
15bb0 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
15bc0 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
15bd0 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
15be0 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
15bf0 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
15c00 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
15c10 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
15c20 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
15c30 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
15c40 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
15c50 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
15c60 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
15c70 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
15c80 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
15c90 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
15ca0 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
15cb0 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
15cc0 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
15cd0 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
15ce0 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
15cf0 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
15d00 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
15d10 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
15d20 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
15d30 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
15d40 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
15d50 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
15d60 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
15d70 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
15d80 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
15d90 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
15da0 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
15db0 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
15dc0 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
15dd0 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
15de0 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
15df0 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
15e00 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
15e10 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
15e20 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
15e30 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
15e40 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
15e50 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
15e60 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
15e70 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
15e80 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
15e90 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
15ea0 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
15eb0 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
15ec0 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
15ed0 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
15ee0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
15ef0 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
15f00 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
15f10 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
15f20 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
15f30 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
15f40 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
15f50 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
15f60 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
15f70 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
15f80 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
15f90 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
15fa0 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
15fb0 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
15fc0 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
15fd0 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
15fe0 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
15ff0 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
16000 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
16010 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
16020 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
16030 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
16040 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
16050 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
16060 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
16070 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
16080 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
16090 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
160a0 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
160b0 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
160c0 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
160d0 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
160e0 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
160f0 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
16100 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
16110 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
16120 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
16130 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
16140 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
16150 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
16160 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
16170 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
16180 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
16190 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
161a0 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
161b0 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
161c0 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
161d0 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
161e0 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
161f0 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
16200 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
16210 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
16220 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
16230 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
16240 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
16250 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
16260 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
16270 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
16280 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
16290 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
162a0 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
162b0 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
162c0 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
162d0 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
162e0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
162f0 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
16300 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
16310 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
16320 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
16330 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
16340 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
16350 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
16360 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
16370 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
16380 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
16390 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
163a0 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
163b0 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
163c0 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
163d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
163e0 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
163f0 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
16400 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
16410 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65  t in buf[].  The
16420 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
16430 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c  nsible.** for al
16440 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20  locating enough 
16450 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74  space to buf[] t
16460 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
16470 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69  e field, exclusi
16480 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65  ve.** of the pMe
16490 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73  m->u.nZero bytes
164a0 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20   for a MEM_Zero 
164b0 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  value..**.** Ret
164c0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
164d0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
164e0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
164f0 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
16500 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
16510 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
16520 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
16530 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
16540 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
16550 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
16560 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
16570 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
16580 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
16590 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  8 *buf, Mem *pMe
165a0 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  m, u32 serial_ty
165b0 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  pe){.  u32 len;.
165c0 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
165d0 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
165e0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
165f0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
16600 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
16610 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
16620 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
16630 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16640 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
16650 6f 66 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20  of(pMem->r) );. 
16660 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
16670 26 70 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66  &pMem->r, sizeof
16680 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
16690 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
166a0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
166b0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
166c0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
166d0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
166e0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
166f0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  n(serial_type);.
16700 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
16710 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  );.    do{.     
16720 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29   buf[--i] = (u8)
16730 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20  (v&0xFF);.      
16740 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68  v >>= 8;.    }wh
16750 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65  ile( i );.    re
16760 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
16770 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c   /* String or bl
16780 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  ob */.  if( seri
16790 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
167a0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
167b0 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61  >n + ((pMem->fla
167c0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70  gs & MEM_Zero)?p
167d0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a  Mem->u.nZero:0).
167e0 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20               == 
167f0 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65  (int)sqlite3Vdbe
16800 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
16810 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20  rial_type) );.  
16820 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b    len = pMem->n;
16830 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c  .    memcpy(buf,
16840 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a   pMem->z, len);.
16850 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16860 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f    }..  /* NULL o
16870 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72  r constants 0 or
16880 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30   1 */.  return 0
16890 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78  ;.}../* Input "x
168a0 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20  " is a sequence 
168b0 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  of unsigned char
168c0 61 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72  acters that repr
168d0 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65  esent a.** big-e
168e0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20  ndian integer.  
168f0 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76  Return the equiv
16900 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74  alent native int
16910 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  eger.*/.#define 
16920 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  ONE_BYTE_INT(x) 
16930 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a     ((i8)(x)[0]).
16940 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45  #define TWO_BYTE
16950 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a  _INT(x)    (256*
16960 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29  (i8)((x)[0])|(x)
16970 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52  [1]).#define THR
16980 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  EE_BYTE_INT(x)  
16990 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b  (65536*(i8)((x)[
169a0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c  0])|((x)[1]<<8)|
169b0 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[2]).#define 
169c0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78  FOUR_BYTE_UINT(x
169d0 29 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d  )  (((u32)(x)[0]
169e0 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  <<24)|((x)[1]<<1
169f0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
16a00 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[3]).#define F
16a10 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  OUR_BYTE_INT(x) 
16a20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28  (16777216*(i8)((
16a30 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
16a40 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c  16)|((x)[2]<<8)|
16a50 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44  (x)[3])../*.** D
16a60 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64  eserialize the d
16a70 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64  ata blob pointed
16a80 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65   to by buf as se
16a90 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c  rial type serial
16aa0 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f  _type.** and sto
16ab0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  re the result in
16ac0 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74   pMem.  Return t
16ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16ae0 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  es read..**.** T
16af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16b00 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74  implemented as t
16b10 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74  wo separate rout
16b20 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d  ines for perform
16b30 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77  ance..** The few
16b40 20 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75   cases that requ
16b50 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  ire local variab
16b60 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f  les are broken o
16b70 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61  ut into a separa
16b80 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f  te.** routine so
16b90 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61   that in most ca
16ba0 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64  ses the overhead
16bb0 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73   of moving the s
16bc0 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  tack pointer.** 
16bd0 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a  is avoided..*/ .
16be0 73 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54  static u32 SQLIT
16bf0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61  E_NOINLINE seria
16c00 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lGet(.  const un
16c10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
16c20 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20  ,     /* Buffer 
16c30 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66  to deserialize f
16c40 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72  rom */.  u32 ser
16c50 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20  ial_type,       
16c60 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
16c70 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61   type to deseria
16c80 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  lize */.  Mem *p
16c90 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  Mem             
16ca0 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
16cb0 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20  y cell to write 
16cc0 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b  value into */.){
16cd0 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f  .  u64 x = FOUR_
16ce0 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a  BYTE_UINT(buf);.
16cf0 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42    u32 y = FOUR_B
16d00 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b  YTE_UINT(buf+4);
16d10 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b  .  x = (x<<32) +
16d20 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c   y;.  if( serial
16d30 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20  _type==6 ){.    
16d40 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36  pMem->u.i = *(i6
16d50 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d  4*)&x;.    pMem-
16d60 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16d70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
16d80 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
16d90 20 7d 65 6c 73 65 7b 0a 23 69 66 20 21 64 65 66   }else{.#if !def
16da0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20  ined(NDEBUG) && 
16db0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
16dc0 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
16dd0 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69  INT).    /* Veri
16de0 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73  fy that integers
16df0 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f   and floating po
16e00 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74  int values use t
16e10 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62  he same.    ** b
16e20 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20  yte order.  Or, 
16e30 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d  that if SQLITE_M
16e40 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49  IXED_ENDIAN_64BI
16e50 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a  T_FLOAT is.    *
16e60 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36  * defined that 6
16e70 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70  4-bit floating p
16e80 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c  oint values real
16e90 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20  ly are mixed.   
16ea0 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20   ** endian..    
16eb0 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
16ec0 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75  nst u64 t1 = ((u
16ed0 36 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c  64)0x3ff00000)<<
16ee0 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  32;.    static c
16ef0 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d  onst double r1 =
16f00 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32   1.0;.    u64 t2
16f10 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d   = t1;.    swapM
16f20 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16f30 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t2);.    assert(
16f40 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a   sizeof(r1)==siz
16f50 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d  eof(t2) && memcm
16f60 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65  p(&r1, &t2, size
16f70 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65  of(r1))==0 );.#e
16f80 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
16f90 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
16fa0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
16fb0 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d  ==8 );.    swapM
16fc0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16fd0 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
16fe0 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a  pMem->r, &x, siz
16ff0 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65  eof(x));.    pMe
17000 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  m->flags = sqlit
17010 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29  e3IsNaN(pMem->r)
17020 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
17030 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
17040 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
17050 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17060 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
17070 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
17080 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
17090 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
170a0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
170b0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
170c0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
170d0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
170e0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
170f0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
17100 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
17110 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
17120 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
17130 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
17140 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
17150 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
17160 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
17170 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
17180 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
17190 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
171a0 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
171b0 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   /* NULL */.    
171c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
171d0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
171e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
171f0 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d   case 1: { /* 1-
17200 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17210 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
17220 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
17230 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
17240 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
17250 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
17260 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17270 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17280 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
17290 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
172a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
172b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
172c0 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
172d0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
172e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
172f0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17300 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
17310 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
17320 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
17330 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
17340 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
17350 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  teger */.      p
17360 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45  Mem->u.i = THREE
17370 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17380 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17390 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
173a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
173b0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
173c0 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20    return 3;.    
173d0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
173e0 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
173f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
17400 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
17410 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  UR_BYTE_INT(buf)
17420 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
17430 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
17440 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
17450 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
17460 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
17470 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
17480 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
17490 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
174a0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
174b0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
174c0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
174d0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
174e0 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
174f0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17500 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
17510 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
17520 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
17530 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
17540 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
17550 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
17560 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
17570 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
17580 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
17590 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
175a0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
175b0 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
175c0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
175d0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
175e0 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
175f0 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
17600 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
17610 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
17620 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
17630 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
17640 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
17650 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
17660 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
17670 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
17680 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
17690 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
176a0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20  serial_type-8;. 
176b0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
176c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
176d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
176e0 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
176f0 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
17700 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
17710 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
17720 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
17730 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
17740 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
17750 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
17760 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
17770 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
17780 20 20 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d      pMem->xDel =
17790 20 30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   0;.      pMem->
177a0 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
177b0 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
177c0 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
177d0 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
177e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
177f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
17800 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
17810 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
17820 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
17830 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
17840 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
17850 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
17860 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
17870 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
17880 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
17890 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
178a0 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
178b0 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
178c0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
178d0 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
178e0 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
178f0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
17900 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
17910 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
17920 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
17930 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
17940 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
17950 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
17960 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
17970 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
17980 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
17990 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
179a0 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
179b0 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
179c0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
179d0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
179e0 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
179f0 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
17a00 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
17a10 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
17a20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
17a30 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
17a40 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
17a50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
17a60 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
17a70 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
17a80 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
17a90 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
17aa0 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
17ab0 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
17ac0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
17ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
17ae0 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
17af0 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
17b00 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
17b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
17b20 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
17b30 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
17b40 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b60 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
17b70 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
17b80 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17ba0 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
17bb0 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
17bc0 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
17bd0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
17be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
17bf0 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
17c00 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
17c10 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
17c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c30 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
17c40 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
17c50 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
17c60 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
17c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c80 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
17c90 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
17ca0 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
17cb0 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
17cc0 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
17cd0 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
17ce0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
17cf0 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
17d00 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
17d10 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
17d20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
17d30 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
17d40 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
17d50 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
17d60 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
17d70 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
17d80 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
17d90 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
17da0 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
17db0 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
17dc0 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
17dd0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
17de0 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
17df0 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
17e00 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
17e10 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
17e20 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
17e30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
17e40 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
17e50 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
17e60 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
17e70 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
17e80 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
17e90 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
17ea0 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
17eb0 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
17ec0 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
17ed0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
17ee0 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
17ef0 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
17f00 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
17f10 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
17f20 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
17f30 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
17f40 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
17f50 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
17f60 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
17f70 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
17f80 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
17f90 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
17fa0 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
17fb0 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
17fc0 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
17fd0 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
17fe0 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
17ff0 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
18000 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
18010 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
18020 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18030 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
18040 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
18050 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
18060 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
18070 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
18080 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
18090 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
180a0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
180c0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
180d0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
180e0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
180f0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
18100 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
18110 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18120 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
18130 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
18140 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
18150 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
18160 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18170 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
18180 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
18190 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
181a0 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
181d0 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
181e0 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
18210 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
18220 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
18230 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
18240 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
18250 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
18260 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
18270 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
18280 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
18290 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
182a0 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
182b0 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
182c0 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
182d0 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20   && u<p->nField 
182e0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
182f0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
18300 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
18310 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
18320 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
18330 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
18340 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
18350 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
18360 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
18370 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
18380 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
18390 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
183a0 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
183b0 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
183c0 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30  Mem->zMalloc = 0
183d0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20  ;.    pMem->z = 
183e0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
183f0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18400 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
18410 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
18420 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75     pMem++;.    u
18430 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
18440 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
18450 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
18460 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
18470 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
18480 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
18490 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
184a0 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
184b0 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
184c0 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
184d0 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
184e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
184f0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
18500 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
18510 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
18520 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
18530 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
18540 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
18550 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
18560 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
18570 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
18580 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
18590 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
185a0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
185b0 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
185c0 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
185d0 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
185e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
185f0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
18600 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
18610 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
18620 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
18630 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  t vdbeRecordComp
18640 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20  areDebug(.  int 
18650 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
18660 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
18670 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  t key */.  const
18680 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
18690 2a 70 50 4b 65 79 32 20 20 2f 2a 20 52 69 67 68  *pPKey2  /* Righ
186a0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33  t key */.){.  u3
186b0 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20  2 d1;           
186c0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
186d0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64  aKey[] of next d
186e0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  ata element */. 
186f0 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
18700 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
18710 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78  to aKey[] of nex
18720 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74  t header element
18730 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31   */.  u32 szHdr1
18740 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
18750 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68  er of bytes in h
18760 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  eader */.  int i
18770 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
18780 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69   0;.  const unsi
18790 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
187a0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
187b0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
187c0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
187d0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31  Info;.  Mem mem1
187e0 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20  ;..  pKeyInfo = 
187f0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
18800 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
18810 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
18820 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
18830 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
18840 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
18850 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
18860 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
18870 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
18880 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
18890 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  m1.zMalloc = 0; 
188a0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
188b0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
188c0 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a  tements */..  /*
188d0 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63   Compilers may c
188e0 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d  omplain that mem
188f0 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69  1.u.i is potenti
18900 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a  ally uninitializ
18910 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c  ed..  ** We coul
18920 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c  d initialize it,
18930 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20   as shown here, 
18940 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65  to silence those
18950 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a   complaints..  *
18960 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d  * But in fact, m
18970 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76  em1.u.i will nev
18980 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75  er actually be u
18990 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  sed uninitialize
189a0 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20  d, and doing .  
189b0 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61  ** the unnecessa
189c0 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ry initializatio
189d0 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62  n has a measurab
189e0 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66  le negative perf
189f0 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70  ormance.  ** imp
18a00 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20  act, since this 
18a10 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72  routine is a ver
18a20 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20  y high runner.  
18a30 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73  And so, we choos
18a40 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65  e.  ** to ignore
18a50 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61   the compiler wa
18a60 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65  rnings and leave
18a70 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75   this variable u
18a80 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20  ninitialized..  
18a90 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e  */.  /*  mem1.u.
18aa0 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e  i = 0;  // not n
18ab0 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73  eeded, here to s
18ac0 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20  ilence compiler 
18ad0 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20  warning */.  .  
18ae0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74  idx1 = getVarint
18af0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31  32(aKey1, szHdr1
18b00 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  );.  d1 = szHdr1
18b10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18b20 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
18b30 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
18b40 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
18b50 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
18b60 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
18b70 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
18b80 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
18b90 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
18ba0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
18bb0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
18bc0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
18bd0 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
18be0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
18bf0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
18c00 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
18c10 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
18c20 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
18c30 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
18c40 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
18c50 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
18c60 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
18c70 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
18c80 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
18c90 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
18ca0 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
18cb0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
18cc0 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
18cd0 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
18ce0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
18cf0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
18d00 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
18d10 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
18d20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
18d30 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
18d40 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
18d50 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
18d60 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
18d70 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
18d80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
18d90 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
18da0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
18db0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
18dc0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
18dd0 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
18de0 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
18df0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
18e00 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
18e10 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
18e20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18e30 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
18e40 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
18e50 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
18e60 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
18e70 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18e80 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
18e90 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
18ea0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
18eb0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
18ec0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
18ed0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
18ee0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
18ef0 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
18f00 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
18f10 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
18f20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
18f30 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  .zMalloc==0 );  
18f40 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
18f50 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66  elow */.      if
18f60 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
18f70 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
18f80 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20       rc = -rc;  
18f90 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65  /* Invert the re
18fa0 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f  sult for DESC so
18fb0 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20  rt order. */.   
18fc0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
18fd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18fe0 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  i++;.  }while( i
18ff0 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c  dx1<szHdr1 && i<
19000 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29  pPKey2->nField )
19010 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72  ;..  /* No memor
19020 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  y allocation is 
19030 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d  ever used on mem
19040 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75  1.  Prove this u
19050 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f  sing.  ** the fo
19060 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
19070 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74  .  If the assert
19080 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64  () fails, it ind
19090 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65  icates a.  ** me
190a0 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20  mory leak and a 
190b0 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  need to call sql
190c0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
190d0 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a  se(&mem1)..  */.
190e0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
190f0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
19100 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
19110 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
19120 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
19130 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
19140 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
19150 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
19160 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
19170 52 65 74 75 72 6e 20 74 68 65 20 74 68 65 20 64  Return the the d
19180 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
19190 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 65 74 75  alue.  */.  retu
191a0 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
191b0 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  lt_rc;.}.#endif.
191c0 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
191d0 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
191e0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
191f0 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
19200 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
19210 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
19220 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
19230 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
19240 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
19250 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
19260 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
19270 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
19280 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
19290 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
192a0 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
192b0 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
192c0 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
192d0 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
192e0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
192f0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
19300 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
19310 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
19320 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
19330 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
19340 53 65 71 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 20  Seq *pColl.){.  
19350 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
19360 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
19370 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
19380 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
19390 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
193a0 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
193b0 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
193c0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
193d0 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
193e0 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
193f0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
19400 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
19410 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
19420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19430 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
19440 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
19450 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
19460 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
19470 4d 65 6d 20 63 32 3b 0a 20 20 20 20 6d 65 6d 73  Mem c2;.    mems
19480 65 74 28 26 63 31 2c 20 30 2c 20 73 69 7a 65 6f  et(&c1, 0, sizeo
19490 66 28 63 31 29 29 3b 0a 20 20 20 20 6d 65 6d 73  f(c1));.    mems
194a0 65 74 28 26 63 32 2c 20 30 2c 20 73 69 7a 65 6f  et(&c2, 0, sizeo
194b0 66 28 63 32 29 29 3b 0a 20 20 20 20 73 71 6c 69  f(c2));.    sqli
194c0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
194d0 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31  wCopy(&c1, pMem1
194e0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
194f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
19500 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c  ShallowCopy(&c2,
19510 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65   pMem2, MEM_Ephe
19520 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c  m);.    v1 = sql
19530 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73  ite3ValueText((s
19540 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63  qlite3_value*)&c
19550 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a  1, pColl->enc);.
19560 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f      n1 = v1==0 ?
19570 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76   0 : c1.n;.    v
19580 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  2 = sqlite3Value
19590 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
195a0 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d  lue*)&c2, pColl-
195b0 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20  >enc);.    n2 = 
195c0 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e  v2==0 ? 0 : c2.n
195d0 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c  ;.    rc = pColl
195e0 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55  ->xCmp(pColl->pU
195f0 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c  ser, n1, v1, n2,
19600 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   v2);.    sqlite
19610 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
19620 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &c1);.    sqlite
19630 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
19640 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  &c2);.    return
19650 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   rc;.  }.}../*.*
19660 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61  * Compare the va
19670 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62  lues contained b
19680 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79  y the two memory
19690 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e   cells, returnin
196a0 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a  g.** negative, z
196b0 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ero or positive 
196c0 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  if pMem1 is less
196d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c   than, equal to,
196e0 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74   or greater.** t
196f0 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69  han pMem2. Sorti
19700 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c  ng order is NULL
19710 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77  's first, follow
19720 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69  ed by numbers (i
19730 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72  ntegers.** and r
19740 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d  eals) sorted num
19750 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77  erically, follow
19760 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72  ed by text order
19770 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74  ed by the collat
19780 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
19790 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c  pColl and finall
197a0 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64  y blob's ordered
197b0 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a   by memcmp()..**
197c0 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c  .** Two NULL val
197d0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
197e0 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73  ed equal by this
197f0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
19800 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  t sqlite3MemComp
19810 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
19820 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  Mem1, const Mem 
19830 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f  *pMem2, const Co
19840 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20  llSeq *pColl){. 
19850 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 66   int rc;.  int f
19860 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
19870 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
19880 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
19890 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
198a0 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
198b0 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
198c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d  ;.  assert( (com
198d0 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
198e0 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
198f0 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
19900 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
19910 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
19920 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
19930 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
19940 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
19950 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
19960 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
19970 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
19980 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
19990 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
199a0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
199b0 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d 62   value is a numb
199c0 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  er and the other
199d0 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d   is not, the num
199e0 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ber is less..  *
199f0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e 75  * If both are nu
19a00 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 61  mbers, compare a
19a10 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 69  s reals if one i
19a20 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 20  s a real, or as 
19a30 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 66  integers.  ** if
19a40 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 65   both values are
19a50 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a   integers..  */.
19a60 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66    if( combined_f
19a70 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45  lags&(MEM_Int|ME
19a80 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 64  M_Real) ){.    d
19a90 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20  ouble r1, r2;.  
19aa0 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
19ab0 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a   MEM_Int)!=0 ){.
19ac0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
19ad0 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i < pMem2->u.
19ae0 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  i ) return -1;. 
19af0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
19b00 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69  u.i > pMem2->u.i
19b10 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
19b20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19b30 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d   }.    if( (f1&M
19b40 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
19b50 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d       r1 = pMem1-
19b60 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  >r;.    }else if
19b70 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f1&MEM_Int)!=
19b80 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 ){.      r1 = 
19b90 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75  (double)pMem1->u
19ba0 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  .i;.    }else{. 
19bb0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19bc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32     }.    if( (f2
19bd0 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
19be0 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 6d  .      r2 = pMem
19bf0 32 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20  2->r;.    }else 
19c00 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29  if( (f2&MEM_Int)
19c10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20  !=0 ){.      r2 
19c20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d  = (double)pMem2-
19c30 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  >u.i;.    }else{
19c40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19c60 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 2d  r1<r2 ) return -
19c70 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 32  1;.    if( r1>r2
19c80 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
19c90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
19ca0 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
19cb0 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
19cc0 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
19cd0 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
19ce0 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
19cf0 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
19d00 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
19d10 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
19d20 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
19d30 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
19d40 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
19d50 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
19d60 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
19d70 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19d80 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
19d90 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
19da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
19db0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
19dc0 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
19dd0 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20  =pMem2->enc );. 
19de0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
19df0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
19e00 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
19e10 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
19e20 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
19e30 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
19e40 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
19e50 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
19e60 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
19e70 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
19e80 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
19e90 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
19ea0 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
19eb0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19ec0 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
19ed0 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
19ee0 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
19ef0 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
19f00 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
19f10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
19f20 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
19f30 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
19f40 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
19f50 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
19f60 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
19f70 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
19f80 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
19f90 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
19fa0 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
19fb0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
19fc0 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
19fd0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
19fe0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
19ff0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1a000 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1a010 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1a020 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1a030 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1a040 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63    */.  rc = memc
1a050 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65  mp(pMem1->z, pMe
1a060 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e  m2->z, (pMem1->n
1a070 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32  >pMem2->n)?pMem2
1a080 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20  ->n:pMem1->n);. 
1a090 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
1a0a0 20 20 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20    rc = pMem1->n 
1a0b0 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a  - pMem2->n;.  }.
1a0c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a0d0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
1a0e0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
1a0f0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1a100 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79  n is a serial-ty
1a110 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65  pe that.** corre
1a120 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74  sponds to an int
1a130 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65  eger - all value
1a140 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  s between 1 and 
1a150 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20  9 inclusive .** 
1a160 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65  except 7. The se
1a170 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61  cond points to a
1a180 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
1a190 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  ng an integer va
1a1a0 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65  lue.** serialize
1a1b0 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  d according to s
1a1c0 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73  erial_type. This
1a1d0 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
1a1e0 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65  alizes.** and re
1a1f0 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e  turns the value.
1a200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76  .*/.static i64 v
1a210 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49  dbeRecordDecodeI
1a220 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79  nt(u32 serial_ty
1a230 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  pe, const u8 *aK
1a240 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20  ey){.  u32 y;.  
1a250 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
1a260 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  DB || (serial_ty
1a270 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f  pe>=1 && serial_
1a280 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61  type<=9 && seria
1a290 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20  l_type!=7) );.  
1a2a0 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1a2b0 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1a2c0 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20  0:.    case 1:. 
1a2d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1a2e0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1a2f0 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f       return ONE_
1a300 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1a310 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20      case 2:.    
1a320 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a330 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a340 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54    return TWO_BYT
1a350 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a360 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74   case 3:.      t
1a370 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a380 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1a390 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45  eturn THREE_BYTE
1a3a0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1a3b0 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20  case 4: {.      
1a3c0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1a3d0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1a3e0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1a3f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1a400 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e  return (i64)*(in
1a410 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20  t*)&y;.    }.   
1a420 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20   case 5: {.     
1a430 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1a440 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1a450 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54   return FOUR_BYT
1a460 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1a470 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1a480 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1a490 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  y);.    }.    ca
1a4a0 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36  se 6: {.      u6
1a4b0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
1a4c0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1a4d0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a4e0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a4f0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
1a500 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1a510 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65  Key+4);.      re
1a520 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a  turn (i64)*(i64*
1a530 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  )&x;.    }.  }..
1a540 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
1a550 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f  _type - 8);.}../
1a560 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a570 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20  on compares the 
1a580 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f  two table rows o
1a590 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a  r index records.
1a5a0 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1a5b0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61  {nKey1, pKey1} a
1a5c0 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72  nd pPKey2.  It r
1a5d0 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76  eturns a negativ
1a5e0 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f  e, zero.** or po
1a5f0 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69  sitive integer i
1a600 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74  f key1 is less t
1a610 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1a620 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61   .** greater tha
1a630 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b  n key2.  The {nK
1a640 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20  ey1, pKey1} key 
1a650 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a  must be a blob.*
1a660 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 20  * created by th 
1a670 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
1a680 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
1a690 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a  .  The pPKey2.**
1a6a0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70   key must be a p
1a6b0 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61  arsed key such a
1a6c0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
1a6d0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61  ** sqlite3VdbePa
1a6e0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  rseRecord..**.**
1a6f0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b   If argument bSk
1a700 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
1a710 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  it is assumed th
1a720 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1a730 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74  s already.** det
1a740 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1a750 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1a760 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1a770 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20  ual..**.** Key1 
1a780 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20  and Key2 do not 
1a790 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  have to contain 
1a7a0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
1a7b0 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c  of fields. If al
1a7c0 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61  l .** fields tha
1a7d0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68  t appear in both
1a7e0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c   keys are equal,
1a7f0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65   then pPKey2->de
1a800 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20  fault_rc is .** 
1a810 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
1a820 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  If database corr
1a830 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76  uption is discov
1a840 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32  ered, set pPKey2
1a850 2d 3e 69 73 43 6f 72 72 75 70 74 20 74 6f 20 6e  ->isCorrupt to n
1a860 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 72  on-zero.** and r
1a870 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20  eturn 0..*/.int 
1a880 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a890 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
1a8a0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1a8b0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1a8c0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1a8d0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1a8e0 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1a8f0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1a900 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a920 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1a930 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1a940 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1a970 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1a980 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1a990 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1a9c0 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1a9d0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1a9e0 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aa00 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1aa10 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1aa20 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1aa50 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1aa60 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1aa70 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aa90 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1aaa0 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1aab0 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1aac0 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1aad0 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1aae0 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1aaf0 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1ab00 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1ab10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1ab20 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1ab30 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ab40 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1ab50 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1ab60 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1ab70 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1ab80 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1ab90 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1aba0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1abb0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1abc0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1abd0 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1abe0 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1abf0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1ac00 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1ac10 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1ac20 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1ac30 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1ac40 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1ac50 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1ac60 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1ac70 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1ac80 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1ac90 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1aca0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1acb0 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1acc0 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1acd0 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1ace0 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1acf0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1ad00 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1ad10 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1ad20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1ad30 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1ad40 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d  ey2->isCorrupt =
1ad50 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ad60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1ad70 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
1ad80 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1ad90 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
1ada0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
1adb0 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  m1.zMalloc = 0; 
1adc0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1add0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1ade0 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1adf0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1ae00 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1ae10 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1ae20 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1ae30 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1ae40 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1ae50 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1ae60 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1ae70 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1ae80 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1ae90 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1aea0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1aeb0 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1aec0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1aed0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1aee0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1aef0 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1af00 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1af10 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1af20 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1af30 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1af40 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1af50 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1af60 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1af70 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1af80 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  >=12 ){.        
1af90 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1afa0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1afb0 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1afc0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1afd0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1afe0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1aff0 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73        double rhs
1b000 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 2d   = (double)pRhs-
1b010 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 71  >u.i;.        sq
1b020 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b030 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1b040 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1b050 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1b060 6d 65 6d 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20  mem1.r<rhs ){.  
1b070 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1b080 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1b090 66 28 20 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b  f( mem1.r>rhs ){
1b0a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b0b0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1b0c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b0d0 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1b0e0 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1b0f0 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1b100 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1b110 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1b120 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1b130 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1b140 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1b150 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b160 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1b170 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1b180 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b190 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b1a0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1b1b0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1b1c0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1b1d0 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1b1e0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1b1f0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1b200 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1b210 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1b220 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1b230 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1b240 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1b250 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1b260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
1b270 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73  ouble rhs = pRhs
1b280 2d 3e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f 75  ->r;.        dou
1b290 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 20  ble lhs;.       
1b2a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b2b0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1b2c0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1b2d0 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1b2e0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1b2f0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  7 ){.          l
1b300 68 73 20 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20  hs = mem1.r;.   
1b310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b320 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f 75        lhs = (dou
1b330 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20  ble)mem1.u.i;.  
1b340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1b350 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1b360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1b370 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1b380 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1b390 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1b3a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b3b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b3c0 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
1b3d0 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
1b3e0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1b3f0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
1b400 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1b410 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1b420 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1b430 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1b440 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1b450 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1b460 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
1b470 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1b480 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1b490 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1b4a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1b4b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1b4c0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
1b4d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1b4e0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1b4f0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1b500 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
1b510 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1b520 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1b530 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
1b540 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1b550 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
1b560 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
1b570 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1b580 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 73        pPKey2->is
1b590 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53 51  Corrupt = (u8)SQ
1b5a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b5b0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1b5c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b5d0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1b5e0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1b5f0 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
1b600 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
1b610 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
1b620 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1b630 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
1b640 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1b650 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
1b660 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
1b670 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
1b680 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
1b690 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
1b6a0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
1b6b0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 26  mpareMemString(&
1b6c0 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1b6d0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
1b6e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1b6f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1b700 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c  mp = MIN(mem1.n,
1b710 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1b720 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1b730 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1b740 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1b750 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1b760 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d   ) rc = mem1.n -
1b770 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20   pRhs->n; .     
1b780 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b790 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1b7a0 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20  s a blob */.    
1b7b0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1b7c0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1b7d0 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69  ){.      getVari
1b7e0 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31  nt32(&aKey1[idx1
1b7f0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
1b800 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1b810 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32   serial_type==12
1b820 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65   );.      if( se
1b830 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20  rial_type<12 || 
1b840 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
1b850 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  x01) ){.        
1b860 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1b870 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1b880 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c  t nStr = (serial
1b890 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b  _type - 12) / 2;
1b8a0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b8b0 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75  e( (d1+nStr)==(u
1b8c0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1b8d0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
1b8e0 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d  e( (d1+nStr+1)==
1b8f0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b900 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1b910 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69  d1+nStr) > (unsi
1b920 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1b930 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1b940 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29  isCorrupt = (u8)
1b950 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b960 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1b970 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b980 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1b990 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1b9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b9b0 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
1b9c0 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b  (nStr, pRhs->n);
1b9d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b9e0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1b9f0 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1ba00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ba10 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53   rc==0 ) rc = nS
1ba20 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20  tr - pRhs->n;.  
1ba30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ba40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1ba50 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20  S is null */.   
1ba60 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72   else{.      ser
1ba70 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1ba80 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63  [idx1];.      rc
1ba90 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21   = (serial_type!
1baa0 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  =0);.    }..    
1bab0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1bac0 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
1bad0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
1bae0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1baf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1bb00 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1bb10 54 5f 44 42 0a 20 20 20 20 20 20 20 20 20 20 7c  T_DB.          |
1bb20 7c 20 28 72 63 3c 30 20 26 26 20 76 64 62 65 52  | (rc<0 && vdbeR
1bb30 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1bb40 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1bb50 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20  pPKey2)<0).     
1bb60 20 20 20 20 20 7c 7c 20 28 72 63 3e 30 20 26 26       || (rc>0 &&
1bb70 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1bb80 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1bb90 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29  Key1, pPKey2)>0)
1bba0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4b  .          || pK
1bbb0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1bbc0 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 20 20 29  ocFailed.      )
1bbd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bbe0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
1bbf0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1bc00 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1bc10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1bc20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1bc30 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1bc40 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1bc50 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1bc60 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1bc70 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1bc80 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1bc90 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1bca0 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1bcb0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1bcc0 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1bcd0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1bce0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1bcf0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1bd00 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1bd10 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1bd20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1bd30 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1bd40 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1bd50 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1bd60 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1bd70 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1bd80 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1bd90 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1bda0 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
1bdb0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a    assert( mem1.z
1bdc0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1bdd0 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1bde0 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 20  ans that one or 
1bdf0 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 73  both of the keys
1be00 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1be10 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1be20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1be30 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1be40 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1be50 68 65 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72  he the default_r
1be60 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a  c.  ** value.  *
1be70 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  /.  assert( CORR
1be80 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  UPT_DB .       |
1be90 7c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  | pPKey2->defaul
1bea0 74 5f 72 63 3d 3d 76 64 62 65 52 65 63 6f 72 64  t_rc==vdbeRecord
1beb0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1bec0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1bed0 32 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b  2) .       || pK
1bee0 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1bef0 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1bf00 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
1bf10 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 0a 2f 2a  efault_rc;.}../*
1bf20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1bf30 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1bf40 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1bf50 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1bf60 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1bf70 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1bf80 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1bf90 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1bfa0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1bfb0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1bfc0 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1bfd0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1bfe0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1bff0 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1c000 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1c010 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1c020 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1c030 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1c040 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1c050 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1c060 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1c070 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1c080 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1c090 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1c0a0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1c0b0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1c0c0 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1c0d0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1c0e0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1c0f0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1c100 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1c110 2c 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74  ,       /* Right
1c120 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1c130 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1c140 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72          /* Ignor
1c150 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ed */.){.  const
1c160 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
1c170 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
1c180 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
1c190 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
1c1a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
1c1b0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1c1c0 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
1c1d0 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
1c1e0 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b  x;.  i64 v = pPK
1c1f0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69  ey2->aMem[0].u.i
1c200 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 20 20 55  ;.  i64 lhs;.  U
1c210 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c220 62 53 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65 72  bSkip);..  asser
1c230 74 28 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a 20  t( bSkip==0 );. 
1c240 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29   assert( (*(u8*)
1c250 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20  pKey1)<=0x3F || 
1c260 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1c270 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
1c280 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
1c290 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
1c2a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1c2b0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45  .      lhs = ONE
1c2c0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1c2d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c2e0 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1c2f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c300 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
1c310 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c320 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1c330 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28   = TWO_BYTE_INT(
1c340 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1c350 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1c360 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c370 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b   }.    case 3: {
1c380 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65   /* 3-byte signe
1c390 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1c3a0 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42     lhs = THREE_B
1c3b0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c3c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c3d0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c3e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c3f0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79  ase 4: { /* 4-by
1c400 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c410 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46  r */.      y = F
1c420 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1c430 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  ey);.      lhs =
1c440 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b   (i64)*(int*)&y;
1c450 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1c460 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1c470 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c480 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d   case 5: { /* 6-
1c490 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1c4a0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1c4b0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1c4c0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1c4d0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1c4e0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1c4f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1c500 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1c510 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1c520 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79  ase 6: { /* 8-by
1c530 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1c540 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46  r */.      x = F
1c550 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1c560 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  ey);.      x = (
1c570 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1c580 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1c590 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69  .      lhs = *(i
1c5a0 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65  64*)&x;.      te
1c5b0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1c5c0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c5d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1c5e0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a  .      lhs = 0;.
1c5f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c600 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c   case 9:.      l
1c610 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72  hs = 1;.      br
1c620 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  eak;..    /* Thi
1c630 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20  s case could be 
1c640 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20  removed without 
1c650 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73  changing the res
1c660 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a  ults of running.
1c670 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65      ** this code
1c680 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63  . Including it c
1c690 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e  auses gcc to gen
1c6a0 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73  erate a faster s
1c6b0 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74  witch .    ** st
1c6c0 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74  atement (since t
1c6d0 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74  he range of swit
1c6e0 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73  ch targets now s
1c6f0 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e  tarts at zero an
1c700 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74  d.    ** is cont
1c710 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73  iguous) but does
1c720 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64   not cause any d
1c730 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f  uplicate code to
1c740 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20   be generated.  
1c750 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20    ** (as gcc is 
1c760 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f  clever enough to
1c770 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f   combine the two
1c780 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74   like cases). Ot
1c790 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  her .    ** comp
1c7a0 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73  ilers might be s
1c7b0 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20  imilar.  */ .   
1c7c0 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a   case 0: case 7:
1c7d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
1c7e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c7f0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1c800 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
1c810 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ..    default:. 
1c820 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1c830 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c840 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1c850 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 20  1, pPKey2, 0);. 
1c860 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20   }..  if( v>lhs 
1c870 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1c880 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65  ey2->r1;.  }else
1c890 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20   if( v<lhs ){.  
1c8a0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1c8b0 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r2;.  }else if( 
1c8c0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
1c8d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
1c8e0 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1c8f0 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1c900 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74  equal. Compare t
1c910 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20  he trailing .   
1c920 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a   ** fields.  */.
1c930 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1c940 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c950 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1c960 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
1c970 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1c980 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1c990 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1c9a0 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
1c9b0 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
1c9c0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
1c9d0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
1c9e0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
1c9f0 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
1ca00 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1ca10 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20  fault_rc;.  }.. 
1ca20 20 61 73 73 65 72 74 28 20 28 72 65 73 3d 3d 30   assert( (res==0
1ca30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1ca40 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1ca50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1ca60 3d 3d 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ==0).       || (
1ca70 72 65 73 3c 30 20 26 26 20 76 64 62 65 52 65 63  res<0 && vdbeRec
1ca80 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ca90 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1caa0 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20  Key2)<0).       
1cab0 7c 7c 20 28 72 65 73 3e 30 20 26 26 20 76 64 62  || (res>0 && vdb
1cac0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1cad0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1cae0 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 20  , pPKey2)>0).   
1caf0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1cb00 42 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  B.  );.  return 
1cb10 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
1cb20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1cb30 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1cb40 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1cb50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1cb60 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1cb70 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1cb80 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
1cb90 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
1cba0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
1cbb0 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
1cbc0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
1cbd0 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
1cbe0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
1cbf0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
1cc00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1cc10 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1cc20 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1cc30 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
1cc40 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1cc50 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
1cc60 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1cc70 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1cc80 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1cc90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1cca0 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2,       /* Ri
1ccb0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1ccc0 20 62 53 6b 69 70 0a 29 7b 0a 20 20 63 6f 6e 73   bSkip.){.  cons
1ccd0 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63  t u8 *aKey1 = (c
1cce0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a  onst u8*)pKey1;.
1ccf0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1cd00 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  e;.  int res;.  
1cd10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1cd20 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65  (bSkip);..  asse
1cd30 72 74 28 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a  rt( bSkip==0 );.
1cd40 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1cd50 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
1cd60 74 79 70 65 29 3b 0a 0a 20 20 69 66 28 20 73 65  type);..  if( se
1cd70 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
1cd80 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1cd90 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
1cda0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1cdb0 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
1cdc0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
1cdd0 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
1cde0 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
1cdf0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1ce00 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
1ce10 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
1ce20 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1ce30 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
1ce40 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
1ce50 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
1ce60 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
1ce70 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
1ce80 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
1ce90 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
1cea0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
1ceb0 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d  ey2->isCorrupt =
1cec0 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1ced0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1cee0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
1cef0 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1cf00 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d    }.    nCmp = M
1cf10 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  IN( pPKey2->aMem
1cf20 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20  [0].n, nStr );. 
1cf30 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28     res = memcmp(
1cf40 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70  &aKey1[szHdr], p
1cf50 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a  PKey2->aMem[0].z
1cf60 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66  , nCmp);..    if
1cf70 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
1cf80 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70    res = nStr - p
1cf90 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1cfa0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ;.      if( res=
1cfb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1cfc0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
1cfd0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
1cfe0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1cff0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1d000 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1d010 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ey2, 1);.       
1d020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1d030 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d040 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
1d050 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1d060 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1d070 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1d080 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
1d090 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1d0a0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1d0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1d0c0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
1d0d0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d0e0 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
1d0f0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1d100 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
1d110 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28    }..  assert( (
1d120 72 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65  res==0 && vdbeRe
1d130 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1d140 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1d150 50 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20  PKey2)==0).     
1d160 20 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76    || (res<0 && v
1d170 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d180 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1d190 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20  y1, pPKey2)<0). 
1d1a0 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20        || (res>0 
1d1b0 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  && vdbeRecordCom
1d1c0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1d1d0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e   pKey1, pPKey2)>
1d1e0 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  0).       || COR
1d1f0 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
1d200 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
1d210 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1d220 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
1d230 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
1d240 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1d250 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
1d260 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d270 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
1d280 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
1d290 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
1d2a0 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
1d2b0 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
1d2c0 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
1d2d0 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
1d2e0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
1d2f0 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
1d300 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
1d310 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
1d320 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
1d330 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1d340 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
1d350 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
1d360 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
1d370 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1d380 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
1d390 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
1d3a0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1d3b0 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
1d3c0 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
1d3d0 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
1d3e0 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
1d3f0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
1d400 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
1d410 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
1d420 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
1d430 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
1d440 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
1d450 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
1d460 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
1d470 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
1d480 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
1d490 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
1d4a0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
1d4b0 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
1d4c0 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
1d4d0 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
1d4e0 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
1d4f0 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
1d500 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1d510 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
1d520 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
1d530 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
1d540 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
1d550 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
1d560 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
1d570 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
1d580 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
1d590 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
1d5a0 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
1d5b0 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
1d5c0 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
1d5d0 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
1d5e0 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
1d5f0 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
1d600 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
1d610 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
1d620 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
1d630 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
1d640 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
1d650 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
1d660 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  if( (p->pKeyInfo
1d670 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b  ->nField + p->pK
1d680 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29  eyInfo->nXField)
1d690 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
1d6a0 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
1d6b0 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
1d6c0 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
1d6d0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
1d6e0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
1d6f0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
1d700 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1d710 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
1d720 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
1d730 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d740 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
1d750 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d760 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1d770 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
1d780 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1d790 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
1d7a0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
1d7b0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
1d7c0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1d7d0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
1d7e0 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
1d7f0 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
1d800 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
1d810 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
1d820 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
1d830 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1d840 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
1d850 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
1d860 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1d870 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
1d880 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
1d890 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d8a0 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
1d8b0 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
1d8c0 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
1d8d0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
1d8e0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1d8f0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
1d900 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
1d910 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
1d920 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
1d930 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
1d940 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1d950 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1d960 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
1d970 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1d980 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
1d990 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
1d9a0 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
1d9b0 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
1d9c0 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
1d9d0 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
1d9e0 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
1d9f0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
1da00 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
1da10 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
1da20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1da30 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
1da40 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
1da50 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
1da60 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
1da70 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
1da80 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
1da90 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1daa0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
1dab0 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
1dac0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
1dad0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
1dae0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
1daf0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1db00 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
1db10 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53  em m, v;..  UNUS
1db20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
1db30 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ;..  /* Get the 
1db40 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65  size of the inde
1db50 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69  x entry.  Only i
1db60 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f  ndices entries o
1db70 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e  f less.  ** than
1db80 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72   2GiB are suppor
1db90 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72  t - anything lar
1dba0 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62  ge must be datab
1dbb0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1dbc0 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74    ** Any corrupt
1dbd0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
1dbe0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  in sqlite3BtreeP
1dbf0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74  arseCellPtr(), t
1dc00 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74  hough, so.  ** t
1dc10 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66  his code can saf
1dc20 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20  ely assume that 
1dc30 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62  nCellKey is 32-b
1dc40 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73  its  .  */.  ass
1dc50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1dc60 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70  eCursorIsValid(p
1dc70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e  Cur) );.  VVA_ON
1dc80 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33  LY(rc =) sqlite3
1dc90 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
1dca0 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  r, &nCellKey);. 
1dcb0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
1dcc0 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a  ITE_OK );     /*
1dcd0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20   pCur is always 
1dce0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65  valid so KeySize
1dcf0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
1dd00 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c    assert( (nCell
1dd10 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58  Key & SQLITE_MAX
1dd20 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c  _U32)==(u64)nCel
1dd30 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  lKey );..  /* Re
1dd40 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ad in the comple
1dd50 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  te content of th
1dd60 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f  e index entry */
1dd70 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c  .  memset(&m, 0,
1dd80 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72   sizeof(m));.  r
1dd90 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
1dda0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
1ddb0 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
1ddc0 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
1ddd0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1dde0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1ddf0 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   The index entry
1de00 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68   must begin with
1de10 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a   a header size *
1de20 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72  /.  (void)getVar
1de30 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20  int32((u8*)m.z, 
1de40 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61  szHdr);.  testca
1de50 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a  se( szHdr==3 );.
1de60 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
1de70 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20  r==m.n );.  if( 
1de80 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33  unlikely(szHdr<3
1de90 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d   || (int)szHdr>m
1dea0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  .n) ){.    goto 
1deb0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
1dec0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
1ded0 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f  The last field o
1dee0 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75  f the index shou
1def0 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72  ld be an integer
1df00 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20   - the ROWID..  
1df10 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
1df20 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65  he last entry re
1df30 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67  ally is an integ
1df40 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  er. */.  (void)g
1df50 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1df60 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74  &m.z[szHdr-1], t
1df70 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1df80 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1df90 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==1 );.  testcas
1dfa0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20  e( typeRowid==2 
1dfb0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1dfc0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20  ypeRowid==3 );. 
1dfd0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1dfe0 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73  owid==4 );.  tes
1dff0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e000 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==5 );.  testcas
1e010 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20  e( typeRowid==6 
1e020 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e030 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20  ypeRowid==8 );. 
1e040 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e050 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28  owid==9 );.  if(
1e060 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f   unlikely(typeRo
1e070 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77  wid<1 || typeRow
1e080 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69  id>9 || typeRowi
1e090 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74  d==7) ){.    got
1e0a0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1e0b0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65  uption;.  }.  le
1e0c0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  nRowid = sqlite3
1e0d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
1e0e0 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  n(typeRowid);.  
1e0f0 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
1e100 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
1e110 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
1e120 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
1e130 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
1e140 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1e150 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1e160 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
1e170 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
1e180 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1e190 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
1e1a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e1b0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
1e1c0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
1e1d0 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
1e1e0 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
1e1f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
1e200 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
1e210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e220 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
1e230 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
1e240 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
1e250 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
1e260 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
1e270 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
1e280 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
1e290 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e2a0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
1e2b0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
1e2c0 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c  estcase( m.zMall
1e2d0 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  oc!=0 );.  sqlit
1e2e0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1e2f0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1e300 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e310 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  PT;.}../*.** Com
1e320 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20  pare the key of 
1e330 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
1e340 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69  that cursor pC i
1e350 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67  s pointing to ag
1e360 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79  ainst.** the key
1e370 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61   string in pUnpa
1e380 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74  cked.  Write int
1e390 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72  o *pRes a number
1e3a0 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61  .** that is nega
1e3b0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1e3c0 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73  ositive if pC is
1e3d0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1e3e0 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61  l to,.** or grea
1e3f0 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b  ter than pUnpack
1e400 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ed.  Return SQLI
1e410 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e420 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65  ..**.** pUnpacke
1e430 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61  d is either crea
1e440 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f  ted without a ro
1e450 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61  wid or is trunca
1e460 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  ted so that it.*
1e470 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69  * omits the rowi
1e480 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
1e490 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
1e4a0 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
1e4b0 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e   entry.** is ign
1e4c0 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48  ored as well.  H
1e4d0 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69  ence, this routi
1e4e0 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73  ne only compares
1e4f0 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a   the prefixes .*
1e500 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72  * of the keys pr
1e510 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c  ior to the final
1e520 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20   rowid, not the 
1e530 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69  entire key..*/.i
1e540 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
1e550 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 56  xKeyCompare(.  V
1e560 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20  dbeCursor *pC,  
1e570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e580 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
1e590 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
1e5a0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1e5b0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c  cord *pUnpacked,
1e5c0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1e5d0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65  ed version of ke
1e5e0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20  y */.  int *res 
1e5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e600 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1e610 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
1e620 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29  result here */.)
1e630 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79  {.  i64 nCellKey
1e640 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
1e650 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1e660 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a   = pC->pCursor;.
1e670 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
1e680 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1e690 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
1e6a0 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
1e6b0 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
1e6c0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
1e6d0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
1e6e0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1e6f0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
1e700 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
1e710 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
1e720 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
1e730 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
1e740 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
1e750 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
1e760 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
1e770 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
1e780 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
1e790 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
1e7a0 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
1e7b0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
1e7c0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
1e7d0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
1e7e0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
1e7f0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
1e800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1e810 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1e820 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73   memset(&m, 0, s
1e830 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20  izeof(m));.  rc 
1e840 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1e850 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
1e860 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e  ursor, 0, (u32)n
1e870 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1e880 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1e890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1e8a0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
1e8b0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e8c0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
1e8d0 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c  acked, 0);.  sql
1e8e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
1e8f0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e  se(&m);.  return
1e900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e910 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e920 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65  e sets the value
1e930 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
1e940 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  by subsequent ca
1e950 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
1e960 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74  3_changes() on t
1e970 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
1e980 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69  le 'db'. .*/.voi
1e990 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
1e9a0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
1e9b0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65  *db, int nChange
1e9c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1e9d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e9e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1e9f0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43  db->nChange = nC
1ea00 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f  hange;.  db->nTo
1ea10 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68  talChange += nCh
1ea20 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ange;.}../*.** S
1ea30 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65  et a flag in the
1ea40 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20   vdbe to update 
1ea50 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
1ea60 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69  er when it is fi
1ea70 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65  nalised.** or re
1ea80 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1ea90 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61  ite3VdbeCountCha
1eaa0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20  nges(Vdbe *v){. 
1eab0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20   v->changeCntOn 
1eac0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  = 1;.}../*.** Ma
1ead0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65  rk every prepare
1eae0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f  d statement asso
1eaf0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
1eb00 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1eb10 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e  n.** as expired.
1eb20 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65  .**.** An expire
1eb30 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e  d statement mean
1eb40 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61  s that recompila
1eb50 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
1eb60 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f  ement is.** reco
1eb70 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e  mmend.  Statemen
1eb80 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74  ts expire when t
1eb90 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61  hings happen tha
1eba0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20  t make their.** 
1ebb0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74  programs obsolet
1ebc0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65  e.  Removing use
1ebd0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69  r-defined functi
1ebe0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67  ons or collating
1ebf0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f  .** sequences, o
1ec00 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75  r changing an au
1ec10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63  thorization func
1ec20 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70  tion are the typ
1ec30 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20  es of.** things 
1ec40 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72  that make prepar
1ec50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62  ed statements ob
1ec60 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20  solete..*/.void 
1ec70 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
1ec80 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
1ec90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
1eca0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70  Vdbe *p;.  for(p
1ecb0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b   = db->pVdbe; p;
1ecc0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ecd0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31    p->expired = 1
1ece0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1ecf0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61  eturn the databa
1ed00 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
1ed10 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a  th the Vdbe..*/.
1ed20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1ed30 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b  VdbeDb(Vdbe *v){
1ed40 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b  .  return v->db;
1ed50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ed60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
1ed70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73   sqlite3_value s
1ed80 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
1ed90 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f  ing the value bo
1eda0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  und.** parameter
1edb0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45   iVar of VM v. E
1edc0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61  xcept, if the va
1edd0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55  lue is an SQL NU
1ede0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30  LL, return .** 0
1edf0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73   instead. Unless
1ee00 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70   it is NULL, app
1ee10 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ly affinity aff 
1ee20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49  (one of the SQLI
1ee30 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73  TE_AFF_*.** cons
1ee40 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61  tants) to the va
1ee50 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
1ee60 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  ning it..**.** T
1ee70 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
1ee80 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  e must be freed 
1ee90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
1eea0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ing sqlite3Value
1eeb0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74  Free()..*/.sqlit
1eec0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65  e3_value *sqlite
1eed0 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c  3VdbeGetBoundVal
1eee0 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ue(Vdbe *v, int 
1eef0 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20  iVar, u8 aff){. 
1ef00 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1ef10 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1ef20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76    Mem *pMem = &v
1ef30 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a  ->aVar[iVar-1];.
1ef40 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d      if( 0==(pMem
1ef50 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
1ef60 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ll) ){.      sql
1ef70 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74  ite3_value *pRet
1ef80 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
1ef90 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20  ew(v->db);.     
1efa0 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20   if( pRet ){.   
1efb0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1efc0 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70  MemCopy((Mem *)p
1efd0 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  Ret, pMem);.    
1efe0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
1eff0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52  ApplyAffinity(pR
1f000 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f  et, aff, SQLITE_
1f010 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  UTF8);.      }. 
1f020 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74       return pRet
1f030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f040 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1f050 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76   Configure SQL v
1f060 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20  ariable iVar so 
1f070 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e  that binding a n
1f080 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73  ew value to it s
1f090 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c  ignals.** to sql
1f0a0 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28  ite3_reoptimize(
1f0b0 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72  ) that re-prepar
1f0c0 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ing the statemen
1f0d0 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20  t may result.** 
1f0e0 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72  in a better quer
1f0f0 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  y plan..*/.void 
1f100 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
1f110 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69  rmask(Vdbe *v, i
1f120 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65  nt iVar){.  asse
1f130 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
1f140 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20  if( iVar>32 ){. 
1f150 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20     v->expmask = 
1f160 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65  0xffffffff;.  }e
1f170 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  lse{.    v->expm
1f180 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c  ask |= ((u32)1 <
1f190 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d  < (iVar-1));.  }
1f1a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1f1b0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1f1c0 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73  ABLE./*.** Trans
1f1d0 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fer error messag
1f1e0 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73  e text from an s
1f1f0 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72  qlite3_vtab.zErr
1f200 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
1f210 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
1f220 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1f230 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f  te3_malloc) into
1f240 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20   a Vdbe.zErrMsg 
1f250 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20  (text stored.** 
1f260 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
1f270 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44  ed from sqlite3D
1f280 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69  bMalloc)..*/.voi
1f290 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70  d sqlite3VtabImp
1f2a0 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a  ortErrmsg(Vdbe *
1f2b0 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20  p, sqlite3_vtab 
1f2c0 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 74  *pVtab){.  sqlit
1f2d0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
1f2e0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1f2f0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
1f300 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
1f310 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1f320 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
1f330 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  sg);.  sqlite3_f
1f340 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ree(pVtab->zErrM
1f350 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45  sg);.  pVtab->zE
1f360 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e  rrMsg = 0;.}.#en
1f370 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f380 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1f390 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1f3a0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
1f3b0 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49  TE_HOOK../*.** I
1f3c0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1f3d0 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
1f3e0 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20 61  L, release any a
1f3f0 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63  llocations assoc
1f400 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 74  iated .** with t
1f410 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  he memory cells 
1f420 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b 5d  in the p->aMem[]
1f430 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72 65   array. Also fre
1f440 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52 65  e the UnpackedRe
1f450 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72  cord.** structur
1f460 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67 20  e itself, using 
1f470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
1f480 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
1f490 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
1f4a0 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65 63  free UnpackedRec
1f4b0 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20 61  ord structures a
1f4c0 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
1f4d0 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65 63  he vdbeUnpackRec
1f4e0 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ord() function f
1f4f0 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69 2e  ound in vdbeapi.
1f500 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  c..*/.static voi
1f510 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b  d vdbeFreeUnpack
1f520 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
1f530 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1f540 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
1f550 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1f560 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69 65  r(i=0; i<p->nFie
1f570 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; i++){.      
1f580 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e  Mem *pMem = &p->
1f590 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69  aMem[i];.      i
1f5a0 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63  f( pMem->zMalloc
1f5b0 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   ) sqlite3VdbeMe
1f5c0 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a  mRelease(pMem);.
1f5d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1f5e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
1f5f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
1f600 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61  oke the pre-upda
1f610 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73  te hook. If this
1f620 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72   is an UPDATE or
1f630 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61   DELETE pre-upda
1f640 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  te call,.** then
1f650 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
1f660 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1f670 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69  ument should poi
1f680 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62  nt to the row ab
1f690 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64  out.** to be upd
1f6a0 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ate or deleted. 
1f6b0 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  If the applicati
1f6c0 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33  on calls sqlite3
1f6d0 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29  _preupdate_old()
1f6e0 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65  ,.** the require
1f6f0 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20  d value will be 
1f700 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f  read from the ro
1f710 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69  w the cursor poi
1f720 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20  nts to..*/.void 
1f730 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70  sqlite3VdbePreUp
1f740 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65  dateHook(.  Vdbe
1f750 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20   *v,            
1f760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1f770 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68  dbe pre-update h
1f780 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ook is invoked b
1f790 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f  y */.  VdbeCurso
1f7a0 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20  r *pCsr,        
1f7b0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
1f7c0 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76   to grab old.* v
1f7d0 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20  alues from */.  
1f7e0 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1f7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f800 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  /* SQLITE_INSERT
1f810 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
1f820 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  TE */.  const ch
1f830 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
1f840 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
1f850 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61  ase name */.  Ta
1f860 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f880 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20   Modified table 
1f890 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20  */.  i64 iKey1, 
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
1f8c0 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  key value */.  i
1f8d0 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20  nt iReg         
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f8f0 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e  * Register for n
1f900 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29  ew.* record */.)
1f910 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1f920 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69  = v->db;.  i64 i
1f930 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74  Key2;.  PreUpdat
1f940 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63  e preupdate;.  c
1f950 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20  onst char *zTbl 
1f960 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
1f970 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
1f980 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d   fakeSortOrder =
1f990 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64   0;..  assert( d
1f9a0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30  b->pPreUpdate==0
1f9b0 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72   );.  memset(&pr
1f9c0 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65  eupdate, 0, size
1f9d0 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a  of(PreUpdate));.
1f9e0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1f9f0 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 69  _UPDATE ){.    i
1fa00 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69  Key2 = v->aMem[i
1fa10 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c 73  Reg].u.i;.  }els
1fa20 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 69  e{.    iKey2 = i
1fa30 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  Key1;.  }..  ass
1fa40 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65 6c  ert( pCsr->nFiel
1fa50 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a 20  d==pTab->nCol . 
1fa60 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d 3e        || (pCsr->
1fa70 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43  nField==pTab->nC
1fa80 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c 49  ol+1 && op==SQLI
1fa90 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52 65  TE_DELETE && iRe
1faa0 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20 70  g==-1).  );..  p
1fab0 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b 0a  reupdate.v = v;.
1fac0 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73 72    preupdate.pCsr
1fad0 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75 70   = pCsr;.  preup
1fae0 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20 20  date.op = op;.  
1faf0 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52 65  preupdate.iNewRe
1fb00 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65 75  g = iReg;.  preu
1fb10 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64 62  pdate.keyinfo.db
1fb20 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64 61   = db;.  preupda
1fb30 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20 3d  te.keyinfo.enc =
1fb40 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65 75   ENC(db);.  preu
1fb50 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e 46  pdate.keyinfo.nF
1fb60 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  ield = pTab->nCo
1fb70 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  l;.  preupdate.k
1fb80 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65  eyinfo.aSortOrde
1fb90 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53 6f  r = (u8*)&fakeSo
1fba0 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75 70  rtOrder;.  preup
1fbb0 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65  date.iKey1 = iKe
1fbc0 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  y1;.  preupdate.
1fbd0 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20  iKey2 = iKey2;. 
1fbe0 20 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65 79   preupdate.iPKey
1fbf0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1fc00 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
1fc10 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a  e = &preupdate;.
1fc20 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65    db->xPreUpdate
1fc30 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72  Callback(db->pPr
1fc40 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20  eUpdateArg, db, 
1fc50 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69  op, zDb, zTbl, i
1fc60 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20  Key1, iKey2);.  
1fc70 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d  db->pPreUpdate =
1fc80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
1fc90 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74  ree(db, preupdat
1fca0 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76 64  e.aRecord);.  vd
1fcb0 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64  beFreeUnpacked(d
1fcc0 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e  b, preupdate.pUn
1fcd0 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65 46  packed);.  vdbeF
1fce0 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c 20  reeUnpacked(db, 
1fcf0 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55 6e  preupdate.pNewUn
1fd00 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20 70  packed);.  if( p
1fd10 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b  reupdate.aNew ){
1fd20 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1fd30 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d  for(i=0; i<pCsr-
1fd40 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20  >nField; i++){. 
1fd50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1fd60 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75  MemRelease(&preu
1fd70 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a  pdate.aNew[i]);.
1fd80 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1fd90 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75  3DbFree(db, preu
1fda0 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d  pdate.aNew);.  }
1fdb0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1fdc0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
1fdd0 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a           DATE_HOOK */.