/ Hex Artifact Content
Login

Artifact c034933f1d417e333d07b63e5a4623cbaeccb361:


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 6f 6e  t is at least on
08e0: 65 20 6f 70 20 6c 61 72 67 65 72 20 74 68 61 6e  e op larger than
08f0: 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a 2a 2a 0a   .** it was..**.
0900: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0910: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0920: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0930: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0940: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0950: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0960: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0970: 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72 65  Vdbe.nOpAlloc re
0980: 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  main .** unchang
0990: 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20 74  ed (this is so t
09a0: 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73 20  hat any opcodes 
09b0: 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74 65  already allocate
09c0: 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f 72  d can be .** cor
09d0: 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61 74  rectly deallocat
09e0: 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
09f0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56 64  e rest of the Vd
0a00: 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be)..*/.static i
0a10: 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28 56  nt growOpArray(V
0a20: 64 62 65 20 2a 76 29 7b 0a 20 20 56 64 62 65 4f  dbe *v){.  VdbeO
0a30: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a40: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a50: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0a60: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e  ->nOpAlloc ? p->
0a70: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e  nOpAlloc*2 : (in
0a80: 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f  t)(1024/sizeof(O
0a90: 70 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  p)));.  pNew = s
0aa0: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
0ab0: 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e  p->db, v->aOp, n
0ac0: 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b  New*sizeof(Op));
0ad0: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
0ae0: 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d     p->nOpAlloc =
0af0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
0b00: 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77  Size(p->db, pNew
0b10: 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20  )/sizeof(Op);.  
0b20: 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b    v->aOp = pNew;
0b30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70  .  }.  return (p
0b40: 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  New ? SQLITE_OK 
0b50: 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  : SQLITE_NOMEM);
0b60: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0b70: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
0b80: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
0b90: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
0ba0: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
0bb0: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
0bc0: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
0bd0: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
0be0: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
0bf0: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
0c00: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
0c10: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
0c20: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
0c30: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
0c40: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
0c50: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
0c60: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
0c70: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0c80: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0c90: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0ca0: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0cb0: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0cc0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
0cd0: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
0ce0: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
0cf0: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
0d00: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
0d10: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
0d20: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
0d30: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
0d40: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
0d50: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
0d60: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
0d70: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
0d80: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
0d90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
0da0: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
0db0: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
0dc0: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
0dd0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
0de0: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
0df0: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
0e00: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
0e10: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  operand..*/.int 
0e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
0e30: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
0e40: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
0e50: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
0e60: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
0e70: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
0e80: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
0e90: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
0ea0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
0eb0: 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30  rt( op>0 && op<0
0ec0: 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  xff );.  if( p->
0ed0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
0ee0: 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67  <=i ){.    if( g
0ef0: 72 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b  rowOpArray(p) ){
0f00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
0f10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
0f20: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
0f30: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
0f40: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
0f50: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
0f60: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
0f70: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
0f80: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
0f90: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
0fa0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
0fb0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
0fc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
0fd0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
0fe0: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
0ff0: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
1000: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1010: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
1020: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1030: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1040: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
1050: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1060: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1070: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
1080: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
1090: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
10a0: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
10b0: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
10c0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
10d0: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
10e0: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
10f0: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
1100: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
1110: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
1120: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1130: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1140: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1150: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1170: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
1180: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1190: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
11a0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
11b0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
11c0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
11d0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
11e0: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
11f0: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1200: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1210: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1220: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1230: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
1240: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
1250: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1260: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1270: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
1280: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1290: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
12a0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
12b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
12c0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
12d0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
12e0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
12f0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1300: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1310: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1320: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1330: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1340: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1350: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1360: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1370: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
1380: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
1390: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
13a0: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
13b0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
13c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
13d0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
13e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
13f0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1400: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1420: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1430: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1440: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1450: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1460: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1470: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
1480: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
1490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14a0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
14b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14c0: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
14d0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
14e0: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
14f0: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1500: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1510: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1520: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1530: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1540: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1550: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1560: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1570: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
1580: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
1590: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
15a0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
15b0: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
15c0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
15d0: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
15e0: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
15f0: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
1600: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
1610: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
1620: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
1630: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
1640: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1650: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1660: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
1670: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
1680: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
1690: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
16a0: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
16b0: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
16c0: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
16d0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
16e0: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
16f0: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
1700: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1710: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
1720: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
1730: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1740: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1750: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
1760: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
1770: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
1780: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
1790: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
17a0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
17b0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
17c0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
17d0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
17e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
17f0: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1800: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1810: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1820: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1830: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1850: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1860: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1870: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1880: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1890: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
18a0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
18b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
18c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
18d0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
18e0: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
18f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1900: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1910: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1920: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1930: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1940: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1950: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1960: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
1970: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1980: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1990: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
19a0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
19b0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
19c0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
19d0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
19e0: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
19f0: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1a00: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1a10: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1a20: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1a30: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1a40: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
1a50: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
1a60: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
1a70: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
1a80: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1a90: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1aa0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1ab0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1ac0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1ad0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1ae0: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1af0: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1b00: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1b10: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1b20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1b30: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1b40: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1b50: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
1b60: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
1b70: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
1b80: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1b90: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1ba0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1bb0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1bc0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1bd0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1be0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1bf0: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1c00: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1c10: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1c20: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1c30: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
1c40: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
1c50: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
1c60: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1c70: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1c80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1c90: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
1ca0: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
1cb0: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1cc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1cd0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
1ce0: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
1d10: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
1d20: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
1d30: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
1d40: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
1d50: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
1d60: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
1d70: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
1d80: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
1d90: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
1da0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1db0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
1dc0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
1dd0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
1de0: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
1df0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
1e00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
1e10: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
1e20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1e30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1e40: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
1e50: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
1e60: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
1e70: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
1e80: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
1e90: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1ea0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e    assert( j<p->n
1eb0: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41  Label );.  if( A
1ec0: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70  LWAYS(j>=0) && p
1ed0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
1ee0: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
1ef0: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
1f00: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
1f10: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
1f20: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
1f30: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
1f40: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
1f50: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
1f60: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
1f70: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
1f80: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
1f90: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
1fa0: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
1fb0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1fc0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
1fd0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1fe0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
1ff0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2000: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2010: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2020: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2030: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
2040: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
2050: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2060: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2070: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
2080: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
2090: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
20a0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
20b0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
20c0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
20d0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
20e0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
20f0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
2100: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
2130: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
2140: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2150: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2160: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2170: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
2180: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
2190: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21a0: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
21b0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
21c0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
21d0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
21e0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
21f0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
2200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2210: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
2220: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2230: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
2240: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
2250: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2260: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2270: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
2280: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
2290: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22a0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
22b0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
22c0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
22d0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
22e0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
22f0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
2300: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2320: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
2330: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
2340: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
2350: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2360: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2370: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2380: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2390: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
23a0: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
23b0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
23c0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
23d0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
23e0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
23f0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2400: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
2410: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
2420: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
2430: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
2440: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
2450: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
2460: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2470: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
2480: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
2490: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
24a0: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
24b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
24c0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
24d0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
24e0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
24f0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
2500: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
2510: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
2520: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2530: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
2540: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
2550: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2560: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2570: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
2580: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
2590: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
25a0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
25b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
25c0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
25d0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
25e0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
25f0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
2600: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
2610: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
2620: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
2630: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
2640: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2650: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
2660: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2670: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
2680: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
2690: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26a0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
26b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
26c0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
26d0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
26e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
26f0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
2700: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
2710: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
2720: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
2730: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
2740: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
2750: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
2760: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2770: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2780: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2790: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
27a0: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
27b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
27c0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
27d0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
27e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
27f0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2800: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
2810: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
2820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2830: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2840: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
2850: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
2860: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2870: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2880: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2890: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
28a0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
28b0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
28c0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
28d0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
28e0: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
28f0: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2900: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
2910: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
2920: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
2930: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
2940: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
2950: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
2960: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2970: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2980: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2990: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
29a0: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
29b0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
29c0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
29d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
29e0: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
29f0: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2a00: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
2a10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2a20: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2a30: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
2a40: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
2a50: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70  sAbort = 0;.  Op
2a60: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
2a70: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
2a80: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2a90: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
2aa0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
2ab0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2ac0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2ad0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
2ae0: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2af0: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
2b00: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
2b10: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
2b20: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
2b30: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23  e==OP_VRename .#
2b40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b50: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
2b60: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d      || (opcode==
2b70: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
2b80: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
2b90: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69  p->p2==1) .#endi
2ba0: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  f.     || ((opco
2bb0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
2bc0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
2bd0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
2be0: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
2bf0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2c00: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
2c10: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
2c20: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
2c30: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2c50: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
2c60: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
2c70: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
2c80: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
2c90: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
2ca0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
2cb0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
2cc0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
2cd0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
2ce0: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
2cf0: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
2d00: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
2d10: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
2d20: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
2d30: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
2d40: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
2d50: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
2d60: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
2d70: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
2d80: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
2d90: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
2da0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
2db0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
2dc0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
2dd0: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
2de0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2df0: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
2e00: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2e10: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
2e20: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
2e30: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
2e40: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
2e50: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
2e60: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
2e70: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
2e80: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
2e90: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
2ea0: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
2eb0: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
2ec0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
2ed0: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
2ee0: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
2ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f00: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
2f10: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
2f20: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
2f30: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
2f40: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
2f50: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
2f60: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
2f70: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
2f80: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
2f90: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
2fa0: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
2fb0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
2fc0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
2fd0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
2fe0: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
2ff0: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
3000: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f  ..**.** The Op.o
3010: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20  pflags field is 
3020: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64  set on all opcod
3030: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3040: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
3050: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
3060: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
3070: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
3080: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
3090: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
30a0: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
30b0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
30c0: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
30d0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
30e0: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
30f0: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
3100: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
3110: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
3120: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
3130: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
3140: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3150: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
3160: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
3170: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
3180: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
3190: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
31a0: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
31b0: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
31c0: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
31d0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
31e0: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20  P_Function:.    
31f0: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65    case OP_AggSte
3200: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  p: {.        if(
3210: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67   pOp->p5>nMaxArg
3220: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
3230: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20  Op->p5;.        
3240: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3250: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
3260: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
3270: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
3280: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
3290: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
32a0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
32b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
32c0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
32d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
32e0: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
32f0: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3300: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3310: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3320: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3330: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
3340: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
3350: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
3360: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
3370: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
3380: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
3390: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
33a0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
33b0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
33c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
33e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
33f0: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
3400: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
3410: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
3420: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
3430: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
3440: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3450: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3460: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
3470: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
3480: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
3490: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
34a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
34b0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
34c0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
34d0: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
34e0: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
34f0: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
3500: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
3510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3520: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3530: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
3540: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
3550: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
3560: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
3570: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  xt: {.        pO
3580: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
3590: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
35a0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t;.        pOp->
35b0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
35c0: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
35d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
35e0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
35f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3600: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
3610: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3620: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3630: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
3640: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3650: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3660: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3670: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
3680: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
3690: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
36a0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
36b0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
36c0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
36d0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
36e0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
36f0: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
3700: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
3710: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3720: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3730: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3740: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3750: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
3760: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
3770: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
3780: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
3790: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
37a0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
37b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
37c0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
37d0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
37e0: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
37f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3800: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3810: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3820: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3830: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3840: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3850: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3860: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3870: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3880: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3890: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
38a0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
38b0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
38c0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
38d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
38e0: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
38f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3900: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
3910: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
3920: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3930: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3940: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3950: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3960: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3970: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3980: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3990: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
39a0: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
39b0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
39c0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
39d0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
39e0: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
39f0: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3a00: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
3a10: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
3a20: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3a30: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3a40: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3a50: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3a60: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3a70: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3a80: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3a90: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3aa0: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3ab0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3ac0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3ad0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3ae0: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3af0: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3b00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3b10: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3b20: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3b30: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3b40: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3b50: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
3b60: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
3b70: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
3b80: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3b90: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3ba0: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3bb0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3bc0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3bd0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3be0: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3bf0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
3c00: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
3c10: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
3c20: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
3c30: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
3c40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3c50: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3c60: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3c70: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3c80: 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65   *aOp, int iLine
3c90: 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  no){.  int addr;
3ca0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3cb0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3cc0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3cd0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
3ce0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
3cf0: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
3d00: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
3d10: 20 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d   0;.  }.  addr =
3d20: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41   p->nOp;.  if( A
3d30: 4c 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a  LWAYS(nOp>0) ){.
3d40: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56      int i;.    V
3d50: 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20  dbeOpList const 
3d60: 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20  *pIn = aOp;.    
3d70: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20  for(i=0; i<nOp; 
3d80: 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20  i++, pIn++){.   
3d90: 20 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d     int p2 = pIn-
3da0: 3e 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  >p2;.      VdbeO
3db0: 70 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f  p *pOut = &p->aO
3dc0: 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20  p[i+addr];.     
3dd0: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
3de0: 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  pIn->opcode;.   
3df0: 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49     pOut->p1 = pI
3e00: 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28  n->p1;.      if(
3e10: 20 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20   p2<0 ){.       
3e20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3e30: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70  OpcodeProperty[p
3e40: 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  Out->opcode] & O
3e50: 50 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20  PFLG_JUMP );.   
3e60: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
3e70: 61 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b  addr + ADDR(p2);
3e80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3e90: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d        pOut->p2 =
3ea0: 20 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   p2;.      }.   
3eb0: 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49     pOut->p3 = pI
3ec0: 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75  n->p3;.      pOu
3ed0: 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e  t->p4type = P4_N
3ee0: 4f 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f  OTUSED;.      pO
3ef0: 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  ut->p4.p = 0;.  
3f00: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30      pOut->p5 = 0
3f10: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
3f20: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
3f30: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f  OMMENTS.      pO
3f40: 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  ut->zComment = 0
3f50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
3f60: 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45  SQLITE_VDBE_COVE
3f70: 52 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d  RAGE.      pOut-
3f80: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
3f90: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
3fa0: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
3fb0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
3fc0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
3fd0: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
3fe0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
3ff0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
4000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
4010: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61  bePrintOp(0, i+a
4020: 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61  ddr, &p->aOp[i+a
4030: 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23  ddr]);.      }.#
4040: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
4050: 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20  p->nOp += nOp;. 
4060: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72   }.  return addr
4070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
4080: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
4090: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 6f  he P1 operand fo
40a0: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
40b0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
40c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
40d0: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
40e0: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
40f0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
4100: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
4110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4120: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
4130: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
4140: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
4150: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
4160: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
4170: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
4180: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
4190: 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72  nt val){.  asser
41a0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28  t( p!=0 );.  if(
41b0: 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61   ((u32)p->nOp)>a
41c0: 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f  ddr ){.    p->aO
41d0: 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c  p[addr].p1 = val
41e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
41f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
4200: 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e  of the P2 operan
4210: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63  d for a specific
4220: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
4230: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4240: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74   useful for sett
4250: 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69  ing a jump desti
4260: 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nation..*/.void 
4270: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4280: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP2(Vdbe *p, u32
4290: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
42a0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
42b0: 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70  );.  if( ((u32)p
42c0: 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20  ->nOp)>addr ){. 
42d0: 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e     p->aOp[addr].
42e0: 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p2 = val;.  }.}.
42f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4300: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
4310: 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  3 operand for a 
4320: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
4330: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
4340: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
4350: 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  3(Vdbe *p, u32 a
4360: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
4370: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
4380: 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e  .  if( ((u32)p->
4390: 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20  nOp)>addr ){.   
43a0: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 33   p->aOp[addr].p3
43b0: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = val;.  }.}../
43c0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
43d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35 20  value of the P5 
43e0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65 20  operand for the 
43f0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a 2a  most recently.**
4400: 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f 6e   added operation
4410: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4420: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
4430: 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b 0a  be *p, u8 val){.
4440: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4450: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20 29  ;.  if( p->aOp )
4460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
4470: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70 2d  >nOp>0 );.    p-
4480: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
4490: 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  5 = val;.  }.}..
44a0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
44b0: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69   P2 operand of i
44c0: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20  nstruction addr 
44d0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
44e0: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72  s to.** the addr
44f0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
4500: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  instruction to b
4510: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64  e coded..*/.void
4520: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
4530: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  Here(Vdbe *p, in
4540: 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74  t addr){.  sqlit
4550: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
4560: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
4570: 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  .  p->pParse->iF
4580: 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20  ixedOp = p->nOp 
4590: 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  - 1;.}.../*.** I
45a0: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63  f the input Func
45b0: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73  Def structure is
45c0: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e   ephemeral, then
45d0: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a   free it.  If.**
45e0: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20   the FuncDef is 
45f0: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68  not ephermal, th
4600: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
4610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
4620: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4630: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ion(sqlite3 *db,
4640: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b   FuncDef *pDef){
4650: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44  .  if( ALWAYS(pD
4660: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75  ef) && (pDef->fu
4670: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
4680: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20  _FUNC_EPHEM)!=0 
4690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
46a0: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a  Free(db, pDef);.
46b0: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
46c0: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  id vdbeFreeOpArr
46d0: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70  ay(sqlite3 *, Op
46e0: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a   *, int);../*.**
46f0: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c   Delete a P4 val
4700: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ue if necessary.
4710: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4720: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a  freeP4(sqlite3 *
4730: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20  db, int p4type, 
4740: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28  void *p4){.  if(
4750: 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72   p4 ){.    asser
4760: 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69  t( db );.    swi
4770: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20  tch( p4type ){. 
4780: 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41       case P4_REA
4790: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  L:.      case P4
47a0: 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 61  _INT64:.      ca
47b0: 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20  se P4_DYNAMIC:. 
47c0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54       case P4_INT
47d0: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 20  ARRAY: {.       
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20  b, p4);.        
4800: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4810: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59       case P4_KEY
4820: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20  INFO: {.        
4830: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4840: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
4850: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b  3KeyInfoUnref((K
4860: 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20  eyInfo*)p4);.   
4870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4880: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4890: 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20  4_MPRINTF: {.   
48a0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
48b0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
48c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 3b  qlite3_free(p4);
48d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
48e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
48f0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b  se P4_FUNCDEF: {
4900: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
4910: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
4920: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
4930: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4950: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
4960: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4970: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b  BytesFreed==0 ){
4980: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4990: 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 6c  e3ValueFree((sql
49a0: 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b  ite3_value*)p4);
49b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
49c0: 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a 70            Mem *p
49d0: 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20   = (Mem*)p4;.   
49e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
49f0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
4a00: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  loc);.          
4a10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4a20: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
4a30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4a40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
4a50: 65 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20  e P4_VTAB : {.  
4a60: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4a70: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4a80: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4a90: 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b  k((VTable *)p4);
4aa0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4ac0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
4ad0: 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
4ae0: 74 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20  ted for aOp and 
4af0: 61 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c  any p4 values al
4b00: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a  located for the.
4b10: 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61  ** opcodes conta
4b20: 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20  ined within. If 
4b30: 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  aOp is not NULL 
4b40: 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  it is assumed to
4b50: 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70   contain .** nOp
4b60: 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74   entries. .*/.st
4b70: 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
4b80: 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65  eeOpArray(sqlite
4b90: 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20  3 *db, Op *aOp, 
4ba0: 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20  int nOp){.  if( 
4bb0: 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70  aOp ){.    Op *p
4bc0: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d  Op;.    for(pOp=
4bd0: 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f  aOp; pOp<&aOp[nO
4be0: 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  p]; pOp++){.    
4bf0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
4c00: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
4c10: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  4.p);.#ifdef SQL
4c20: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
4c30: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
4c40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4c50: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  db, pOp->zCommen
4c60: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a  t);.#endif     .
4c70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4c80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f  te3DbFree(db, aO
4c90: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e  p);.}../*.** Lin
4ca0: 6b 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d  k the SubProgram
4cb0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
4cc0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
4cd0: 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c  ument into the l
4ce0: 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74  inked.** list at
4cf0: 20 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61   Vdbe.pSubProgra
4d00: 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20  m. This list is 
4d10: 75 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61  used to delete a
4d20: 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a  ll sub-program.*
4d30: 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74  * objects when t
4d40: 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67  he VM is no long
4d50: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  er required..*/.
4d60: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4d70: 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56  LinkSubProgram(V
4d80: 64 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50  dbe *pVdbe, SubP
4d90: 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d  rogram *p){.  p-
4da0: 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e  >pNext = pVdbe->
4db0: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62  pProgram;.  pVdb
4dc0: 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b  e->pProgram = p;
4dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4de0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61   the opcode at a
4df0: 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70  ddr into OP_Noop
4e00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4e10: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
4e20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
4e30: 64 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4f  dr){.  if( p->aO
4e40: 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f 70 20  p ){.    VdbeOp 
4e50: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61  *pOp = &p->aOp[a
4e60: 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  ddr];.    sqlite
4e70: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
4e80: 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f     freeP4(db, pO
4e90: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
4ea0: 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d 73 65  p4.p);.    memse
4eb0: 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pOp, 0, sizeof
4ec0: 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 70  (pOp[0]));.    p
4ed0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
4ee0: 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 64  Noop;.    if( ad
4ef0: 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29 20 70  dr==p->nOp-1 ) p
4f00: 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a  ->nOp--;.  }.}..
4f10: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
4f20: 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 6e 73   last opcode ins
4f30: 65 72 74 65 64 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erted.*/.int sql
4f40: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
4f50: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
4f60: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
4f70: 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e   (p->nOp-1)>(p->
4f80: 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70  pParse->iFixedOp
4f90: 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  ) && p->aOp[p->n
4fa0: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
4fb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
4fc0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
4fd0: 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 20  p, p->nOp-1);.  
4fe0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65    return 1;.  }e
4ff0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
5000: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
5010: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
5020: 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 72 61   of the P4 opera
5030: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
5040: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
5050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5060: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
5070: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
5080: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
5090: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
50a0: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
50b0: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
50c0: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
50d0: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
50e0: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
50f0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e  ram..**.** If n>
5100: 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 20 6f  =0 then the P4 o
5110: 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 6d 69  perand is dynami
5120: 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  c, meaning that 
5130: 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 68 65  a copy of.** the
5140: 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 65 20   string is made 
5150: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
5160: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
5170: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41  3_malloc()..** A
5180: 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 20 6d   value of n==0 m
5190: 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 73 20  eans copy bytes 
51a0: 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 6e 64  of zP4 up to and
51b0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 0a 2a   including the.*
51c0: 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 79 74  * first null byt
51d0: 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 6e 20  e.  If n>0 then 
51e0: 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 20 6f  copy n+1 bytes o
51f0: 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74  f zP4..** .** Ot
5200: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20  her values of n 
5210: 28 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43  (P4_STATIC, P4_C
5220: 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64  OLLSEQ etc.) ind
5230: 69 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70  icate that zP4 p
5240: 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74  oints.** to a st
5250: 72 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72  ring or structur
5260: 65 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e  e that is guaran
5270: 74 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f  teed to exist fo
5280: 72 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f  r the lifetime o
5290: 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49  f.** the Vdbe. I
52a0: 6e 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65  n these cases we
52b0: 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74   can just copy t
52c0: 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  he pointer..**.*
52d0: 2a 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e  * If addr<0 then
52e0: 20 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68   change P4 on th
52f0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
5300: 69 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63  inserted instruc
5310: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5320: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5330: 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61  4(Vdbe *p, int a
5340: 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ddr, const char 
5350: 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  *zP4, int n){.  
5360: 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74  Op *pOp;.  sqlit
5370: 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74  e3 *db;.  assert
5380: 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  ( p!=0 );.  db =
5390: 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
53a0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
53b0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
53c0: 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c   if( p->aOp==0 |
53d0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
53e0: 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21  ed ){.    if( n!
53f0: 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  =P4_VTAB ){.    
5400: 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20    freeP4(db, n, 
5410: 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29  (void*)*(char**)
5420: 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &zP4);.    }.   
5430: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
5440: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
5450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  );.  assert( add
5460: 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66  r<p->nOp );.  if
5470: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
5480: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
5490: 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26  1;.  }.  pOp = &
54a0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
54b0: 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74  assert( pOp->p4t
54c0: 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 0a  ype==P4_NOTUSED.
54d0: 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
54e0: 34 74 79 70 65 3d 3d 50 34 5f 49 4e 54 33 32 0a  4type==P4_INT32.
54f0: 20 20 20 20 20 20 20 7c 7c 20 70 4f 70 2d 3e 70         || pOp->p
5500: 34 74 79 70 65 3d 3d 50 34 5f 4b 45 59 49 4e 46  4type==P4_KEYINF
5510: 4f 20 29 3b 0a 20 20 66 72 65 65 50 34 28 64 62  O );.  freeP4(db
5520: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5530: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
5540: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66  ->p4.p = 0;.  if
5550: 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b  ( n==P4_INT32 ){
5560: 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68  .    /* Note: th
5570: 69 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c  is cast is safe,
5580: 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69   because the ori
5590: 67 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77  gin data point w
55a0: 61 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a  as an int.    **
55b0: 20 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74   that was cast t
55c0: 6f 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20  o a (const char 
55d0: 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e  *). */.    pOp->
55e0: 70 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54  p4.i = SQLITE_PT
55f0: 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20  R_TO_INT(zP4);. 
5600: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5610: 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c   P4_INT32;.  }el
5620: 73 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b  se if( zP4==0 ){
5630: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
5640: 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74   0;.    pOp->p4t
5650: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
5660: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d  ;.  }else if( n=
5670: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20  =P4_KEYINFO ){. 
5680: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28     pOp->p4.p = (
5690: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70  void*)zP4;.    p
56a0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
56b0: 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65  KEYINFO;.  }else
56c0: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20   if( n==P4_VTAB 
56d0: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
56e0: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
56f0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5700: 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 71   P4_VTAB;.    sq
5710: 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 56  lite3VtabLock((V
5720: 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20  Table *)zP4);.  
5730: 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 62    assert( ((VTab
5740: 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70  le *)zP4)->db==p
5750: 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20  ->db );.  }else 
5760: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70  if( n<0 ){.    p
5770: 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64  Op->p4.p = (void
5780: 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e  *)zP4;.    pOp->
5790: 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 64  p4type = (signed
57a0: 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65   char)n;.  }else
57b0: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
57c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
57d0: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
57e0: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
57f0: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
5800: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
5810: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
5820: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
5830: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
5840: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
5850: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
5860: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
5870: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
5880: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
5890: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
58a0: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
58b0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
58c0: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
58d0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
58e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
58f0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
5900: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Idx!=0 );.  sqli
5910: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5920: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71  v, -1, (char*)sq
5930: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
5940: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78  dex(pParse, pIdx
5950: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
5960: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
5970: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
5980: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
5990: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
59a0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
59b0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
59c0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
59d0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
59e0: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
59f0: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
5a00: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
5a10: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
5a20: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
5a30: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
5a40: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
5a50: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
5a60: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
5a70: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
5a80: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
5a90: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
5aa0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5ab0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5ac0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
5ad0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
5ae0: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
5af0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5b00: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
5b10: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5b20: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
5b30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5b40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
5b50: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
5b60: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
5b70: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
5b80: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
5b90: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
5ba0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
5bb0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
5bc0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
5bd0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
5be0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
5bf0: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
5c00: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5c10: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5c20: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
5c30: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
5c40: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
5c50: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
5c60: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
5c70: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
5c80: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
5c90: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5ca0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
5cb0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
5cc0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
5cd0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
5ce0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
5cf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
5d00: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
5d10: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
5d20: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
5d30: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
5d40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
5d50: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
5d60: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
5d70: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
5d80: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
5d90: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
5da0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
5db0: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
5dc0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
5dd0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
5de0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
5df0: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
5e00: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
5e10: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
5e20: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
5e30: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
5e40: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
5e50: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
5e60: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
5e70: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
5e80: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
5e90: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
5ea0: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
5eb0: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
5ec0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
5ed0: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
5ee0: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
5ef0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
5f00: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
5f10: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
5f20: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
5f30: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
5f40: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
5f50: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
5f60: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
5f70: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
5f80: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
5f90: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
5fa0: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
5fb0: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
5fc0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
5fd0: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
5fe0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
5ff0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
6000: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
6010: 72 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 77 69  r a OOM fault wi
6020: 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
6030: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
6040: 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 20  the return from 
6050: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
6060: 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 6e   is a valid poin
6070: 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 73  ter.  But becaus
6080: 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 6f  e the dummy.opco
6090: 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d  de is 0,.** dumm
60a0: 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  y will never be 
60b0: 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 69  written to.  Thi
60c0: 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 79  s is verified by
60d0: 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f 6e   code inspection
60e0: 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e 69   and.** by runni
60f0: 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e 64  ng with Valgrind
6100: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
6110: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 64  ite3VdbeGetOp(Vd
6120: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
6130: 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 69  {.  /* C89 speci
6140: 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  fies that the co
6150: 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 77  nstant "dummy" w
6160: 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
6170: 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a  ed to all.  ** z
6180: 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 63  eros, which is c
6190: 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 65  orrect.  MSVC ge
61a0: 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 6e  nerates a warnin
61b0: 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 2e  g, nevertheless.
61c0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 62   */.  static Vdb
61d0: 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49  eOp dummy;  /* I
61e0: 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 77  gnore the MSVC w
61f0: 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20  arning about no 
6200: 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20  initializer */. 
6210: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6220: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6230: 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  IT );.  if( addr
6240: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
6250: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
6260: 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 72  .  assert( (addr
6270: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
6280: 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  Op) || p->db->ma
6290: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
62a0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
62b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
62c0: 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 26  eturn (VdbeOp*)&
62d0: 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dummy;.  }else{.
62e0: 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e 61      return &p->a
62f0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a  Op[addr];.  }.}.
6300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6310: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
6320: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a  IN_COMMENTS)./*.
6330: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
6340: 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 6f  eger value for o
6350: 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65  ne of the parame
6360: 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 6f  ters to the opco
6370: 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 6d  de pOp.** determ
6380: 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 65  ined by characte
6390: 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  r c..*/.static i
63a0: 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 68  nt translateP(ch
63b0: 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 2a  ar c, const Op *
63c0: 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d 27  pOp){.  if( c=='
63d0: 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  1' ) return pOp-
63e0: 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 32  >p1;.  if( c=='2
63f0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
6400: 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 27  p2;.  if( c=='3'
6410: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
6420: 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 20  3;.  if( c=='4' 
6430: 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 34  ) return pOp->p4
6440: 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 70  .i;.  return pOp
6450: 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->p5;.}../*.** C
6460: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20  ompute a string 
6470: 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e 74  for the "comment
6480: 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 42  " field of a VDB
6490: 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e 67  E opcode listing
64a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e 6f  ..**.** The Syno
64b0: 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 63  psis: field in c
64c0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 76  omments in the v
64d0: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 6c  dbe.c source fil
64e0: 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 64  e gets converted
64f0: 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 20  .** to an extra 
6500: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 61  string that is a
6510: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 73  ppended to the s
6520: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
6530: 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 61  ().  In the.** a
6540: 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 20  bsence of other 
6550: 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 73  comments, this s
6560: 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 20  ynopsis becomes 
6570: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
6580: 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f  he opcode..** So
6590: 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6f  me translation o
65a0: 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ccurs:.**.**    
65b0: 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e 20     "PX"      -> 
65c0: 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 20   "r[X]".**      
65d0: 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 22   "PX@PY"   ->  "
65e0: 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f 72  r[X..X+Y-1]"  or
65f0: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
6600: 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 20  0 or 1.**       
6610: 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 72  "PX@PY+1" ->  "r
6620: 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 20  [X..X+Y]"    or 
6630: 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 30  "r[x]" if y is 0
6640: 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 50  .**       "PY..P
6650: 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d  Y"  ->  "r[X..Y]
6660: 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  "      or "r[x]"
6670: 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74   if y<=x.*/.stat
6680: 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 6f  ic int displayCo
6690: 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 4f  mment(.  const O
66a0: 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 54  p *pOp,     /* T
66b0: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 20  he opcode to be 
66c0: 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 63  commented */.  c
66d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
66e0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 20    /* Previously 
66f0: 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 66  obtained value f
6700: 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 20  or P4 */.  char 
6710: 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f 2a  *zTemp,       /*
6720: 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 65   Write result he
6730: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 6d  re */.  int nTem
6740: 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70  p          /* Sp
6750: 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e  ace available in
6760: 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20   zTemp[] */.){. 
6770: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
6780: 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Name;.  const ch
6790: 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a 20  ar *zSynopsis;. 
67a0: 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20   int nOpName;.  
67b0: 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f  int ii, jj;.  zO
67c0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  pName = sqlite3O
67d0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
67e0: 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d  pcode);.  nOpNam
67f0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
6800: 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20  n30(zOpName);.  
6810: 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e  if( zOpName[nOpN
6820: 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e  ame+1] ){.    in
6830: 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20  t seenCom = 0;. 
6840: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 7a     char c;.    z
6850: 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61  Synopsis = zOpNa
6860: 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20  me += nOpName + 
6870: 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 6a  1;.    for(ii=jj
6880: 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26  =0; jj<nTemp-1 &
6890: 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73  & (c = zSynopsis
68a0: 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 7b  [ii])!=0; ii++){
68b0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 50  .      if( c=='P
68c0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
68d0: 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d   zSynopsis[++ii]
68e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  ;.        if( c=
68f0: 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='4' ){.        
6900: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
6910: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
6920: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 34  mp+jj, "%s", zP4
6930: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
6940: 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a 20   if( c=='X' ){. 
6950: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6960: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
6970: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
6980: 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e  s", pOp->zCommen
6990: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 65  t);.          se
69a0: 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 20  enCom = 1;.     
69b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
69c0: 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 61      int v1 = tra
69d0: 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 3b  nslateP(c, pOp);
69e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
69f0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  2;.          sql
6a00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6a10: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6a20: 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 20  , "%d", v1);.   
6a30: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
6a40: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
6a50: 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 29  1, "@P", 2)==0 )
6a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
6a70: 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20   += 3;.         
6a80: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
6a90: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
6aa0: 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j);.            
6ab0: 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28  v2 = translateP(
6ac0: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 70  zSynopsis[ii], p
6ad0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Op);.           
6ae0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
6af0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 22  nopsis+ii+1,"+1"
6b00: 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,2)==0 ){.      
6b10: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 3b          ii += 2;
6b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76  .              v
6b30: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  2++;.           
6b40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
6b50: 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 20  f( v2>1 ){.     
6b60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6b70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
6b80: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e  jj, zTemp+jj, ".
6b90: 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b 0a  .%d", v1+v2-1);.
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6bb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
6bc0: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
6bd0: 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 22  sis+ii+1, "..P3"
6be0: 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  , 4)==0 && pOp->
6bf0: 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  p3==0 ){.       
6c00: 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 20       ii += 4;.  
6c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c20: 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 2b    }.        jj +
6c30: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6c40: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
6c50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6c60: 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20    zTemp[jj++] = 
6c70: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
6c80: 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 6f  .    if( !seenCo
6c90: 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20  m && jj<nTemp-5 
6ca0: 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  && pOp->zComment
6cb0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6cc0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
6cd0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22  -jj, zTemp+jj, "
6ce0: 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ; %s", pOp->zCom
6cf0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a 20  ment);.      jj 
6d00: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6d10: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
6d20: 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c 6e    }.    if( jj<n
6d30: 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d  Temp ) zTemp[jj]
6d40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
6d50: 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20  ( pOp->zComment 
6d60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
6d70: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
6d80: 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 2d  Temp, "%s", pOp-
6d90: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
6da0: 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  jj = sqlite3Strl
6db0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d  en30(zTemp);.  }
6dc0: 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 5b  else{.    zTemp[
6dd0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 3d  0] = 0;.    jj =
6de0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6df0: 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   jj;.}.#endif /*
6e00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
6e10: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
6e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
6e30: 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  AIN) || !defined
6e40: 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 20 20 20  (NDEBUG) \.     
6e50: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
6e60: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
6e70: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
6e80: 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  )./*.** Compute 
6e90: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
6ea0: 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70  scribes the P4 p
6eb0: 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20  arameter for an 
6ec0: 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a  opcode..** Use z
6ed0: 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71  Temp for any req
6ee0: 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20  uired temporary 
6ef0: 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f  buffer space..*/
6f00: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69  .static char *di
6f10: 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c  splayP4(Op *pOp,
6f20: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e   char *zTemp, in
6f30: 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72  t nTemp){.  char
6f40: 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20   *zP4 = zTemp;. 
6f50: 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d   assert( nTemp>=
6f60: 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  20 );.  switch( 
6f70: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
6f80: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
6f90: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
6fa0: 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49  i, j;.      KeyI
6fb0: 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
6fc0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f  pOp->p4.pKeyInfo
6fd0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
6fe0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
6ff0: 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rder!=0 );.     
7000: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7010: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7020: 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f  "k(%d", pKeyInfo
7030: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20  ->nField);.     
7040: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   i = sqlite3Strl
7050: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20  en30(zTemp);.   
7060: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
7070: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
7080: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
7090: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
70a0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
70b0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
70c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
70d0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
70e0: 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20  ame : "nil";.   
70f0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
7100: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
7110: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ll);.        if(
7120: 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28   n==6 && memcmp(
7130: 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36  zColl,"BINARY",6
7140: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7150: 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20    zColl = "B";. 
7160: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a           n = 1;.
7170: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7180: 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d    if( i+n>nTemp-
7190: 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  6 ){.          m
71a0: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
71b0: 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20  ",...",4);.     
71c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
71d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
71e0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[i++] = ',';.
71f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79          if( pKey
7200: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7210: 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
7220: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d   zTemp[i++] = '-
7230: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
7240: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
7250: 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b  mp[i], zColl, n+
7260: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  1);.        i +=
7270: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
7280: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
7290: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  )';.      zTemp[
72a0: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  i] = 0;.      as
72b0: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b  sert( i<nTemp );
72c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
72d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
72e0: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20  COLLSEQ: {.     
72f0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
7300: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b  = pOp->p4.pColl;
7310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7320: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7330: 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22 2c  Temp, "(%.20s)",
7340: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
7350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7360: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
7370: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
7380: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
7390: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
73a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
73b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
73c0: 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  mp, "%s(%d)", pD
73d0: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
73e0: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
73f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7400: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a  ase P4_INT64: {.
7410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7420: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
7430: 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  emp, "%lld", *pO
7440: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
7450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7460: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
7470: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
7480: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7490: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20  p, zTemp, "%d", 
74a0: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20  pOp->p4.i);.    
74b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
74c0: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a     case P4_REAL:
74d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
74e0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
74f0: 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c   zTemp, "%.16g",
7500: 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29   *pOp->p4.pReal)
7510: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7520: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7530: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65  _MEM: {.      Me
7540: 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70  m *pMem = pOp->p
7550: 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66  4.pMem;.      if
7560: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7570: 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
7580: 20 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a     zP4 = pMem->z
7590: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
75a0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
75b0: 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
75c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
75d0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
75e0: 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e  , "%lld", pMem->
75f0: 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.i);.      }els
7600: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7610: 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
7620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7630: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7640: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
7650: 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 20 20 20 20  pMem->r);.      
7660: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
7680: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7690: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
76a0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c  mp, zTemp, "NULL
76b0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ");.      }else{
76c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
76d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
76e0: 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  EM_Blob );.     
76f0: 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29     zP4 = "(blob)
7700: 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
7710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
7720: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7730: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7740: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a     case P4_VTAB:
7750: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
7760: 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70  _vtab *pVtab = p
7770: 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56  Op->p4.pVtab->pV
7780: 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tab;.      sqlit
7790: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
77a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a  p, zTemp, "vtab:
77b0: 25 70 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70  %p:%p", pVtab, p
77c0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a  Vtab->pModule);.
77d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
77f0: 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20  se P4_INTARRAY: 
7800: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7810: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
7820: 7a 54 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79  zTemp, "intarray
7830: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
7840: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7850: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
7860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7870: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7880: 54 65 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29  Temp, "program")
7890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
78a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
78b0: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
78c0: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
78d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
78e0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
78f0: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
7900: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
7910: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
7920: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
7930: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
7940: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
7950: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
7960: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20  rt( zP4!=0 );.  
7970: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65  return zP4;.}.#e
7980: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  ndif../*.** Decl
7990: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
79a0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
79b0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
79c0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
79d0: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
79e0: 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20  statements need 
79f0: 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e  to know in advan
7a00: 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ce the complete 
7a10: 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68  set of.** attach
7a20: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ed databases tha
7a30: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20  t will be use.  
7a40: 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20  A mask of these 
7a50: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20  databases.** is 
7a60: 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d  maintained in p-
7a70: 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65  >btreeMask.  The
7a80: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c   p->lockMask val
7a90: 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74  ue is the subset
7aa0: 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d   of.** p->btreeM
7ab0: 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73  ask of databases
7ac0: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
7ad0: 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  re a lock..*/.vo
7ae0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
7af0: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
7b00: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
7b10: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
7b20: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e  db->nDb && i<(in
7b30: 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b  t)sizeof(yDbMask
7b40: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
7b50: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
7b60: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
7b70: 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d  ;.  DbMaskSet(p-
7b80: 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a  >btreeMask, i);.
7b90: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
7ba0: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
7bb0: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
7bc0: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d  .pBt) ){.    DbM
7bd0: 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61  askSet(p->lockMa
7be0: 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  sk, i);.  }.}..#
7bf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7c00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
7c10: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
7c20: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
7c30: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
7c40: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
7c50: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7c60: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
7c70: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
7c80: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
7c90: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
7ca0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
7cb0: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
7cc0: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
7cd0: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
7ce0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
7cf0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
7d00: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
7d10: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
7d20: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
7d30: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
7d40: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
7d50: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
7d60: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
7d70: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
7d80: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
7d90: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
7da0: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
7db0: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
7dc0: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
7dd0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
7de0: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
7df0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7e00: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
7e10: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
7e20: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
7e30: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
7e40: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
7e50: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
7e60: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
7e70: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
7e80: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
7e90: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
7ea0: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
7eb0: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
7ec0: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
7ed0: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
7ee0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
7ef0: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
7f00: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
7f10: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
7f20: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
7f30: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
7f40: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
7f50: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
7f60: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
7f70: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
7f80: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
7f90: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
7fa0: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
7fb0: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
7fc0: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
7fd0: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
7fe0: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
7ff0: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
8000: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
8010: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
8020: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
8030: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
8040: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
8050: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8060: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
8070: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
8080: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
8090: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
80a0: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
80b0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
80c0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
80d0: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
80e0: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
80f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
8100: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
8110: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
8120: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
8130: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
8140: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
8150: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
8160: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
8170: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
8180: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
8190: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
81a0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
81b0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
81c0: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
81d0: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
81e0: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
81f0: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
8200: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
8210: 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ter()..*/.void s
8220: 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
8230: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8240: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
8250: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
8260: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
8270: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
8280: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
8290: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
82a0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
82b0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
82c0: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
82d0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
82e0: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
82f0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8300: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
8310: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
8320: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
8330: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
8340: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
8350: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
8360: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
8370: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
8380: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
8390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
83a0: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
83b0: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
83c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
83d0: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
83e0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
83f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
8400: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
8410: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
8420: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
8430: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
8440: 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30  ;.  char zCom[10
8450: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
8460: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
8470: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
8480: 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73  4d %4d %4d %-13s
8490: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
84a0: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
84b0: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
84c0: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
84d0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
84e0: 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53  zPtr));.#ifdef S
84f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
8500: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
8510: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
8520: 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73  Op, zP4, zCom, s
8530: 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65  izeof(zCom));.#e
8540: 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20  lse.  zCom[0] = 
8550: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e  0;.#endif.  /* N
8560: 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f  B:  The sqlite3O
8570: 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63  pcodeName() func
8580: 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
8590: 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61  ted by code crea
85a0: 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ted.  ** by the 
85b0: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e  mkopcodeh.awk an
85c0: 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20  d mkopcodec.awk 
85d0: 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78  scripts which ex
85e0: 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69  tract the.  ** i
85f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
8600: 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63  the vdbe.c sourc
8610: 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69  e text */.  fpri
8620: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
8630: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
8640: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
8650: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
8660: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
8670: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
8680: 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43  Op->p5,.      zC
8690: 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  om.  );.  fflush
86a0: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
86b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
86c0: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
86d0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
86e0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
86f0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
8700: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
8710: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
8720: 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 20 73 71 6c  m *pEnd;.    sql
8730: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
8740: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
8750: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
8760: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
8770: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
8780: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  eed ){.      for
8790: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70  (pEnd=&p[N]; p<p
87a0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
87b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
87c0: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
87d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
87e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
87f0: 20 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d    for(pEnd=&p[N]
8800: 3b 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a  ; p<pEnd; p++){.
8810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
8820: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
8830: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
8840: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
8850: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
8860: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
8870: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
8880: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
8890: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
88a0: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
88b0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
88c0: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
88d0: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
88e0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
88f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
8900: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
8910: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
8920: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
8930: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
8940: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
8950: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
8960: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
8970: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
8980: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
8990: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
89a0: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
89b0: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
89c0: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
89d0: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
89e0: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
89f0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
8a00: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
8a10: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
8a20: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
8a30: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
8a40: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
8a50: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
8a60: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
8a70: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
8a80: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
8a90: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
8aa0: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
8ab0: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
8ac0: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
8ad0: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
8ae0: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
8af0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
8b00: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
8b10: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
8b20: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
8b30: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
8b40: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
8b50: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
8b60: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
8b70: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8b80: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8b90: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
8ba0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
8bb0: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
8bc0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
8bd0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
8be0: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
8bf0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
8c00: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
8c10: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
8c20: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
8c30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
8c40: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
8c50: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61  }else if( p->zMa
8c60: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
8c70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8c80: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
8c90: 20 20 20 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f         p->zMallo
8ca0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
8cb0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
8cc0: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
8cd0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 61      }.    db->ma
8ce0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c  llocFailed = mal
8cf0: 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a  loc_failed;.  }.
8d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
8d10: 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  a VdbeFrame obje
8d20: 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65  ct and its conte
8d30: 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f  nts. VdbeFrame o
8d40: 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c  bjects are.** al
8d50: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f  located by the O
8d60: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
8d70: 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45   in sqlite3VdbeE
8d80: 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  xec()..*/.void s
8d90: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
8da0: 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20  elete(VdbeFrame 
8db0: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8dc0: 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65  Mem *aMem = Vdbe
8dd0: 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56  FrameMem(p);.  V
8de0: 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73  dbeCursor **apCs
8df0: 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20  r = (VdbeCursor 
8e00: 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69  **)&aMem[p->nChi
8e10: 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d  ldMem];.  for(i=
8e20: 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73  0; i<p->nChildCs
8e30: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
8e40: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
8e50: 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69  or(p->v, apCsr[i
8e60: 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
8e70: 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20  eMemArray(aMem, 
8e80: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20  p->nChildMem);. 
8e90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
8ea0: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a  ->v->db, p);.}..
8eb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8ec0: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
8ed0: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67  * Give a listing
8ee0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   of the program 
8ef0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d  in the virtual m
8f00: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  achine..**.** Th
8f10: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74  e interface is t
8f20: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
8f30: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42  e3VdbeExec().  B
8f40: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ut instead of.**
8f50: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64   running the cod
8f60: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68  e, it invokes th
8f70: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20  e callback once 
8f80: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63  for each instruc
8f90: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65  tion..** This fe
8fa0: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  ature is used to
8fb0: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c   implement "EXPL
8fc0: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  AIN"..**.** When
8fd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20   p->explain==1, 
8fe0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
8ff0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65   is listed.  Whe
9000: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  n.** p->explain=
9010: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c  =2, only OP_Expl
9020: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ain instructions
9030: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20   are listed and 
9040: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f  these.** are sho
9050: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  wn in a differen
9060: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78  t format.  p->ex
9070: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64  plain==2 is used
9080: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
9090: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
90a0: 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  LAN..**.** When 
90b0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66  p->explain==1, f
90c0: 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72  irst the main pr
90d0: 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c  ogram is listed,
90e0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a   then each of.**
90f0: 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62   the trigger sub
9100: 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73  programs are lis
9110: 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ted one by one..
9120: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
9130: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  beList(.  Vdbe *
9140: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
9150: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
9160: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77  */.){.  int nRow
9170: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9190: 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f  Stop when row co
91a0: 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73  unt reaches this
91b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d   */.  int nSub =
91c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
91d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
91e0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65  mber of sub-vdbe
91f0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  s seen so far */
9200: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
9210: 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  apSub = 0;      
9220: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
9230: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f   of sub-vdbes */
9240: 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30  .  Mem *pSub = 0
9250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9260: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
9270: 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61  y cell hold arra
9280: 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f  y of subprogs */
9290: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
92a0: 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20   p->db;         
92b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
92c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
92d0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  on */.  int i;  
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9300: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
9310: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
9320: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
9330: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
9340: 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a   code */.  Mem *
9350: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
9360: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  1];             
9370: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20  /* First Mem of 
9380: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
9390: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c   assert( p->expl
93a0: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ain );.  assert(
93b0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
93c0: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61  MAGIC_RUN );.  a
93d0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
93e0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63  LITE_OK || p->rc
93f0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
9400: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
9410: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76  OMEM );..  /* Ev
9420: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f  en though this o
9430: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75  pcode does not u
9440: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e  se dynamic strin
9450: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  gs for.  ** the 
9460: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63  result, result c
9470: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d  olumns may becom
9480: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65  e dynamic if the
9490: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a   user calls.  **
94a0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
94b0: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e  text16(), causin
94c0: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  g a translation 
94d0: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69  to UTF-16 encodi
94e0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61  ng..  */.  relea
94f0: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c  seMemArray(pMem,
9500: 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c   8);.  p->pResul
9510: 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  tSet = 0;..  if(
9520: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   p->rc==SQLITE_N
9530: 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 54  OMEM ){.    /* T
9540: 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61  his happens if a
9550: 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65   malloc() inside
9560: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
9570: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29  e3_column_text()
9580: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
9590: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
95a0: 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20  () failed.  */. 
95b0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
95c0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  led = 1;.    ret
95d0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
95e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
95f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
9600: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
9610: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
9620: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
9630: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
9640: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
9650: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
9660: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
9670: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
9680: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
9690: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
96a0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
96b0: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
96c0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
96d0: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
96e0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
96f0: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
9700: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
9710: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
9720: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
9730: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
9740: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
9750: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
9760: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
9770: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
9780: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
9790: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
97a0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
97b0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
97c0: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
97d0: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
97e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
97f0: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
9800: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
9810: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
9820: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
9830: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
9840: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
9850: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
9860: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
9870: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
9880: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
9890: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
98a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
98b0: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
98c0: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
98d0: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
98e0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
98f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
9900: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
9910: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
9920: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
9930: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
9940: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
9950: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
9960: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
9970: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
9980: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
9990: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
99a0: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
99b0: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
99c0: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
99d0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
99e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
99f0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
9a00: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
9a10: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
9a20: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
9a30: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
9a40: 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65  ( i<nRow && p->e
9a50: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
9a60: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
9a70: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
9a80: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
9a90: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
9aa0: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
9ab0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
9ac0: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
9ad0: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
9ae0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
9af0: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
9b00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
9b10: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  OR;.    sqlite3S
9b20: 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
9b30: 72 4d 73 67 2c 20 64 62 2c 20 22 25 73 22 2c 20  rMsg, db, "%s", 
9b40: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d  sqlite3ErrStr(p-
9b50: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >rc));.  }else{.
9b60: 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20      char *zP4;. 
9b70: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
9b80: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a  if( i<p->nOp ){.
9b90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74        /* The out
9ba0: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  put line number 
9bb0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
9bc0: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c  that we are stil
9bd0: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  l in the.      *
9be0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20  * main program. 
9bf0: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26  */.      pOp = &
9c00: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  p->aOp[i];.    }
9c10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57  else{.      /* W
9c20: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
9c30: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72  listing subprogr
9c40: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74  ams.  Figure out
9c50: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20   which one and. 
9c60: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20       ** pick up 
9c70: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
9c80: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20  opcode. */.     
9c90: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20   int j;.      i 
9ca0: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20  -= p->nOp;.     
9cb0: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53   for(j=0; i>=apS
9cc0: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29  ub[j]->nOp; j++)
9cd0: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61  {.        i -= a
9ce0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[j]->nOp;.  
9cf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20      }.      pOp 
9d00: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70  = &apSub[j]->aOp
9d10: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  [i];.    }.    i
9d20: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
9d30: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   ){.      pMem->
9d40: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
9d50: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
9d60: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20   = i;           
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20       /* Program 
9d90: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
9da0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20   pMem++;.  .    
9db0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
9dc0: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53  MEM_Static|MEM_S
9dd0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
9de0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
9df0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64  ar*)sqlite3Opcod
9e00: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
9e10: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f  e); /* Opcode */
9e20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9e30: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
9e40: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
9e50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
9e60: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
9e70: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
9e80: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  UTF8;.      pMem
9e90: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  ++;..      /* Wh
9ea0: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d  en an OP_Program
9eb0: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75   opcode is encou
9ec0: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f  nter (the only o
9ed0: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20  pcode that has. 
9ee0: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42       ** a P4_SUB
9ef0: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74  PROGRAM argument
9f00: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69  ), expand the si
9f10: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
9f20: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20  of subprograms. 
9f30: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20       ** kept in 
9f40: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20  p->aMem[9].z to 
9f50: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f  hold the new pro
9f60: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20  gram - assuming 
9f70: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a  this subprogram.
9f80: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74        ** has not
9f90: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65   already been se
9fa0: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  en..      */.   
9fb0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79     if( pOp->p4ty
9fc0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
9fd0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
9fe0: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31   nByte = (nSub+1
9ff0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67  )*sizeof(SubProg
a000: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69  ram*);.        i
a010: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
a020: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a  r(j=0; j<nSub; j
a030: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
a040: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70  f( apSub[j]==pOp
a050: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20  ->p4.pProgram ) 
a060: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a070: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
a080: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f  nSub && SQLITE_O
a090: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65  K==sqlite3VdbeMe
a0a0: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74  mGrow(pSub, nByt
a0b0: 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20  e, nSub!=0) ){. 
a0c0: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d           apSub =
a0d0: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29   (SubProgram **)
a0e0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20  pSub->z;.       
a0f0: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d     apSub[nSub++]
a100: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67   = pOp->p4.pProg
a110: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ram;.          p
a120: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45  Sub->flags |= ME
a130: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20  M_Blob;.        
a140: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62    pSub->n = nSub
a150: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72  *sizeof(SubProgr
a160: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  am*);.        }.
a170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
a180: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a190: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
a1a0: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
a1b0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
a1c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a1d0: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  1 */.    pMem++;
a1e0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ..    pMem->flag
a1f0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
a200: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70   pMem->u.i = pOp
a210: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20  ->p2;           
a220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a230: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  * P2 */.    pMem
a240: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  ++;..    pMem->f
a250: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
a260: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
a270: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20  pOp->p3;        
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70    /* P3 */.    p
a2a0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
a2b0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72  sqlite3VdbeMemGr
a2c0: 6f 77 28 70 4d 65 6d 2c 20 33 32 2c 20 30 29 20  ow(pMem, 32, 0) 
a2d0: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ){            /*
a2e0: 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73   P4 */.      ass
a2f0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
a300: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
a310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a320: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
a330: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a340: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
a350: 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c  .    zP4 = displ
a360: 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e  ayP4(pOp, pMem->
a370: 7a 2c 20 33 32 29 3b 0a 20 20 20 20 69 66 28 20  z, 32);.    if( 
a380: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
a390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a3a0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
a3b0: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
a3c0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
a3d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
a3e0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
a3f0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
a400: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
a410: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
a420: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
a430: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
a440: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
a450: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
a460: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
a470: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47   sqlite3VdbeMemG
a480: 72 6f 77 28 70 4d 65 6d 2c 20 34 2c 20 30 29 20  row(pMem, 4, 0) 
a490: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
a4a0: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  t( p->db->malloc
a4b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a4c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a4d0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
a4e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a4f0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
a500: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
a510: 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  >n = 2;.      sq
a520: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33  lite3_snprintf(3
a530: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78  , pMem->z, "%.2x
a540: 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f  ", pOp->p5);   /
a550: 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d  * P5 */.      pM
a560: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
a570: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65  _UTF8;.      pMe
a580: 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53  m++;.  .#ifdef S
a590: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
a5a0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
a5b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
a5c0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c  dbeMemGrow(pMem,
a5d0: 20 35 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20   500, 0) ){.    
a5e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
a5f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a600: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
a610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
a620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
a630: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a640: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
a650: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
a660: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a670: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
a680: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
a690: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a6a0: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
a6b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a6c0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6e0: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
a6f0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
a700: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
a710: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
a720: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
a730: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
a740: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
a750: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a760: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
a770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a780: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a790: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
a7a0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
a7b0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
a7c0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
a7d0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
a7e0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
a7f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
a800: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
a810: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
a820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
a830: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
a840: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
a850: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
a860: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
a870: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
a880: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
a890: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
a8a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
a8b0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
a8c0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
a8d0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
a8e0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
a8f0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
a910: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
a920: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
a930: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a940: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a950: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
a960: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
a970: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
a980: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
a990: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
a9a0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
a9b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a9c0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
a9d0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
a9e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
a9f0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
aa00: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
aa10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
aa20: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
aa30: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
aa40: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
aa50: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
aa60: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
aa70: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
aa80: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
aa90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
aaa0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
aab0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
aac0: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
aad0: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
aae0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
aaf0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
ab00: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
ab10: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
ab20: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
ab30: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
ab40: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
ab50: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
ab60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ab70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
ab80: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
ab90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
aba0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
abb0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
abc0: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
abd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
abe0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
abf0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
ac00: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  IOTRACE */../*.*
ac10: 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
ac20: 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69   from a fixed si
ac30: 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65  ze buffer and re
ac40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
ac50: 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e  o.** that space.
ac60: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
ac70: 74 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c  t space is avail
ac80: 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c  able, return NUL
ac90: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75  L..**.** The pBu
aca0: 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  f parameter is t
acb0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
acc0: 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68   of a pointer wh
acd0: 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65  ich will.** rece
ace0: 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f  ive the new memo
acf0: 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72  ry.  pBuf is nor
ad00: 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20  mally NULL.  If 
ad10: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
ad20: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
ad30: 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  at memory space 
ad40: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
ad50: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
ad60: 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hat.** this rout
ad70: 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61  ine should not a
ad80: 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20  llocate any new 
ad90: 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42  memory.  When pB
ada0: 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c  uf is not.** NUL
adb0: 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  L simply return 
adc0: 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f  pBuf.  Only allo
add0: 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20  cate new memory 
ade0: 73 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a  space when pBuf.
adf0: 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  ** is NULL..**.*
ae00: 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e  * nByte is the n
ae10: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
ae20: 66 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a  f space needed..
ae30: 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20 70 6f  **.** *ppFrom po
ae40: 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61 62 6c  ints to availabl
ae50: 65 20 73 70 61 63 65 20 61 6e 64 20 70 45 6e 64  e space and pEnd
ae60: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65   points to the e
ae70: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61 76 61  nd of the.** ava
ae80: 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20 20 57  ilable space.  W
ae90: 68 65 6e 20 73 70 61 63 65 20 69 73 20 61 6c 6c  hen space is all
aea0: 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f 6d 20  ocated, *ppFrom 
aeb0: 69 73 20 61 64 76 61 6e 63 65 64 20 70 61 73 74  is advanced past
aec0: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 74  .** the end of t
aed0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  he allocated spa
aee0: 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42 79 74  ce..**.** *pnByt
aef0: 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72 20 6f  e is a counter o
af00: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
af10: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  bytes of space t
af20: 68 61 74 20 68 61 76 65 20 66 61 69 6c 65 64 0a  hat have failed.
af30: 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20  ** to allocate. 
af40: 20 49 66 20 74 68 65 72 65 20 69 73 20 69 6e 73   If there is ins
af50: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
af60: 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20 73 61  in *ppFrom to sa
af70: 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72 65 71  tisfy the.** req
af80: 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63 72 65  uest, then incre
af90: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62 79 20  ment *pnByte by 
afa0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
afb0: 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74  e request..*/.st
afc0: 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63  atic void *alloc
afd0: 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 70  Space(.  void *p
afe0: 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Buf,          /*
aff0: 20 57 68 65 72 65 20 72 65 74 75 72 6e 20 70 6f   Where return po
b000: 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20 73 74  inter will be st
b010: 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ored */.  int nB
b020: 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  yte,           /
b030: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
b040: 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
b050: 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d 2c 20  .  u8 **ppFrom, 
b060: 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
b070: 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72 6f 6d  T: Allocate from
b080: 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20 75 38   *ppFrom */.  u8
b090: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
b0a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
b0b0: 20 31 20 62 79 74 65 20 70 61 73 74 20 74 68 65   1 byte past the
b0c0: 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f 6d 20   end of *ppFrom 
b0d0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
b0e0: 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  *pnByte         
b0f0: 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f   /* If allocatio
b100: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65  n cannot be made
b110: 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42  , increment *pnB
b120: 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  yte */.){.  asse
b130: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
b140: 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72 6f 6d  LIGNMENT(*ppFrom
b150: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 20  ) );.  if( pBuf 
b160: 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 20  ) return pBuf;. 
b170: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
b180: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 26 28  nByte);.  if( &(
b190: 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65 5d 20  *ppFrom)[nByte] 
b1a0: 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 70  <= pEnd ){.    p
b1b0: 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a 70 70  Buf = (void*)*pp
b1c0: 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46 72 6f  From;.    *ppFro
b1d0: 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 65  m += nByte;.  }e
b1e0: 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79 74 65  lse{.    *pnByte
b1f0: 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20   += nByte;.  }. 
b200: 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
b210: 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68  ./*.** Rewind th
b220: 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f 20 74  e VDBE back to t
b230: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20  he beginning in 
b240: 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a  preparation for.
b250: 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a  ** running it..*
b260: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b270: 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 2a 70  beRewind(Vdbe *p
b280: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
b290: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
b2a0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
b2b0: 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23  FILE).  int i;.#
b2c0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b2d0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b2e0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
b2f0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a  _MAGIC_INIT );..
b300: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c    /* There shoul
b310: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  d be at least on
b320: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  e opcode..  */. 
b330: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
b340: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  0 );..  /* Set t
b350: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45  he magic to VDBE
b360: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65  _MAGIC_RUN soone
b370: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
b380: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67  ter. */.  p->mag
b390: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
b3a0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  RUN;..#ifdef SQL
b3b0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28  ITE_DEBUG.  for(
b3c0: 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20  i=1; i<p->nMem; 
b3d0: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
b3e0: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d  ( p->aMem[i].db=
b3f0: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65  =p->db );.  }.#e
b400: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d  ndif.  p->pc = -
b410: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  1;.  p->rc = SQL
b420: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72  ITE_OK;.  p->err
b430: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
b440: 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  ort;.  p->magic 
b450: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
b460: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
b470: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
b480: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
b490: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
b4a0: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
b4b0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
b4c0: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
b4d0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
b4e0: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
b4f0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
b500: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
b510: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
b520: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
b530: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
b540: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
b550: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b560: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
b570: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
b580: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
b590: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
b5a0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
b5b0: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
b5c0: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
b5d0: 74 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65  ting stack space
b5e0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
b5f0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
b600: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
b610: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
b620: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
b630: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
b640: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
b650: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
b660: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
b670: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b680: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
b690: 61 63 74 20 6f 6e 63 65 20 6f 6e 20 61 20 65 61  act once on a ea
b6a0: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
b6b0: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
b6c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
b6d0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
b6e0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
b6f0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
b700: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
b710: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b720: 6c 6c 65 64 2c 20 66 75 74 68 65 72 20 63 61 6c  lled, futher cal
b730: 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65  ls to .** sqlite
b740: 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e  3VdbeAddOp() fun
b750: 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69  ctions are prohi
b760: 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75  bited.  This rou
b770: 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73  tine disconnects
b780: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f  .** the Vdbe fro
b790: 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  m the Parse obje
b7a0: 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67  ct that helped g
b7b0: 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68  enerate it so th
b7c0: 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64  at the.** the Vd
b7d0: 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e  be becomes an in
b7e0: 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79  dependent entity
b7f0: 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f   and the Parse o
b800: 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20  bject can be.** 
b810: 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a  destroyed..**.**
b820: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
b830: 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f  VdbeRewind() pro
b840: 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72  cedure to restor
b850: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68  e a virtual mach
b860: 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69  ine back.** to i
b870: 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65  ts initial state
b880: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65   after it has be
b890: 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  en run..*/.void 
b8a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
b8b0: 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c  eady(.  Vdbe *p,
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
b8e0: 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  BE */.  Parse *p
b8f0: 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20  Parse           
b900: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
b910: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a  g context */.){.
b920: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
b930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b940: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
b950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
b960: 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20   int nVar;      
b970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b980: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72  /* Number of par
b990: 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ameters */.  int
b9a0: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20   nMem;          
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b9c0: 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f  umber of VM memo
b9d0: 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  ry registers */.
b9e0: 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20    int nCursor;  
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
ba10: 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a  rsors required *
ba20: 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ba50: 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62  arguments in sub
ba60: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
ba70: 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20  t nOnce;        
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba90: 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63  Number of OP_Onc
baa0: 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a  e instructions *
bab0: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
bac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bad0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
bae0: 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72  er */.  u8 *zCsr
baf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bb00: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
bb10: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61   available for a
bb20: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  llocation */.  u
bb30: 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *zEnd;        
bb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb50: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
bb60: 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
bb70: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  y */.  int nByte
bb80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bb90: 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 63        /* How muc
bba0: 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 69  h extra memory i
bbb0: 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 61  s needed */..  a
bbc0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
bbd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
bbe0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbf0: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
bc00: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
bc10: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
bc20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
bc30: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
bc40: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
bc50: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
bc60: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
bc70: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
bc80: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
bc90: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
bca0: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
bcb0: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
bcc0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
bcd0: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
bce0: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
bcf0: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
bd00: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
bd10: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
bd20: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
bd30: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
bd40: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
bd50: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
bd60: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
bd70: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
bd80: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
bd90: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
bda0: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
bdb0: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
bdc0: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
bdd0: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
bde0: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
bdf0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
be00: 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43  e for.  ** VdbeC
be10: 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20 73  ursor/BtCursor s
be20: 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20 62  tructures. The b
be30: 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73  lob of memory as
be40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 20  sociated with . 
be50: 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73 20   ** cursor 0 is 
be60: 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
be70: 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f   cell nMem. Memo
be80: 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29  ry cell (nMem-1)
be90: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
bea0: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
beb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
bec0: 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20  cursor 1, etc.. 
bed0: 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73   **.  ** See als
bee0: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
bef0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
bf00: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20   += nCursor;..  
bf10: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
bf20: 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65 67  e for memory reg
bf30: 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72 69  isters, SQL vari
bf40: 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72 73  ables, VDBE curs
bf50: 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61 6e  ors and .  ** an
bf60: 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68 61   array to marsha
bf70: 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 61  l SQL function a
bf80: 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20 2a  rguments in..  *
bf90: 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a 29  /.  zCsr = (u8*)
bfa0: 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b  &p->aOp[p->nOp];
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
bfc0: 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65 20  emory avaliable 
bfd0: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
bfe0: 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a 29  /.  zEnd = (u8*)
bff0: 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d 3e  &p->aOp[pParse->
c000: 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46  nOpAlloc];  /* F
c010: 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 65  irst byte past e
c020: 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a  nd of zCsr[] */.
c030: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  .  resolveP2Valu
c040: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20  es(p, &nArg);.  
c050: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
c060: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65  al = (u8)(pParse
c070: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26  ->isMultiWrite &
c080: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f  & pParse->mayAbo
c090: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  rt);.  if( pPars
c0a0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d  e->explain && nM
c0b0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65  em<10 ){.    nMe
c0c0: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d 65  m = 10;.  }.  me
c0d0: 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a 45  mset(zCsr, 0, zE
c0e0: 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73 72  nd-zCsr);.  zCsr
c0f0: 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38 2a   += (zCsr - (u8*
c100: 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74 28  )0)&7;.  assert(
c110: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
c120: 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20  NMENT(zCsr) );. 
c130: 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b   p->expired = 0;
c140: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f  ..  /* Memory fo
c150: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72  r registers, par
c160: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c  ameters, cursor,
c170: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74   etc, is allocat
c180: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70  ed in two.  ** p
c190: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66  asses.  On the f
c1a0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72  irst pass, we tr
c1b0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65  y to reuse unuse
c1c0: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a  d space at the .
c1d0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20    ** end of the 
c1e0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49  opcode array.  I
c1f0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  f we are unable 
c200: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d  to satisfy all m
c210: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69  emory.  ** requi
c220: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69  rements by reusi
c230: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  ng the opcode ar
c240: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74  ray tail, then t
c250: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70  he second.  ** p
c260: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e  ass will fill in
c270: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20   the rest using 
c280: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69  a fresh allocati
c290: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  on.  .  **.  ** 
c2a0: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70  This two-pass ap
c2b0: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73  proach that reus
c2c0: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  es as much memor
c2d0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72  y as possible fr
c2e0: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74  om.  ** the left
c2f0: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68  over space at th
c300: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
c310: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69  ode array can si
c320: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
c330: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
c340: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
c350: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
c360: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
c370: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65    do {.    nByte
c380: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65   = 0;.    p->aMe
c390: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  m = allocSpace(p
c3a0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a  ->aMem, nMem*siz
c3b0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
c3c0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c3d0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
c3e0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72  locSpace(p->aVar
c3f0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65  , nVar*sizeof(Me
c400: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
c410: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c420: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
c430: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41  ace(p->apArg, nA
c440: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c  rg*sizeof(Mem*),
c450: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e   &zCsr, zEnd, &n
c460: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  Byte);.    p->az
c470: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Var = allocSpace
c480: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a  (p->azVar, nVar*
c490: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26  sizeof(char*), &
c4a0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
c4b0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
c4c0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
c4d0: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
c4e0: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
c4f0: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
c500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c510: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
c520: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e  yte);.    p->aOn
c530: 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70  ceFlag = allocSp
c540: 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  ace(p->aOnceFlag
c550: 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43 73 72 2c 20  , nOnce, &zCsr, 
c560: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c570: 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
c580: 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d        p->pFree =
c590: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c5a0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
c5b0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20  .    }.    zCsr 
c5c0: 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20  = p->pFree;.    
c5d0: 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79  zEnd = &zCsr[nBy
c5e0: 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6e  te];.  }while( n
c5f0: 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 6c  Byte && !db->mal
c600: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
c610: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75  p->nCursor = nCu
c620: 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65  rsor;.  p->nOnce
c630: 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20  Flag = nOnce;.  
c640: 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20  if( p->aVar ){. 
c650: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e     p->nVar = (yn
c660: 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f  Var)nVar;.    fo
c670: 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e  r(n=0; n<nVar; n
c680: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56  ++){.      p->aV
c690: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  ar[n].flags = ME
c6a0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d  M_Null;.      p-
c6b0: 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aVar[n].db = db
c6c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
c6d0: 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a 20 20  ( p->azVar ){.  
c6e0: 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61    p->nzVar = pPa
c6f0: 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 20 20  rse->nzVar;.    
c700: 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61 72 2c  memcpy(p->azVar,
c710: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20   pParse->azVar, 
c720: 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28  p->nzVar*sizeof(
c730: 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  p->azVar[0]));. 
c740: 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72 73 65     memset(pParse
c750: 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50 61 72  ->azVar, 0, pPar
c760: 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f 66  se->nzVar*sizeof
c770: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 30  (pParse->azVar[0
c780: 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ]));.  }.  if( p
c790: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
c7a0: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c7c0: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
c7d0: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
c7e0: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c800: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
c810: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
c820: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
c830: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
c840: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
c850: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
c860: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
c870: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
c880: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
c890: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
c8a0: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
c8b0: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
c8c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
c8d0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
c8e0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
c8f0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
c900: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
c910: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
c920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
c930: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
c940: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
c950: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
c960: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
c970: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
c980: 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d  beSorterClose(p-
c990: 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69 66 28  >db, pCx);.  if(
c9a0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
c9b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
c9c0: 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20  se(pCx->pBt);.  
c9d0: 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43    /* The pCx->pC
c9e0: 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c  ursor will be cl
c9f0: 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ose automaticall
ca00: 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2c  y, if it exists,
ca10: 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   by.    ** the c
ca20: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
ca30: 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70  }else if( pCx->p
ca40: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71  Cursor ){.    sq
ca50: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
ca60: 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73  ursor(pCx->pCurs
ca70: 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  or);.  }.#ifndef
ca80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ca90: 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
caa0: 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72  pCx->pVtabCursor
cab0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
cac0: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74  vtab_cursor *pVt
cad0: 61 62 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e  abCursor = pCx->
cae0: 70 56 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20  pVtabCursor;.   
caf0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
cb00: 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d  odule *pModule =
cb10: 20 70 56 74 61 62 43 75 72 73 6f 72 2d 3e 70 56   pVtabCursor->pV
cb20: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20  tab->pModule;.  
cb30: 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f    p->inVtabMetho
cb40: 64 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75  d = 1;.    pModu
cb50: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62  le->xClose(pVtab
cb60: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e  Cursor);.    p->
cb70: 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30  inVtabMethod = 0
cb80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
cb90: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76  /*.** Copy the v
cba0: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
cbb0: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74  the VdbeFrame st
cbc0: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56  ructure to its V
cbd0: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20  dbe. This.** is 
cbe0: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  used, for exampl
cbf0: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65  e, when a trigge
cc00: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73  r sub-program is
cc10: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f   halted to resto
cc20: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f  re.** control to
cc30: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
cc40: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  m..*/.int sqlite
cc50: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
cc60: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72  e(VdbeFrame *pFr
cc70: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
cc80: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76  = pFrame->v;.  v
cc90: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46  ->aOnceFlag = pF
cca0: 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b  rame->aOnceFlag;
ccb0: 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20  .  v->nOnceFlag 
ccc0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46  = pFrame->nOnceF
ccd0: 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20  lag;.  v->aOp = 
cce0: 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76  pFrame->aOp;.  v
ccf0: 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->nOp = pFrame->
cd00: 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d  nOp;.  v->aMem =
cd10: 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20   pFrame->aMem;. 
cd20: 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d   v->nMem = pFram
cd30: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70  e->nMem;.  v->ap
cd40: 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70  Csr = pFrame->ap
cd50: 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f  Csr;.  v->nCurso
cd60: 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72  r = pFrame->nCur
cd70: 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61  sor;.  v->db->la
cd80: 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65  stRowid = pFrame
cd90: 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76  ->lastRowid;.  v
cda0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61  ->nChange = pFra
cdb0: 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 72  me->nChange;.  r
cdc0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
cdd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
cde0: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
cdf0: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
ce00: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
ce10: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
ce20: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
ce30: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
ce40: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
ce50: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
ce60: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
ce70: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
ce80: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
ce90: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
cea0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
ceb0: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
cec0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
ced0: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
cee0: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
cef0: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
cf00: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
cf10: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
cf20: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
cf30: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
cf40: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
cf50: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
cf60: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
cf70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
cf80: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
cf90: 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rame);.  }.  p->
cfa0: 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  pFrame = 0;.  p-
cfb0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  >nFrame = 0;..  
cfc0: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
cfd0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
cfe0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
cff0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
d000: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
d010: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
d020: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
d030: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d040: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
d050: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
d060: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
d070: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d080: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
d090: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
d0a0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
d0b0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
d0c0: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
d0d0: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
d0e0: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
d0f0: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
d100: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
d110: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
d120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
d130: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
d140: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
d150: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
d160: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
d170: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 73  by the VM */.  s
d180: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
d190: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30  AuxData(p, -1, 0
d1a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d1b0: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d  pAuxData==0 );.}
d1c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70  ../*.** Clean up
d1d0: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 78   the VM after ex
d1e0: 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ecution..**.** T
d1f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d200: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
d210: 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73  lose any cursors
d220: 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a  , lists, and/or.
d230: 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 20  ** sorters that 
d240: 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20  were left open. 
d250: 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73   It also deletes
d260: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a   the values of.*
d270: 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74  * variables in t
d280: 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e  he aVar[] array.
d290: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d2a0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
d2b0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
d2c0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
d2d0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
d2e0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
d2f0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
d300: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
d310: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
d320: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
d330: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
d340: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
d350: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
d360: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
d370: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
d380: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
d390: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
d3a0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
d3b0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
d3c0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
d3d0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
d3e0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
d3f0: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
d400: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
d410: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
d420: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
d430: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
d440: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
d450: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
d460: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
d470: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
d480: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
d490: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
d4a0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
d4b0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
d4c0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
d4d0: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
d4e0: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
d4f0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
d500: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
d510: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
d520: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
d530: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
d540: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
d550: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
d560: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
d570: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
d580: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
d590: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
d5a0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
d5b0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
d5c0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
d5d0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
d5e0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
d5f0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
d600: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
d610: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
d620: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
d630: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
d640: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
d650: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
d660: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
d670: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
d680: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
d690: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d6a0: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
d6b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
d6c0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
d6d0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
d6e0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
d6f0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
d700: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
d710: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
d720: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
d730: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
d740: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
d750: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
d760: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
d770: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
d780: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
d790: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
d7a0: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
d7b0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
d7c0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
d7d0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
d7e0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
d7f0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
d800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
d810: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
d820: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
d830: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
d840: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
d850: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
d860: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
d870: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
d880: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
d890: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
d8a0: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
d8b0: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
d8c0: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
d8d0: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
d8e0: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
d8f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
d900: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d920: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
d930: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
d940: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
d970: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
d980: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
d990: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9b0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
d9c0: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
d9d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
d9e0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
d9f0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
da00: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
da10: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
da20: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
da30: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
da40: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
da50: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
da60: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
da70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
da80: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
da90: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
daa0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
dab0: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
dac0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
dad0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
dae0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
daf0: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
db00: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
db10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
db20: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
db30: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
db40: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
db50: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
db60: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
db70: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
db80: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
db90: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
dba0: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
dbb0: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
dbc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
dbd0: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
dbe0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
dbf0: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
dc00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dc10: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
dc20: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
dc30: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
dc40: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
dc50: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
dc60: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
dc70: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
dc80: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
dc90: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
dca0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
dcb0: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
dcc0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
dcd0: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
dce0: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
dcf0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
dd00: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
dd10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
dd20: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
dd30: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
dd40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
dd50: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
dd60: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
dd70: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
dd80: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
dd90: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
dda0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ddb0: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
ddc0: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
ddd0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
dde0: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
ddf0: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
de00: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
de10: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
de20: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
de30: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
de40: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
de50: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
de60: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
de70: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
de80: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
de90: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
dea0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
deb0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
dec0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
ded0: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
dee0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
def0: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
df00: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
df10: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
df20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
df30: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
df40: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
df50: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
df60: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
df70: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
df80: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
df90: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
dfa0: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
dfb0: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
dfc0: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
dfd0: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
dfe0: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
dff0: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
e000: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
e010: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
e020: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
e030: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
e040: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
e050: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
e060: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
e070: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
e080: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
e090: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
e0a0: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
e0b0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
e0c0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e0d0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
e0e0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
e0f0: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
e100: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
e110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e120: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e130: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
e140: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e150: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
e160: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
e170: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
e180: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
e190: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
e1a0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
e1b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e1c0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
e1d0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e1e0: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
e1f0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
e200: 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pBt));.      sql
e210: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
e220: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
e230: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e240: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
e250: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
e260: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
e270: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e280: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
e290: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
e2a0: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
e2b0: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
e2c0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
e2d0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
e2e0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
e2f0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
e300: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
e310: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e320: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
e330: 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
e340: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
e350: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
e360: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
e370: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
e380: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
e390: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
e3a0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
e3b0: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
e3c0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
e3d0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
e3e0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
e3f0: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
e400: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
e410: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
e420: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
e430: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
e440: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
e450: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
e460: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
e470: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
e480: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
e490: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
e4a0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
e4b0: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
e4c0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
e4d0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
e4e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
e4f0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
e500: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
e510: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
e520: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
e530: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
e540: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
e550: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
e560: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
e570: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
e580: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
e590: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
e5a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
e5b0: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
e5c0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
e5d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e5e0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
e5f0: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
e600: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
e610: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
e620: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
e630: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
e640: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
e650: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
e660: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
e670: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
e680: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
e690: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
e6a0: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
e6b0: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
e6c0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
e6d0: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
e6e0: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
e6f0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
e700: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
e710: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
e720: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e730: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
e740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
e750: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
e760: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
e770: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
e780: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
e790: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
e7a0: 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
e7b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
e7c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e7d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e7e0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
e7f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e800: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
e810: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
e820: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
e830: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e840: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
e850: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
e860: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
e870: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
e880: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
e890: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79  mmitted atomicly
e8a0: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
e8b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e8c0: 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
e8d0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
e8e0: 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
e8f0: 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
e900: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
e910: 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
e920: 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
e930: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
e940: 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
e950: 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
e960: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
e970: 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
e980: 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
e990: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
e9a0: 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
e9b0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
e9c0: 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
e9d0: 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
e9e0: 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
e9f0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
ea00: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ea10: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
ea20: 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
ea30: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ea40: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
ea50: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
ea60: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
ea70: 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
ea80: 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
ea90: 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
eaa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
eab0: 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  MEM;.    do {.  
eac0: 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
ead0: 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
eae0: 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
eaf0: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
eb00: 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
eb10: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
eb20: 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
eb30: 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
eb40: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
eb50: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
eb60: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
eb70: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
eb80: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
eb90: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
eba0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
ebb0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
ebc0: 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
ebd0: 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
ebe0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
ebf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
ec00: 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
ec10: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
ec20: 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
ec30: 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
ec40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
ec50: 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
ec60: 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
ec70: 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
eca0: 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
ecb0: 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
ecc0: 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
ecd0: 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
ece0: 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
ecf0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ed00: 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
ed10: 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
ed20: 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
ed30: 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
ed40: 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
ed50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
ed60: 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
ed70: 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
ed80: 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
ed90: 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
eda0: 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
edb0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
edc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
edd0: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
ede0: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
edf0: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
ee00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
ee10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
ee20: 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
ee30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ee40: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
ee50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
ee60: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
ee70: 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
ee80: 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
ee90: 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
eea0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
eeb0: 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
eec0: 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
eed0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
eee0: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
eef0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
ef00: 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
ef10: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
ef20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ef30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
ef40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
ef50: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
ef60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
ef70: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
ef80: 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
ef90: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
efa0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
efb0: 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
efc0: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
efd0: 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
efe0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
eff0: 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
f000: 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
f010: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
f020: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
f030: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
f040: 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
f050: 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
f060: 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
f070: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
f080: 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
f090: 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
f0a0: 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
f0b0: 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
f0c0: 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
f0d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
f0e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
f0f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
f100: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
f110: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
f120: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
f130: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
f140: 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
f150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
f160: 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
f170: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
f180: 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
f190: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
f1a0: 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
f1b0: 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
f1c0: 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
f1d0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
f1e0: 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
f1f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
f200: 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
f210: 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
f220: 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
f230: 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
f240: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
f250: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f260: 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
f270: 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
f280: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
f290: 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
f2a0: 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
f2b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
f2c0: 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
f2d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f2e0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f2f0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
f300: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
f310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
f320: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f330: 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
f340: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f350: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
f360: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f370: 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
f380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f390: 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
f3a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f3b0: 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
f3c0: 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
f3d0: 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
f3e0: 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
f3f0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
f400: 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
f410: 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
f420: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
f430: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
f440: 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
f450: 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
f460: 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
f470: 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
f480: 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
f490: 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
f4a0: 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
f4b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
f4c0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
f4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
f4e0: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
f4f0: 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
f500: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f510: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
f520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f530: 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
f540: 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
f550: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
f560: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
f570: 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
f580: 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
f590: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
f5a0: 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
f5b0: 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
f5c0: 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
f5d0: 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
f5e0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f5f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f600: 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
f610: 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
f620: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
f630: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
f640: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
f650: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
f660: 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
f670: 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
f680: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
f690: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
f6a0: 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
f6b0: 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
f6c0: 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
f6d0: 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
f6e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f6f0: 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
f700: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
f710: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
f720: 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
f730: 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
f740: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
f750: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f760: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
f770: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
f780: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f790: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f7a0: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
f7b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f7c0: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
f7d0: 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
f7e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
f7f0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
f800: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
f810: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f820: 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
f830: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f840: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
f850: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
f860: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
f870: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
f880: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
f890: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f8a0: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
f8b0: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
f8c0: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
f8d0: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
f8e0: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
f8f0: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
f900: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
f910: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
f920: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
f930: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
f940: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f950: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
f960: 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
f970: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f980: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
f990: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
f9a0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
f9b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
f9c0: 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
f9d0: 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
f9e0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
f9f0: 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
fa00: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
fa10: 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
fa20: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
fa30: 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
fa40: 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
fa50: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
fa60: 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
fa70: 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
fa80: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
fa90: 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
faa0: 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
fab0: 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
fac0: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
fad0: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
fae0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
faf0: 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
fb00: 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
fb10: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
fb20: 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
fb30: 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
fb40: 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
fb50: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
fb60: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
fb70: 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
fb80: 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
fb90: 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
fba0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
fbb0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
fbc0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
fbd0: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
fbe0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
fbf0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
fc00: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
fc10: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fc20: 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
fc30: 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
fc40: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fc50: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fc60: 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
fc70: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
fc80: 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
fc90: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
fca0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
fcb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
fcc0: 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
fcd0: 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
fce0: 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
fcf0: 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
fd00: 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
fd10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
fd20: 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
fd30: 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
fd40: 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
fd50: 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
fd60: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
fd70: 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
fd80: 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
fd90: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
fda0: 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
fdb0: 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
fdc0: 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
fdd0: 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
fde0: 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
fdf0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
fe00: 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
fe10: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
fe20: 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
fe30: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
fe40: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
fe50: 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
fe60: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
fe70: 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
fe80: 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
fe90: 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
fea0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
feb0: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
fec0: 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
fed0: 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
fee0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
fef0: 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
ff00: 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
ff10: 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
ff20: 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
ff30: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
ff40: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
ff50: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
ff60: 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
ff70: 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
ff80: 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
ff90: 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
ffa0: 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
ffb0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
ffc0: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
ffd0: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
ffe0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
fff0: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
10000 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
10010 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
10020 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
10030 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
10040 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
10050 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
10060 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10070 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
10080 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
10090 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
100a0 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
100b0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
100c0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
100d0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
100e0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
100f0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
10100 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
10110 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
10120 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
10130 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
10140 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
10150 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
10160 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
10170 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
10180 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
10190 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
101a0 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
101b0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
101c0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
101d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
101e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
101f0 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
10200 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
10210 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
10220 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
10230 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
10240 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
10250 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
10260 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
10270 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
10280 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
10290 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
102a0 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
102b0 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
102c0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
102d0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
102e0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
102f0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
10300 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
10310 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
10320 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
10330 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
10340 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
10350 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
10360 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
10370 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
10380 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
10390 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
103a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
103b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
103c0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
103d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
103e0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
103f0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
10400 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
10410 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
10420 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
10430 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
10440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10450 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10460 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10470 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10480 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
10490 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
104a0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
104b0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
104c0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
104d0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
104e0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
104f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
10500 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
10510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10520 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
10530 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
10540 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10550 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
10560 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
10570 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
10580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10590 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
105a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
105b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
105c0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
105d0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
105e0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
105f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10600 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
10610 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10620 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
10630 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
10640 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
10650 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10660 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10670 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
10680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10690 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
106a0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
106b0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
106c0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
106d0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
106e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
106f0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10700 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
10710 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
10720 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
10730 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10740 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
10750 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
10760 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
10770 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
10780 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
10790 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
107a0 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
107b0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
107c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
107d0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
107e0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
107f0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
10800 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
10810 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
10820 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
10830 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
10850 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10860 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
10870 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
10880 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
10890 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
108a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
108b0 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
108c0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
108d0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
108e0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
108f0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
10900 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
10910 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
10920 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
10930 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
10940 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
10950 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
10960 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10970 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
10980 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
10990 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
109a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
109b0 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
109c0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
109d0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
109e0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
109f0 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
10a00 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
10a10 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
10a20 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
10a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10a40 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
10a50 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
10a60 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
10a70 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
10a80 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
10a90 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
10aa0 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
10ab0 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
10ac0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
10ad0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
10ae0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
10af0 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
10b00 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
10b10 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
10b20 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
10b30 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
10b40 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
10b50 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
10b60 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20  p->zErrMsg, db, 
10b70 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e  "FOREIGN KEY con
10b80 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29  straint failed")
10b90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10ba0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
10bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10bc0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
10bd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10be0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68  is called the wh
10bf0 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20  en a VDBE tries 
10c00 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65  to halt.  If the
10c10 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64   VDBE.** has mad
10c20 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73  e changes and is
10c30 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d   in autocommit m
10c40 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74  ode, then commit
10c50 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65   those.** change
10c60 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63  s.  If a rollbac
10c70 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65  k is needed, the
10c80 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  n do the rollbac
10c90 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
10ca0 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c  utine is the onl
10cb0 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68  y way to move th
10cc0 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20  e state of a VM 
10cd0 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  from.** SQLITE_M
10ce0 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49  AGIC_RUN to SQLI
10cf0 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20  TE_MAGIC_HALT.  
10d00 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74  It is harmless t
10d10 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f  o.** call this o
10d20 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69  n a VM that is i
10d30 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47  n the SQLITE_MAG
10d40 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a  IC_HALT state..*
10d50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65  *.** Return an e
10d60 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74  rror code.  If t
10d70 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20  he commit could 
10d80 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63  not complete bec
10d90 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20  ause of.** lock 
10da0 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75  contention, retu
10db0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
10dc0 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   If SQLITE_BUSY 
10dd0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a  is returned, it.
10de0 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f  ** means the clo
10df0 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65  se did not happe
10e00 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  n and needs to b
10e10 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69  e repeated..*/.i
10e20 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  nt sqlite3VdbeHa
10e30 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  lt(Vdbe *p){.  i
10e40 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e60 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * Used to store 
10e70 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e  transient return
10e80 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69   codes */.  sqli
10e90 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
10ea0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
10eb0 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  tion contains th
10ec0 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74  e logic that det
10ed0 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61  ermines if a sta
10ee0 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74  tement or.  ** t
10ef0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
10f00 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
10f10 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
10f20 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20   result of the. 
10f30 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66   ** execution of
10f40 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61   this virtual ma
10f50 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a  chine. .  **.  *
10f60 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
10f70 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73  following errors
10f80 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a   occur:.  **.  *
10f90 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  *     SQLITE_NOM
10fa0 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  EM.  **     SQLI
10fb0 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20  TE_IOERR.  **   
10fc0 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20    SQLITE_FULL.  
10fd0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e  **     SQLITE_IN
10fe0 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a  TERRUPT.  **.  *
10ff0 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72  * Then the inter
11000 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20  nal cache might 
11010 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69  have been left i
11020 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
11030 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57  t.  ** state.  W
11040 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e need to rollba
11050 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
11060 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
11070 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f   there is.  ** o
11080 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c  ne, or the compl
11090 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ete transaction 
110a0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
110b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
110c0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66  tion..  */..  if
110d0 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
110e0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
110f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11100 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  M;.  }.  if( p->
11110 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73  aOnceFlag ) mems
11120 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  et(p->aOnceFlag,
11130 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67   0, p->nOnceFlag
11140 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72  );.  closeAllCur
11150 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70  sors(p);.  if( p
11160 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41  ->magic!=VDBE_MA
11170 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72  GIC_RUN ){.    r
11180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11190 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69  .  }.  checkActi
111a0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a  veVdbeCnt(db);..
111b0 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f    /* No commit o
111c0 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65  r rollback neede
111d0 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d if the program
111e0 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f   never started o
111f0 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51  r if the.  ** SQ
11200 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73  L statement does
11210 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69   not read or wri
11220 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69  te a database fi
11230 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  le.  */.  if( p-
11240 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73  >pc>=0 && p->bIs
11250 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e  Reader ){.    in
11260 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d  t mrc;   /* Prim
11270 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66  ary error code f
11280 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20  rom p->rc */.   
11290 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f   int eStatementO
112a0 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
112b0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20  sSpecialError;  
112c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
112d0 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73   to true if a 's
112e0 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f  pecial' error */
112f0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c  ..    /* Lock al
11300 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79  l btrees used by
11310 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a   the statement *
11320 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
11330 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20  eEnter(p);..    
11340 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65  /* Check for one
11350 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11360 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72  errors */.    mr
11370 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66  c = p->rc & 0xff
11380 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
11390 3e 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52  >rc!=SQLITE_IOER
113a0 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 20 20 2f 2a  R_BLOCKED );  /*
113b0 20 54 68 69 73 20 65 72 72 6f 72 20 6e 6f 20 6c   This error no l
113c0 6f 6e 67 65 72 20 65 78 69 73 74 73 20 2a 2f 0a  onger exists */.
113d0 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
113e0 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
113f0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
11400 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11430 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
11440 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
11450 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
11460 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
11470 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
11480 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
11490 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
114a0 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
114b0 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
114c0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
114d0 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
114e0 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
114f0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
11500 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
11510 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
11520 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
11530 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
11540 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
11550 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11560 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
11570 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
11580 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
11590 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
115a0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
115b0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
115c0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
115d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
115e0 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
115f0 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
11600 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
11610 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
11620 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
11630 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
11640 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
11650 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
11660 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
11670 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
11680 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
11690 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
116a0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
116b0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
116c0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
116d0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
116e0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
116f0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
11700 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
11710 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
11720 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
11730 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
11740 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
11750 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
11760 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
11770 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
11780 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
11790 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
117a0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
117b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
117c0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
117d0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
117e0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
117f0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
11800 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
11810 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
11820 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
11830 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
11840 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
11850 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
11860 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
11870 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
11880 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
11890 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
118b0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
118c0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
118d0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
118e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
118f0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
11900 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
11910 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
11920 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
11930 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
11940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11950 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
11960 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
11970 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
11980 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
11990 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
119a0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
119b0 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
119c0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
119d0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
119e0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
119f0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
11a00 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
11a10 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
11a20 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
11a30 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
11a40 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
11a50 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
11a60 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
11a70 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
11a80 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
11a90 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
11aa0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
11ab0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
11ac0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
11ad0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
11ae0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
11af0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
11b00 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
11b10 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
11b20 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
11b30 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
11b40 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
11b50 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
11b60 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11b70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11b80 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
11b90 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
11ba0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11bb0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
11bc0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11bd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11be0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11bf0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11c00 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
11c10 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
11c20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
11c30 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
11c40 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
11c50 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
11c60 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
11c70 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
11c80 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
11c90 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
11ca0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
11cb0 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
11cc0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
11cd0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
11ce0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
11cf0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
11d00 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
11d10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
11d20 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
11d30 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
11d40 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
11d50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11d70 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
11d80 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
11d90 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
11da0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
11db0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
11dc0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
11dd0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
11de0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11df0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
11e00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
11e10 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
11e20 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
11e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11e40 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
11e50 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  dCons = 0;.     
11e60 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
11e70 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
11e80 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
11e90 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
11ea0 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20  ferFKs;.        
11eb0 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49    sqlite3CommitI
11ec0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64  nternalChanges(d
11ed0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  b);.        }.  
11ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11ef0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11f00 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11f10 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _OK);.      }.  
11f20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
11f30 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nt = 0;.    }els
11f40 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74  e if( eStatement
11f50 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  Op==0 ){.      i
11f60 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11f70 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41  _OK || p->errorA
11f80 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29  ction==OE_Fail )
11f90 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
11fa0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
11fb0 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20  NT_RELEASE;.    
11fc0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65    }else if( p->e
11fd0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41  rrorAction==OE_A
11fe0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
11ff0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
12000 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12010 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
12020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12030 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12040 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12050 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  BACK);.        s
12060 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
12070 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
12080 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
12090 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
120a0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
120b0 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69  f eStatementOp i
120c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
120d0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
120e0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
120f0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d  o.    ** be comm
12100 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
12110 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74  back. Call sqlit
12120 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12130 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ment() to.    **
12140 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20   do so. If this 
12150 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e  operation return
12160 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  s an error, and 
12170 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
12180 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72  ement.    ** err
12190 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54  or code is SQLIT
121a0 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43  E_OK or SQLITE_C
121b0 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20  ONSTRAINT, then 
121c0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20  promote the.    
121d0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  ** current state
121e0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e  ment error code.
121f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12200 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a  eStatementOp ){.
12210 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12220 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12230 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65  ment(p, eStateme
12240 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ntOp);.      if(
12250 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69   rc ){.        i
12260 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12270 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78  _OK || (p->rc&0x
12280 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
12290 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20  TRAINT ){.      
122a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
122b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
122c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
122d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20  ErrMsg);.       
122e0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
122f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
12300 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
12310 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
12320 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
12330 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
12340 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
12350 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12360 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
12370 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12380 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
12390 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52  his was an INSER
123a0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
123b0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65  ETE and no state
123c0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
123d0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
123e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70   rolled back, up
123f0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
12400 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61  e connection cha
12410 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20  nge-counter. .  
12420 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
12430 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20  changeCntOn ){. 
12440 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d       if( eStatem
12450 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54  entOp!=SAVEPOINT
12460 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12480 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70  SetChanges(db, p
12490 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20  ->nChange);.    
124a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
124b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
124c0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20  hanges(db, 0);. 
124d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
124e0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
124f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61   }..    /* Relea
12500 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a  se the locks */.
12510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
12520 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20  eave(p);.  }..  
12530 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65  /* We have succe
12540 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61  ssfully halted a
12550 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d  nd closed the VM
12560 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66  .  Record this f
12570 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  act. */.  if( p-
12580 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62  >pc>=0 ){.    db
12590 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b  ->nVdbeActive--;
125a0 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61  .    if( !p->rea
125b0 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62  dOnly ) db->nVdb
125c0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66  eWrite--;.    if
125d0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
125e0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d   db->nVdbeRead--
125f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12600 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64  ->nVdbeActive>=d
12610 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12620 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12630 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e  nVdbeRead>=db->n
12640 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20  VdbeWrite );.   
12650 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
12660 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20  beWrite>=0 );.  
12670 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
12680 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a  DBE_MAGIC_HALT;.
12690 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
126a0 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20  eCnt(db);.  if( 
126b0 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
126c0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
126d0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
126e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
126f0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
12700 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ag is set to tru
12710 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b  e, then any lock
12720 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64  s that were held
12730 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74  .  ** by connect
12740 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20  ion db have now 
12750 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43  been released. C
12760 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  all sqlite3Conne
12770 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20  ctionUnlocked() 
12780 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20  .  ** to invoke 
12790 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c  any required unl
127a0 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
127b0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  acks..  */.  if(
127c0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
127d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
127e0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64  nnectionUnlocked
127f0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  (db);.  }..  ass
12800 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
12810 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75  tive>0 || db->au
12820 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64  toCommit==0 || d
12830 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30  b->nStatement==0
12840 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d   );.  return (p-
12850 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  >rc==SQLITE_BUSY
12860 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
12870 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a   SQLITE_OK);.}..
12880 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45  ./*.** Each VDBE
12890 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c   holds the resul
128a0 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  t of the most re
128b0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65  cent sqlite3_ste
128c0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70  p() call.** in p
128d0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74  ->rc.  This rout
128e0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65  ine sets that re
128f0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c  sult back to SQL
12900 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20  ITE_OK..*/.void 
12910 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
12920 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20  StepResult(Vdbe 
12930 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53  *p){.  p->rc = S
12940 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
12950 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f  ** Copy the erro
12960 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72  r code and error
12970 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69   message belongi
12980 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70  ng to the VDBE p
12990 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
129a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
129b0 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68  o its database h
129c0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74  andle (so that t
129d0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20  hey will be .** 
129e0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c  returned by call
129f0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72  s to sqlite3_err
12a00 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74  code() and sqlit
12a10 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a  e3_errmsg())..**
12a20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12a30 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72  n does not clear
12a40 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20   the VDBE error 
12a50 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c  code or message,
12a60 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20   just.** copies 
12a70 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61  them to the data
12a80 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
12a90 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54  int sqlite3VdbeT
12aa0 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62  ransferError(Vdb
12ab0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
12ac0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
12ad0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
12ae0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67    if( p->zErrMsg
12af0 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f   ){.    u8 mallo
12b00 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61  cFailed = db->ma
12b10 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
12b20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
12b30 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12b40 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
12b50 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
12b60 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
12b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12b80 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
12b90 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
12ba0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
12bb0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
12bc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
12bd0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12be0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
12bf0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61  ailed = mallocFa
12c00 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72  iled;.    db->er
12c10 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
12c20 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
12c30 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
12c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12c50 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
12c60 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
12c70 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
12c80 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
12c90 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
12ca0 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
12cb0 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
12cc0 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
12cd0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
12ce0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
12cf0 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
12d00 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12d10 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
12d20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
12d30 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
12d40 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
12d50 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
12d60 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
12d70 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
12d80 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
12d90 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
12da0 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
12db0 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
12dc0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
12dd0 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
12de0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
12df0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
12e00 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
12e10 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
12e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
12e30 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
12e40 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
12e50 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
12e60 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
12e70 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
12e80 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
12e90 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
12ea0 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
12eb0 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
12ec0 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
12ed0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
12ee0 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
12ef0 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
12f00 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
12f10 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
12f20 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
12f30 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
12f40 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
12f50 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
12f60 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
12f70 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
12f80 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
12f90 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
12fa0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
12fb0 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
12fc0 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
12fd0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
12fe0 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
12ff0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
13000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13010 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
13020 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
13030 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
13040 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
13050 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
13060 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
13070 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
13080 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
13090 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
130a0 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
130b0 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
130c0 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
130d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
130e0 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
130f0 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
13100 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
13110 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
13120 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
13130 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
13140 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
13150 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
13160 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
13170 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
13180 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
13190 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
131a0 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
131b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
131c0 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
131d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
131e0 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
131f0 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
13200 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
13210 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
13220 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
13230 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
13240 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
13250 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
13260 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
13270 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
13280 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
13290 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
132a0 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
132b0 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
132c0 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
132d0 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
132e0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
132f0 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
13300 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
13310 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
13320 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
13330 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
13340 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
13350 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
13360 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
13370 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
13380 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
13390 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
133a0 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
133b0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
133c0 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 63  3Error(db, p->rc
133d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
133e0 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
133f0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
13400 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
13410 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
13420 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
13430 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
13440 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
13450 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
13460 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
13470 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
13480 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
13490 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
134a0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
134b0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
134c0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
134d0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
134e0 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
134f0 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
13500 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
13510 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13520 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
13530 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
13540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13550 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
13560 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
13570 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
13580 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13590 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
135a0 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
135b0 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
135c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
135d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
135e0 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
135f0 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
13600 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
13610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
13620 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
13630 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
13640 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
13650 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
13660 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
13670 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
13680 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
13690 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
136a0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
136b0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
136c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
136d0 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
136e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
136f0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
13700 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
13710 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
13720 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
13730 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
13740 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
13750 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
13760 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
13770 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
13780 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
13790 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
137a0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
137b0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
137c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
137d0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
137e0 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
137f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13800 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
13810 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
13820 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20  p->iCurrentTime 
13830 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = 0;.  p->magic 
13840 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
13850 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
13860 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
13870 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
13880 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
13890 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
138a0 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
138b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
138c0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
138d0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
138e0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
138f0 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
13900 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
13910 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
13920 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
13930 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13940 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
13950 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
13960 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
13970 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
13980 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
13990 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
139a0 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
139b0 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
139c0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
139d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
139e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
139f0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
13a00 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
13a10 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
13a20 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
13a30 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
13a40 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
13a50 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
13a60 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
13a70 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
13a80 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
13a90 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
13aa0 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
13ab0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
13ac0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
13ad0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
13ae0 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
13af0 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
13b00 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
13b10 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
13b20 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
13b30 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
13b40 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
13b50 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
13b60 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
13b70 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
13b80 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
13b90 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
13ba0 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
13bb0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
13bc0 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
13bd0 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
13be0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
13bf0 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
13c00 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
13c10 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
13c20 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
13c30 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
13c40 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
13c50 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
13c60 72 72 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20  rrsponds to bit 
13c70 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64  0 etc.)..*/.void
13c80 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
13c90 74 65 41 75 78 44 61 74 61 28 56 64 62 65 20 2a  teAuxData(Vdbe *
13ca0 70 56 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20  pVdbe, int iOp, 
13cb0 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78  int mask){.  Aux
13cc0 44 61 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64  Data **pp = &pVd
13cd0 62 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20  be->pAuxData;.  
13ce0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
13cf0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
13d00 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
13d10 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
13d20 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
13d30 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
13d40 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
13d50 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
13d60 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
13d70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
13d80 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
13d90 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
13da0 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
13db0 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
13dc0 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
13dd0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
13de0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
13df0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13e00 65 28 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75  e(pVdbe->db, pAu
13e10 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
13e20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e       pp= &pAux->
13e30 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
13e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
13e50 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ll memory associ
13e60 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64  ated with the Vd
13e70 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
13e80 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13e90 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20  ,.** except for 
13ea0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77  object itself, w
13eb0 68 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65  hich is preserve
13ec0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  d..**.** The dif
13ed0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
13ee0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
13ef0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
13f00 65 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a  ete() is that.**
13f10 20 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c   VdbeDelete() al
13f20 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56  so unlinks the V
13f30 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  dbe from the lis
13f40 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61  t of VMs associa
13f50 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
13f60 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13f70 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68  ion and frees th
13f80 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e  e object itself.
13f90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13fa0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
13fb0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62  sqlite3 *db, Vdb
13fc0 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67  e *p){.  SubProg
13fd0 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78  ram *pSub, *pNex
13fe0 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  t;.  int i;.  as
13ff0 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c  sert( p->db==0 |
14000 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20  | p->db==db );. 
14010 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
14020 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61  (p->aVar, p->nVa
14030 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  r);.  releaseMem
14040 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
14050 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
14060 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66  *COLNAME_N);.  f
14070 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67  or(pSub=p->pProg
14080 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d  ram; pSub; pSub=
14090 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
140a0 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b  t = pSub->pNext;
140b0 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41  .    vdbeFreeOpA
140c0 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61  rray(db, pSub->a
140d0 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a  Op, pSub->nOp);.
140e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
140f0 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d  e(db, pSub);.  }
14100 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61  .  for(i=p->nzVa
14110 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20  r-1; i>=0; i--) 
14120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14130 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a  , p->azVar[i]);.
14140 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
14150 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d  y(db, p->aOp, p-
14160 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  >nOp);.  sqlite3
14170 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
14180 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  olName);.  sqlit
14190 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
141a0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
141b0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46  DbFree(db, p->pF
141c0 72 65 65 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  ree);.#if define
141d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
141e0 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20  TREE_EXPLAIN).  
141f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14200 2c 20 70 2d 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a  , p->zExplain);.
14210 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14220 64 62 2c 20 70 2d 3e 70 45 78 70 6c 61 69 6e 29  db, p->pExplain)
14230 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14240 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
14250 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64  re VDBE..*/.void
14260 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
14270 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  te(Vdbe *p){.  s
14280 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
14290 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
142a0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
142b0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
142c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
142d0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
142e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
142f0 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70  learObject(db, p
14300 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
14310 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65  v ){.    p->pPre
14320 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
14330 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
14340 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56    assert( db->pV
14350 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62  dbe==p );.    db
14360 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65  ->pVdbe = p->pNe
14370 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  xt;.  }.  if( p-
14380 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d  >pNext ){.    p-
14390 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
143a0 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20  p->pPrev;.  }.  
143b0 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
143c0 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d  MAGIC_DEAD;.  p-
143d0 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >db = 0;.  sqlit
143e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
143f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14400 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
14410 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
14420 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
14430 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
14440 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
14450 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
14460 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
14470 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
14480 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
14490 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
144a0 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
144b0 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
144c0 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
144d0 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
144e0 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
144f0 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
14500 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
14510 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
14520 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
14530 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
14540 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
14550 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
14560 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
14570 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
14580 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
14590 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
145a0 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
145b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
145c0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
145d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
145e0 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
145f0 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
14600 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
14610 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
14620 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
14630 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
14640 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
14650 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
14660 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
14670 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
14680 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14690 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 73  o ){.    int res
146a0 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
146b0 49 54 45 5f 54 45 53 54 0a 20 20 20 20 65 78 74  ITE_TEST.    ext
146c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
146d0 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65  search_count;.#e
146e0 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
146f0 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
14700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14710 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
14720 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30  ed(p->pCursor, 0
14730 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65  , p->movetoTarge
14740 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 20  t, 0, &res);.   
14750 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14760 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74   rc;.    p->last
14770 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f 76 65 74  Rowid = p->movet
14780 6f 54 61 72 67 65 74 3b 0a 20 20 20 20 69 66 28  oTarget;.    if(
14790 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
147a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
147b0 42 4b 50 54 3b 0a 20 20 20 20 70 2d 3e 72 6f 77  BKPT;.    p->row
147c0 69 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23  idIsValid = 1;.#
147d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
147e0 54 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65  T.    sqlite3_se
147f0 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65  arch_count++;.#e
14800 6e 64 69 66 0a 20 20 20 20 70 2d 3e 64 65 66 65  ndif.    p->defe
14810 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
14820 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74      p->cacheStat
14830 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
14840 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
14850 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
14860 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 20  int hasMoved;.  
14870 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
14880 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
14890 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72  Moved(p->pCursor
148a0 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 20  , &hasMoved);.  
148b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
148c0 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 61  n rc;.    if( ha
148d0 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 20  sMoved ){.      
148e0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
148f0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
14900 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64      if( hasMoved
14910 3d 3d 32 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  ==2 ) p->nullRow
14920 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
14930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14940 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
14950 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
14960 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
14970 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
14980 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
14990 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
149a0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
149b0 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
149c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
149d0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
149e0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
149f0 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
14a00 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
14a10 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
14a20 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
14a30 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
14a40 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
14a50 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
14a60 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
14a70 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
14a80 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
14a90 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
14aa0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
14ab0 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
14ac0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
14ad0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
14ae0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
14af0 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
14b00 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
14b10 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
14b20 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
14b30 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
14b40 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
14b50 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
14b60 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
14b70 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
14b80 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
14b90 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
14ba0 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
14bb0 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
14bc0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
14bd0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
14be0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
14bf0 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
14c00 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
14c10 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
14c20 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
14c30 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
14c40 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
14c50 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
14c60 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
14c70 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
14c80 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
14c90 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
14ca0 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
14cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
14cd0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
14ce0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
14d10 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
14d40 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
14d50 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
14d60 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
14d70 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
14d80 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
14db0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
14dc0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
14de0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
14df0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
14e00 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
14e10 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
14e20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
14e30 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
14e60 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
14e70 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
14e80 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
14e90 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
14ea0 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
14ed0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
14ee0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
14f10 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
14f20 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f40 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
14f50 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
14f60 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
14f70 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
14f80 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
14f90 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
14fa0 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
14fb0 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
14fc0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
14fd0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
14fe0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
14ff0 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
15000 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
15010 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
15020 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
15030 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
15040 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
15050 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
15060 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
15070 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
15080 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
15090 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
150a0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
150b0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
150c0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
150d0 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
150e0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
150f0 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
15100 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15110 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
15120 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
15130 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
15140 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
15150 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
15160 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
15170 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
15180 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
15190 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
151a0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
151b0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
151c0 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58       if( i<(-MAX
151d0 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e  _6BYTE) ) return
151e0 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65   6;.      /* Pre
151f0 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65  vious test preve
15200 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32  nts:  u = -(-922
15210 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
15220 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d  ) */.      u = -
15230 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
15240 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
15250 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
15260 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
15270 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c  ((i&1)==i && fil
15280 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38  e_format>=4) ? 8
15290 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20  +(u32)u : 1;.   
152a0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32   }.    if( u<=32
152b0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a  767 ) return 2;.
152c0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
152d0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20  07 ) return 3;. 
152e0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
152f0 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b  3647 ) return 4;
15300 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f  .    if( u<=MAX_
15310 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35  6BYTE ) return 5
15320 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
15330 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
15340 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
15350 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20  return 7;.  }.  
15360 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62  assert( pMem->db
15370 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
15380 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72  | flags&(MEM_Str
15390 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20  |MEM_Blob) );.  
153a0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e  assert( pMem->n>
153b0 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32  =0 );.  n = (u32
153c0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20  )pMem->n;.  if( 
153d0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
153e0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65   ){.    n += pMe
153f0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a  m->u.nZero;.  }.
15400 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
15410 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
15420 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
15430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15440 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
15450 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
15460 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
15470 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
15480 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
15490 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
154a0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
154b0 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
154c0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72  ype>=12 ){.    r
154d0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
154e0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
154f0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
15500 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d  nst u8 aSize[] =
15510 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34   { 0, 1, 2, 3, 4
15520 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c  , 6, 8, 8, 0, 0,
15530 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74   0, 0 };.    ret
15540 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c  urn aSize[serial
15550 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _type];.  }.}../
15560 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f  *.** If we are o
15570 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72  n an architectur
15580 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64  e with mixed-end
15590 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a  ian floating .**
155a0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d   points (ex: ARM
155b0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65  7) then swap the
155c0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77   lower 4 bytes w
155d0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65  ith the .** uppe
155e0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75  r 4 bytes.  Retu
155f0 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
15600 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72  *.** For most ar
15610 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69  chitectures, thi
15620 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s is a no-op..**
15630 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74  .** (later):  It
15640 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
15650 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65  me that the mixe
15660 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d  d-endian problem
15670 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61  .** on ARM7 is a
15680 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43  n issue with GCC
15690 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41  , not with the A
156a0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65  RM7 chip.  It se
156b0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c  ems.** that earl
156c0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  y versions of GC
156d0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f  C stored the two
156e0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62   words of a 64-b
156f0 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74  it.** float in t
15700 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20  he wrong order. 
15710 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20   And that error 
15720 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61  has been propaga
15730 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63  ted.** ever sinc
15740 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73  e.  The blame is
15750 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
15760 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67   with GCC, thoug
15770 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20  h..** GCC might 
15780 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e  have just copyin
15790 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72  g the problem fr
157a0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69  om a prior compi
157b0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73  ler..** I am als
157c0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65  o told that newe
157d0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43  r versions of GC
157e0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20  C that follow a 
157f0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49  different.** ABI
15800 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72   get the byte or
15810 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a  der right..**.**
15820 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e   Developers usin
15830 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41  g SQLite on an A
15840 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69  RM7 should compi
15850 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72  le and run their
15860 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  .** application 
15870 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44  using -DSQLITE_D
15880 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20  EBUG=1 at least 
15890 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55  once.  With DEBU
158a0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f  G.** enabled, so
158b0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77  me asserts below
158c0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61   will ensure tha
158d0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72  t the byte order
158e0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20   of.** floating 
158f0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20  point values is 
15900 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28  correct..**.** (
15910 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61  2007-08-30)  Fra
15920 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20  nk van Vugt has 
15930 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f  studied this pro
15940 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20  blem closely.** 
15950 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73  and has send his
15960 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65   findings to the
15970 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65   SQLite develope
15980 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72  rs.  Frank.** wr
15990 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c  ites that some L
159a0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66  inux kernels off
159b0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  er floating poin
159c0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d  t hardware.** em
159d0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65  ulation that use
159e0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61  s only 32-bit ma
159f0 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20  ntissas instead 
15a00 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38  of a full .** 48
15a10 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65  -bits as require
15a20 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74  d by the IEEE st
15a30 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69  andard.  (This i
15a40 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f  s the.** CONFIG_
15a50 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69  FPE_FASTFPE opti
15a60 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79  on.)  On such sy
15a70 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20  stems, floating 
15a80 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77  point.** byte sw
15a90 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76  apping becomes v
15aa0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e  ery complicated.
15ab0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c    To avoid probl
15ac0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65  ems,.** the nece
15ad0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70  ssary byte swapp
15ae0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f  ing is carried o
15af0 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69  ut using a 64-bi
15b00 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74  t integer.** rat
15b10 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69  her than a 64-bi
15b20 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20  t float.  Frank 
15b30 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20  assures us that 
15b40 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  the code here.**
15b50 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20   works for him. 
15b60 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70   We, the develop
15b70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79  ers, have no way
15b80 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c   to independentl
15b90 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73  y.** verify this
15ba0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d  , but Frank seem
15bb0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68  s to know what h
15bc0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f  e is talking abo
15bd0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73  ut.** so we trus
15be0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66  t him..*/.#ifdef
15bf0 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
15c00 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
15c10 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61  .static u64 floa
15c20 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20  tSwap(u64 in){. 
15c30 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34   union {.    u64
15c40 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d   r;.    u32 i[2]
15c50 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74  ;.  } u;.  u32 t
15c60 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20  ;..  u.r = in;. 
15c70 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75   t = u.i[0];.  u
15c80 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a  .i[0] = u.i[1];.
15c90 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20    u.i[1] = t;.  
15ca0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20  return u.r;.}.# 
15cb0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64  define swapMixed
15cc0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20  EndianFloat(X)  
15cd0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29  X = floatSwap(X)
15ce0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
15cf0 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
15d00 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a  loat(X).#endif..
15d10 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
15d20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20  serialized data 
15d30 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c  blob for the val
15d40 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65  ue stored in pMe
15d50 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20  m into .** buf. 
15d60 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
15d70 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
15d80 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66  s allocated suff
15d90 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a  icient space..**
15da0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
15db0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
15dc0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20  ten..**.** nBuf 
15dd0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  is the amount of
15de0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62   space left in b
15df0 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65  uf[].  The calle
15e00 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
15e10 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  .** for allocati
15e20 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ng enough space 
15e30 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64  to buf[] to hold
15e40 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c   the entire fiel
15e50 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  d, exclusive.** 
15e60 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e  of the pMem->u.n
15e70 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61  Zero bytes for a
15e80 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e   MEM_Zero value.
15e90 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
15ea0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15eb0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74  s actually writt
15ec0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20  en into buf[].  
15ed0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  The number.** of
15ee0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65   bytes in the ze
15ef0 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69  ro-filled tail i
15f00 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  s included in th
15f10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
15f20 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20  nly.** if those 
15f30 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65  bytes were zeroe
15f40 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a  d in buf[]..*/ .
15f50 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
15f60 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66  erialPut(u8 *buf
15f70 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32  , Mem *pMem, u32
15f80 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
15f90 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20   u32 len;..  /* 
15fa0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c  Integer and Real
15fb0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
15fc0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69  _type<=7 && seri
15fd0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20  al_type>0 ){.   
15fe0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20   u64 v;.    u32 
15ff0 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61  i;.    if( seria
16000 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
16010 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16020 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65  f(v)==sizeof(pMe
16030 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  m->r) );.      m
16040 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
16050 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  >r, sizeof(v));.
16060 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
16070 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
16080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16090 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
160a0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
160b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   = sqlite3VdbeSe
160c0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
160d0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68  al_type);.    wh
160e0 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20  ile( i-- ){.    
160f0 20 20 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28    buf[i] = (u8)(
16100 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
16110 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20   >>= 8;.    }.  
16120 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16130 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f  }..  /* String o
16140 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20  r blob */.  if( 
16150 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
16160 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16170 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d  Mem->n + ((pMem-
16180 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
16190 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  o)?pMem->u.nZero
161a0 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0).            
161b0 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33   == (int)sqlite3
161c0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
161d0 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29  n(serial_type) )
161e0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d  ;.    len = pMem
161f0 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ->n;.    memcpy(
16200 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65  buf, pMem->z, le
16210 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  n);.    return l
16220 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55  en;.  }..  /* NU
16230 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  LL or constants 
16240 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75  0 or 1 */.  retu
16250 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75  rn 0;.}../* Inpu
16260 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65  t "x" is a seque
16270 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20  nce of unsigned 
16280 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
16290 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62  represent a.** b
162a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
162b0 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65  r.  Return the e
162c0 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65  quivalent native
162d0 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66   integer.*/.#def
162e0 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  ine ONE_BYTE_INT
162f0 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b  (x)    ((i8)(x)[
16300 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f  0]).#define TWO_
16310 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28  BYTE_INT(x)    (
16320 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  256*(i8)((x)[0])
16330 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65  |(x)[1]).#define
16340 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
16350 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28  x)  (65536*(i8)(
16360 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c  (x)[0])|((x)[1]<
16370 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66  <8)|(x)[2]).#def
16380 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ine FOUR_BYTE_UI
16390 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78  NT(x)  (((u32)(x
163a0 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31  )[0]<<24)|((x)[1
163b0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
163c0 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
163d0 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
163e0 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
163f0 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
16400 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
16410 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
16420 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
16430 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
16440 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16450 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a  bytes read..*/ .
16460 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
16470 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73  erialGet(.  cons
16480 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
16490 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66  *buf,     /* Buf
164a0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69  fer to deseriali
164b0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32  ze from */.  u32
164c0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20   serial_type,   
164d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
164e0 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73  rial type to des
164f0 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65  erialize */.  Me
16500 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20  m *pMem         
16510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
16520 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72  emory cell to wr
16530 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a  ite value into *
16540 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a 20 20  /.){.  u64 x;.  
16550 75 33 32 20 79 3b 0a 20 20 73 77 69 74 63 68 28  u32 y;.  switch(
16560 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
16570 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
16580 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
16590 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
165a0 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
165b0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
165c0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
165d0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c  se 0: {  /* NULL
165e0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
165f0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
16600 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
16610 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
16620 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
16630 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
16640 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
16650 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
16660 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
16670 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
16680 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16690 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
166a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
166b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
166c0 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
166d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
166e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
166f0 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
16700 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
16710 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16720 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16730 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
16740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
16750 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16760 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
16770 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
16780 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
16790 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
167a0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
167b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
167c0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
167d0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
167e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
167f0 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
16800 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
16810 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
16820 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
16830 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16840 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  );.      pMem->u
16850 2e 69 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a  .i = (i64)*(int*
16860 29 26 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )&y;.      pMem-
16870 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
16880 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16890 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
168a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
168b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
168c0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
168d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
168e0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
168f0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
16900 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
16910 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
16920 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
16930 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
16940 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
16950 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
16960 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
16970 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
16980 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
16990 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
169a0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
169b0 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
169c0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
169d0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
169e0 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
169f0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
16a00 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
16a10 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
16a20 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
16a30 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
16a40 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
16a50 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
16a60 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
16a70 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
16a80 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
16a90 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a  LOAT is.      **
16aa0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
16ab0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
16ac0 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
16ad0 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
16ae0 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20    ** endian..   
16af0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74     */.      stat
16b00 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
16b10 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
16b20 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73  00)<<32;.      s
16b30 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62  tatic const doub
16b40 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20  le r1 = 1.0;.   
16b50 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
16b60 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
16b70 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
16b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
16b90 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
16ba0 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
16bb0 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
16bc0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
16bd0 66 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  f.      x = FOUR
16be0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b  _BYTE_UINT(buf);
16bf0 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
16c00 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29  BYTE_UINT(buf+4)
16c10 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
16c20 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69  32) | y;.      i
16c30 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
16c40 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  6 ){.        pMe
16c50 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
16c60 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  &x;.        pMem
16c70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16c80 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  t;.        testc
16c90 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
16ca0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
16cb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16cc0 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26   sizeof(x)==8 &&
16cd0 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29   sizeof(pMem->r)
16ce0 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==8 );.        s
16cf0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
16d00 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20  oat(x);.        
16d10 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c  memcpy(&pMem->r,
16d20 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
16d30 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  .        pMem->f
16d40 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
16d50 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d  NaN(pMem->r) ? M
16d60 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65  EM_Null : MEM_Re
16d70 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  al;.      }.    
16d80 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20    return 8;.    
16d90 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20  }.    case 8:   
16da0 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f   /* Integer 0 */
16db0 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20  .    case 9: {  
16dc0 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a  /* Integer 1 */.
16dd0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
16de0 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
16df0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
16e00 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
16e10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
16e20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
16e30 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
16e40 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
16e50 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
16e60 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
16e70 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
16e80 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28       u32 len = (
16e90 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
16ea0 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  2;.      pMem->z
16eb0 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
16ec0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
16ed0 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  len;.      pMem-
16ee0 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >xDel = 0;.     
16ef0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
16f00 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
16f10 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
16f20 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  n len;.    }.  }
16f30 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16f40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16f50 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  ne is used to al
16f60 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e  locate sufficien
16f70 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55  t space for an U
16f80 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a  npackedRecord.**
16f90 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65   structure large
16fa0 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73   enough to be us
16fb0 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56  ed with sqlite3V
16fc0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
16fd0 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73  ) if.** the firs
16fe0 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
16ff0 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e  pointer to KeyIn
17000 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65  fo structure pKe
17010 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  yInfo..**.** The
17020 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72   space is either
17030 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
17040 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17050 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69  Raw() or from wi
17060 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c  thin.** the unal
17070 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73  igned buffer pas
17080 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f  sed via the seco
17090 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67  nd and third arg
170a0 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62  uments (presumab
170b0 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63  ly.** stack spac
170c0 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65  e). If the forme
170d0 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20  r, then *ppFree 
170e0 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e  is set to a poin
170f0 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ter that should.
17100 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  ** be eventually
17110 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
17120 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ller using sqlit
17130 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20  e3DbFree(). Or, 
17140 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63  if the .** alloc
17150 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d  ation comes from
17160 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70   the pSpace/szSp
17170 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46  ace buffer, *ppF
17180 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ree is set to NU
17190 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74  LL.** before ret
171a0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
171b0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   an OOM error oc
171c0 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
171d0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63  turned..*/.Unpac
171e0 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74  kedRecord *sqlit
171f0 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
17200 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79  kedRecord(.  Key
17210 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17230 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  Description of t
17240 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  he record */.  c
17250 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20  har *pSpace,    
17260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17270 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63  * Unaligned spac
17280 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  e available */. 
17290 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20   int szSpace,   
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61   /* Size of pSpa
172c0 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f  ce[] in bytes */
172d0 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65  .  char **ppFree
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65     /* OUT: Calle
17300 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68  r should free th
17310 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b  is pointer */.){
17320 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
17330 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  d *p;           
17340 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72     /* Unpacked r
17350 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20  ecord to return 
17360 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20  */.  int nOff;  
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e       /* Incremen
17390 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66  t pSpace by nOff
173a0 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a   to align it */.
173b0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
173e0 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  ytes required fo
173f0 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65  r *p */..  /* We
17400 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74   want to shift t
17410 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63  he pointer pSpac
17420 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69  e up such that i
17430 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67  t is 8-byte alig
17440 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20  ned..  ** Thus, 
17450 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75  we need to calcu
17460 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f  late a value, nO
17470 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e  ff, between 0 an
17480 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20  d 7, to shift . 
17490 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70   ** it by.  If p
174a0 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79  Space is already
174b0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c   8-byte aligned,
174c0 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20   nOff should be 
174d0 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66  zero..  */.  nOf
174e0 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45  f = (8 - (SQLITE
174f0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61  _PTR_TO_INT(pSpa
17500 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20  ce) & 7)) & 7;. 
17510 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
17520 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52  sizeof(UnpackedR
17530 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66  ecord)) + sizeof
17540 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d  (Mem)*(pKeyInfo-
17550 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66  >nField+1);.  if
17560 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b  ( nByte>szSpace+
17570 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20  nOff ){.    p = 
17580 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
17590 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
175a0 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64  cRaw(pKeyInfo->d
175b0 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a  b, nByte);.    *
175c0 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a  ppFree = (char *
175d0 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29  )p;.    if( !p )
175e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
175f0 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70  se{.    p = (Unp
17600 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53  ackedRecord*)&pS
17610 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20  pace[nOff];.    
17620 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  *ppFree = 0;.  }
17630 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d  ..  p->aMem = (M
17640 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b  em*)&((char*)p)[
17650 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e  ROUND8(sizeof(Un
17660 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b  packedRecord))];
17670 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49  .  assert( pKeyI
17680 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
17690 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49  =0 );.  p->pKeyI
176a0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
176b0 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b    p->nField = pK
176c0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
176d0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   1;.  return p;.
176e0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
176f0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63  he nKey-byte enc
17700 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72  oding of a recor
17710 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70  d in pKey[], pop
17720 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e  ulate the .** Un
17730 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72  packedRecord str
17740 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
17750 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61   by the fourth a
17760 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65  rgument with the
17770 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
17780 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f  the decoded reco
17790 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  rd..*/ .void sql
177a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
177b0 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20  pack(.  KeyInfo 
177c0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f  *pKeyInfo,     /
177d0 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
177e0 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66  out the record f
177f0 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  ormat */.  int n
17800 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
17810 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
17820 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a   binary record *
17830 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
17840 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
17850 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
17860 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
17870 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50  ord *p      /* P
17880 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72  opulate this str
17890 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65  ucture before re
178a0 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20  turning. */.){. 
178b0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
178c0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
178d0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
178e0 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20  r *)pKey;.  int 
178f0 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20  d; .  u32 idx;  
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
17920 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61  in aKey[] to rea
17930 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20  d from */.  u16 
17940 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
17950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
17960 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
17970 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a  nter */.  u32 sz
17980 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  Hdr;.  Mem *pMem
17990 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70   = p->aMem;..  p
179a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30  ->default_rc = 0
179b0 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
179c0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
179d0 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20  (pMem) );.  idx 
179e0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
179f0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20  ey, szHdr);.  d 
17a00 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30  = szHdr;.  u = 0
17a10 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
17a20 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69  zHdr && u<p->nFi
17a30 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29  eld && d<=nKey )
17a40 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c  {.    u32 serial
17a50 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20  _type;..    idx 
17a60 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
17a70 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61  aKey[idx], seria
17a80 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65  l_type);.    pMe
17a90 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m->enc = pKeyInf
17aa0 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d  o->enc;.    pMem
17ab0 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  ->db = pKeyInfo-
17ac0 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d  >db;.    /* pMem
17ad0 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20  ->flags = 0; // 
17ae0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17af0 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20  lGet() will set 
17b00 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20  this for us */. 
17b10 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63     pMem->zMalloc
17b20 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
17b30 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  z = 0;.    d += 
17b40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17b50 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
17b60 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
17b70 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
17b80 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73     u++;.  }.  as
17b90 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66  sert( u<=pKeyInf
17ba0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b  o->nField + 1 );
17bb0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75  .  p->nField = u
17bc0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
17bd0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
17be0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
17bf0 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20  es two index or 
17c00 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79  table record key
17c10 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  s in the same wa
17c20 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69  y.** as the sqli
17c30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
17c40 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20  pare() routine. 
17c50 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72  Unlike VdbeRecor
17c60 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74  dCompare(),.** t
17c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
17c80 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f  erializes and co
17c90 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73  mpares values us
17ca0 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ing the.** sqlit
17cb0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
17cc0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d  ) and sqlite3Mem
17cd0 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69  Compare() functi
17ce0 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a  ons. It is used.
17cf0 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73  ** in assert() s
17d00 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73  tatements to ens
17d10 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74  ure that the opt
17d20 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a  imized code in.*
17d30 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  * sqlite3VdbeRec
17d40 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74  ordCompare() ret
17d50 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74  urns results wit
17d60 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d  h these two prim
17d70 69 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  itives..*/.stati
17d80 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
17d90 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
17da0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
17db0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
17dc0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
17dd0 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
17de0 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a 20  ord *pPKey2  /* 
17df0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
17e00 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
17e10 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
17e20 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
17e30 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
17e40 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
17e50 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17e60 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
17e70 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
17e80 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
17e90 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
17ea0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17eb0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
17ec0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
17ed0 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
17ee0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
17ef0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
17f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
17f10 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
17f20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
17f30 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
17f40 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
17f50 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  Info;.  mem1.enc
17f60 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
17f70 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
17f80 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
17f90 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
17fa0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
17fb0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
17fc0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17fd0 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
17fe0 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
17ff0 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
18000 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
18010 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
18020 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
18030 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
18040 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
18050 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
18060 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
18070 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
18080 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
18090 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
180a0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
180b0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
180c0 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
180d0 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
180e0 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
180f0 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
18100 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
18110 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
18120 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
18130 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
18140 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
18150 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
18160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
18170 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
18180 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
18190 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
181a0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
181b0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
181c0 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
181d0 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
181e0 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
181f0 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
18200 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
18210 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
18220 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
18230 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
18240 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
18250 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a  Hdr1);.  d1 = sz
18260 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20  Hdr1;.  assert( 
18270 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
18280 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  +pKeyInfo->nXFie
18290 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65  ld>=pPKey2->nFie
182a0 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ld || CORRUPT_DB
182b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b   );.  assert( pK
182c0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
182d0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
182e0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
182f0 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  eld>0 );.  asser
18300 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20  t( idx1<=szHdr1 
18310 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
18320 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73  .  do{.    u32 s
18330 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20  erial_type1;..  
18340 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65    /* Read the se
18350 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74  rial types for t
18360 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20  he next element 
18370 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a  in each key. */.
18380 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56      idx1 += getV
18390 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69  arint32( aKey1+i
183a0 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx1, serial_type
183b0 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  1 );..    /* Ver
183c0 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69  ify that there i
183d0 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61  s enough key spa
183e0 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20  ce remaining to 
183f0 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62  avoid.    ** a b
18400 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20  uffer overread. 
18410 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f   The "d1+serial_
18420 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72  type1+2" subexpr
18430 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20  ession will.    
18440 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65  ** always be gre
18450 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
18460 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74  al to the amount
18470 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79   of required key
18480 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55   space..    ** U
18490 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d  se that approxim
184a0 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74  ation to avoid t
184b0 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76  he more expensiv
184c0 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  e call to.    **
184d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
184e0 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74  alTypeLen() in t
184f0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
18500 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
18510 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
18520 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20  >(u32)nKey1.    
18530 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64   && d1+sqlite3Vd
18540 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18550 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75  serial_type1)>(u
18560 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b  32)nKey1 .    ){
18570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18580 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72    }..    /* Extr
18590 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74  act the values t
185a0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20  o be compared.. 
185b0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20     */.    d1 += 
185c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
185d0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
185e0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26   serial_type1, &
185f0 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  mem1);..    /* D
18600 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  o the comparison
18610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
18620 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
18630 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79  re(&mem1, &pPKey
18640 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79  2->aMem[i], pKey
18650 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b  Info->aColl[i]);
18660 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
18670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18680 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  mem1.zMalloc==0 
18690 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
186a0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
186b0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
186c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
186d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
186e0 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68  c;  /* Invert th
186f0 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53  e result for DES
18700 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
18710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
18720 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
18730 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
18740 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
18750 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
18760 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
18770 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
18780 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
18790 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
187a0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
187b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
187c0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
187d0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
187e0 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
187f0 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
18800 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
18810 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
18820 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
18830 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
18840 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
18850 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
18860 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
18870 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
18880 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
18890 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
188a0 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
188b0 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
188c0 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 74  al. Return the t
188d0 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
188e0 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
188f0 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  return pPKey2->d
18900 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e  efault_rc;.}.#en
18910 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
18920 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
18930 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
18940 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
18950 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
18960 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
18970 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18980 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
18990 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
189a0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
189b0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
189c0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
189d0 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
189e0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
189f0 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
18a00 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
18a10 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
18a20 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
18a30 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
18a40 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
18a50 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
18a60 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
18a70 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
18a80 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
18a90 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a 29  CollSeq *pColl.)
18aa0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
18ab0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
18ac0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
18ad0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
18ae0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
18af0 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
18b00 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
18b10 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
18b20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
18b30 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
18b40 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
18b50 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
18b60 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
18b70 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
18b80 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
18b90 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
18ba0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
18bb0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
18bc0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
18bd0 6d 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20 73  memset(&c1, 0, s
18be0 69 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20 20  izeof(c1));.    
18bf0 6d 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20 73  memset(&c2, 0, s
18c00 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20 20  izeof(c2));.    
18c10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
18c20 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
18c30 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
18c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
18c50 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
18c60 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
18c70 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
18c80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
18c90 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
18ca0 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
18cb0 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
18cc0 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
18cd0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
18ce0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
18cf0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
18d00 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
18d10 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
18d20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
18d30 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
18d40 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
18d50 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
18d60 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
18d70 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
18d80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
18d90 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
18da0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
18db0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
18dc0 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
18dd0 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
18de0 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
18df0 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
18e00 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
18e10 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
18e20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
18e30 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
18e40 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
18e50 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
18e60 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
18e70 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
18e80 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
18e90 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
18ea0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
18eb0 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
18ec0 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
18ed0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
18ee0 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
18ef0 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
18f00 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
18f10 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
18f20 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
18f30 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
18f40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18f50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
18f60 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
18f70 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
18f80 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
18f90 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
18fa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
18fb0 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
18fc0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
18fd0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
18fe0 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
18ff0 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
19000 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
19010 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
19020 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
19030 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
19040 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
19050 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
19060 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
19070 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
19080 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
19090 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
190a0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
190b0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
190c0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
190d0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
190e0 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
190f0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  l);.  }..  /* If
19100 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20   one value is a 
19110 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 6f  number and the o
19120 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68 65  ther is not, the
19130 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 2e   number is less.
19140 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
19150 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61  e numbers, compa
19160 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20 6f  re as reals if o
19170 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f 72  ne is a real, or
19180 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20 2a   as integers.  *
19190 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65 73  * if both values
191a0 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a 20   are integers.. 
191b0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
191c0 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
191d0 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
191e0 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72 32     double r1, r2
191f0 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  ;.    if( (f1 & 
19200 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
19210 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
19220 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
19230 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
19240 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
19250 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
19260 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31 3b  >u.i ) return 1;
19270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
19280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19290 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
192a0 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70 4d  ){.      r1 = pM
192b0 65 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73  em1->r;.    }els
192c0 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e  e if( (f1&MEM_In
192d0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  t)!=0 ){.      r
192e0 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d  1 = (double)pMem
192f0 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73  1->u.i;.    }els
19300 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
19310 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
19320 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
19330 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20  0 ){.      r2 = 
19340 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d 65  pMem2->r;.    }e
19350 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d 5f  lse if( (f2&MEM_
19360 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
19370 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d   r2 = (double)pM
19380 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65  em2->u.i;.    }e
19390 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
193a0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
193b0 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74 75  if( r1<r2 ) retu
193c0 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 72  rn -1;.    if( r
193d0 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31 3b  1>r2 ) return 1;
193e0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
193f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20   }..  /* If one 
19400 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  value is a strin
19410 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20  g and the other 
19420 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73  is a blob, the s
19430 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20  tring is less.. 
19440 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20   ** If both are 
19450 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65  strings, compare
19460 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
19470 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  ting functions..
19480 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
19490 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74  ned_flags&MEM_St
194a0 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  r ){.    if( (f1
194b0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29   & MEM_Str)==0 )
194c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
194d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
194e0 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f2 & MEM_Str)==
194f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
19500 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n -1;.    }..   
19510 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
19520 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20  enc==pMem2->enc 
19530 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
19540 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
19550 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20  E_UTF8 || .     
19560 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e         pMem1->en
19570 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
19580 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  E || pMem1->enc=
19590 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
195a0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
195b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
195c0 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
195d0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  d at this point,
195e0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20   even if.    ** 
195f0 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73  the user deletes
19600 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
19610 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68  equence after th
19620 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69  e vdbe program i
19630 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  s.    ** compile
19640 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20  d (this was not 
19650 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29  always the case)
19660 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
19670 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70  ert( !pColl || p
19680 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20  Coll->xCmp );.. 
19690 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
196a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
196b0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
196c0 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20  g(pMem1, pMem2, 
196d0 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  pColl);.    }.  
196e0 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
196f0 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
19700 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
19710 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
19720 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
19730 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
19740 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
19750 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
19760 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
19770 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
19780 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
19790 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  p().  */.  rc = 
197a0 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c  memcmp(pMem1->z,
197b0 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d   pMem2->z, (pMem
197c0 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70  1->n>pMem2->n)?p
197d0 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e  Mem2->n:pMem1->n
197e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29  );.  if( rc==0 )
197f0 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d 31  {.    rc = pMem1
19800 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a  ->n - pMem2->n;.
19810 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19820 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
19830 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
19840 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
19850 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
19860 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
19870 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
19880 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
19890 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
198a0 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
198b0 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
198c0 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
198d0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
198e0 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
198f0 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
19900 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
19910 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
19920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
19930 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
19940 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
19950 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
19960 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
19970 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
19980 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
19990 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
199a0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
199b0 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
199c0 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
199d0 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
199e0 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
199f0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
19a00 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
19a10 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
19a20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
19a30 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
19a40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
19a50 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
19a60 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
19a70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19a80 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
19aa0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
19ab0 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
19ac0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
19ad0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
19ae0 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
19af0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
19b00 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
19b10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
19b20 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
19b30 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
19b40 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
19b50 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
19b60 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
19b70 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
19b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
19b90 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
19ba0 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
19bb0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
19bc0 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
19bd0 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
19be0 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
19bf0 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
19c00 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19c10 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
19c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c30 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19c40 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
19c50 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
19c60 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
19c70 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
19c80 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
19c90 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
19ca0 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
19cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
19cc0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
19cd0 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
19ce0 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
19cf0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
19d00 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
19d10 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
19d20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
19d30 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
19d40 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
19d50 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
19d60 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
19d70 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
19d80 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
19d90 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
19da0 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
19db0 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
19dc0 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   th OP_MakeRecor
19dd0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
19de0 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
19df0 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
19e00 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
19e10 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
19e20 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
19e30 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
19e40 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
19e50 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
19e60 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
19e70 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
19e80 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
19e90 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
19ea0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
19eb0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
19ec0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
19ed0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
19ee0 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
19ef0 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
19f00 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
19f10 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
19f20 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
19f30 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
19f40 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
19f50 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
19f60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
19f70 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
19f80 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
19f90 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
19fa0 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20  Key2->isCorrupt 
19fb0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 61  to non-zero.** a
19fc0 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  nd return 0..*/.
19fd0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
19fe0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
19ff0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1a000 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1a010 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1a020 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a030 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20  *pPKey2,        
1a040 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1a050 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20  .  int bSkip    
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a070 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
1a080 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69  kip the first fi
1a090 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  eld */.){.  u32 
1a0a0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d1;             
1a0b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a0c0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1a0d0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
1a0e0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  lement */.  int 
1a0f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a110 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65  ndex of next fie
1a120 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  ld to compare */
1a130 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
1a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a150 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
1a160 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62  cord header in b
1a170 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64  ytes */.  u32 id
1a180 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  x1;             
1a190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1a1a0 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70  set of first typ
1a1b0 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  e in header */. 
1a1c0 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1e0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1a1f0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20   */.  Mem *pRhs 
1a200 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20  = pPKey2->aMem; 
1a210 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69        /* Next fi
1a220 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f  eld of pPKey2 to
1a230 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65   compare */.  Ke
1a240 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1a250 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
1a260 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  fo;.  const unsi
1a270 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31  gned char *aKey1
1a280 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1a290 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b  ed char *)pKey1;
1a2a0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1a2b0 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74  /* If bSkip is t
1a2c0 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61  rue, then the ca
1a2d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1a2e0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1a2f0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
1a300 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  two elements in 
1a310 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1a320 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69  al. Fix the vari
1a330 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62  ous stack variab
1a340 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  les so.  ** that
1a350 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
1a360 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61  gins comparing a
1a370 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65  t the second fie
1a380 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b  ld. */.  if( bSk
1a390 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31  ip ){.    u32 s1
1a3a0 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b  ;.    idx1 = 1 +
1a3b0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1a3c0 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20  ey1[1], s1);.   
1a3d0 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b   szHdr1 = aKey1[
1a3e0 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  0];.    d1 = szH
1a3f0 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  dr1 + sqlite3Vdb
1a400 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1a410 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20  1);.    i = 1;. 
1a420 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c     pRhs++;.  }el
1a430 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67  se{.    idx1 = g
1a440 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31  etVarint32(aKey1
1a450 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64  , szHdr1);.    d
1a460 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20  1 = szHdr1;.    
1a470 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64  if( d1>(unsigned
1a480 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20  )nKey1 ){ .     
1a490 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75   pPKey2->isCorru
1a4a0 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  pt = (u8)SQLITE_
1a4b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a4c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1a4d0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1a4e0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b      }.    i = 0;
1a4f0 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59  .  }..  VVA_ONLY
1a500 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d  ( mem1.zMalloc =
1a510 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1a520 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1a530 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1a540 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1a550 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1a560 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1a570 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1a580 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1a590 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1a5a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1a5b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1a5c0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1a5d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1a5e0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1a5f0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1a600 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1a610 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1a620 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1a630 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1a640 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1a650 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1a660 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1a670 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1a680 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1a690 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1a6a0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1a6b0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1a6c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1a6d0 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
1a6e0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1a6f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1a700 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1a710 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1a720 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1a730 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1a740 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
1a750 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70   rhs = (double)p
1a760 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1a770 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1a780 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1a790 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1a7a0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1a7b0 69 66 28 20 6d 65 6d 31 2e 72 3c 72 68 73 20 29  if( mem1.r<rhs )
1a7c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1a7d0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1a7e0 73 65 20 69 66 28 20 6d 65 6d 31 2e 72 3e 72 68  se if( mem1.r>rh
1a7f0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1a800 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1a810 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1a820 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d         i64 lhs =
1a830 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64   vdbeRecordDecod
1a840 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65  eInt(serial_type
1a850 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20  , &aKey1[d1]);. 
1a860 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d         i64 rhs =
1a870 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20   pRhs->u.i;.    
1a880 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1a890 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1a8a0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1a8b0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1a8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1a8d0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1a8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1a8f0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61     /* RHS is rea
1a900 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  l */.    else if
1a910 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1a920 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
1a930 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1a940 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1a950 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1a960 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  pe>=12 ){.      
1a970 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1a980 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1a990 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1a9a0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1a9b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a9c0 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1a9d0 70 52 68 73 2d 3e 72 3b 0a 20 20 20 20 20 20 20  pRhs->r;.       
1a9e0 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20   double lhs;.   
1a9f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1aa00 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1aa10 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1aa20 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1aa30 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1aa40 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  pe==7 ){.       
1aa50 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 72 3b     lhs = mem1.r;
1aa60 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1aa70 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1aa80 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69  (double)mem1.u.i
1aa90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1aaa0 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1aab0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1aac0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1aad0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1aae0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1aaf0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1ab00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ab10 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1ab20 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1ab30 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1ab40 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1ab50 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1ab60 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1ab70 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1ab80 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1ab90 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1aba0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1abb0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1abc0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1abd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1abe0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1abf0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1ac00 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1ac10 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1ac20 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1ac30 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1ac40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1ac50 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1ac60 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1ac70 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ac80 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1ac90 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1aca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1acb0 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1acc0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1acd0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1ace0 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75  ->isCorrupt = (u
1acf0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1ad00 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
1ad10 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1ad20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1ad30 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
1ad40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65     }else if( pKe
1ad50 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  yInfo->aColl[i] 
1ad60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1ad70 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  1.enc = pKeyInfo
1ad80 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  ->enc;.         
1ad90 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1ada0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  nfo->db;.       
1adb0 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20     mem1.flags = 
1adc0 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20  MEM_Str;.       
1add0 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61     mem1.z = (cha
1ade0 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20  r*)&aKey1[d1];. 
1adf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
1ae00 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1ae10 6e 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20  ng(&mem1, pRhs, 
1ae20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1ae30 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
1ae40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1ae50 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1ae60 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1ae70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1ae80 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1ae90 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1aea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1aeb0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1aec0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1aed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1aee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1aef0 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1af00 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1af10 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1af20 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 74  lob ){.      get
1af30 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1af40 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1af50 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1af60 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1af70 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1af80 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1af90 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1afa0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1afb0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1afc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1afd0 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 65    int nStr = (se
1afe0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1aff0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1b000 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 29  tcase( (d1+nStr)
1b010 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1b020 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1b030 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 2b  tcase( (d1+nStr+
1b040 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  1)==(unsigned)nK
1b050 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ey1 );.        i
1b060 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 28  f( (d1+nStr) > (
1b070 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1b080 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  {.          pPKe
1b090 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20  y2->isCorrupt = 
1b0a0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1b0b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1b0c0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b0e0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1b0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b100 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1b110 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1b120 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1b130 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1b140 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1b150 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1b160 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1b170 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
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 6e 75 6c 6c 20 2a 2f  * RHS is null */
1b1b0 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1b1c0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1b1d0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1b1e0 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1b1f0 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1b200 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1b210 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1b220 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1b230 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1b240 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1b250 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
1b260 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1b270 20 20 20 7c 7c 20 28 72 63 3c 30 20 26 26 20 76     || (rc<0 && v
1b280 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b290 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1b2a0 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20  y1, pPKey2)<0). 
1b2b0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63 3e           || (rc>
1b2c0 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43  0 && vdbeRecordC
1b2d0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1b2e0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1b2f0 29 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c  )>0).          |
1b300 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1b310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20  mallocFailed.   
1b320 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1b330 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63  rt( mem1.zMalloc
1b340 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1b350 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1b360 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1b380 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1b390 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1b3a0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1b3b0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1b3c0 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1b3d0 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1b3e0 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1b3f0 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1b400 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1b410 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1b420 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1b430 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1b440 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1b450 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1b460 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1b470 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1b480 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1b490 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1b4a0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1b4b0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1b4c0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1b4d0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1b4e0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1b4f0 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1b500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1b510 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  m1.zMalloc==0 );
1b520 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1b530 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1b540 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
1b550 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20  keys ran out of 
1b560 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20  fields and.  ** 
1b570 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75  all the fields u
1b580 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20  p to that point 
1b590 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75  were equal. Retu
1b5a0 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61 75  rn the the defau
1b5b0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1b5c0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b5d0 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20  CORRUPT_DB .    
1b5e0 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 64 65     || pPKey2->de
1b5f0 66 61 75 6c 74 5f 72 63 3d 3d 76 64 62 65 52 65  fault_rc==vdbeRe
1b600 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1b610 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1b620 50 4b 65 79 32 29 20 0a 20 20 20 20 20 20 20 7c  PKey2) .       |
1b630 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1b640 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1b650 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79  ;.  return pPKey
1b660 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d  2->default_rc;.}
1b670 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1b680 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69  ction is an opti
1b690 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  mized version of
1b6a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1b6b0 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20  rdCompare() .** 
1b6c0 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72  that (a) the fir
1b6d0 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65  st field of pPKe
1b6e0 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  y2 is an integer
1b6f0 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a  , and (b) the .*
1b700 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  * size-of-header
1b710 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73   varint at the s
1b720 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
1b730 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
1b740 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28  single.** byte (
1b750 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61  i.e. is less tha
1b760 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f  n 128)..**.** To
1b770 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20   avoid concerns 
1b780 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65  about buffer ove
1b790 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75  rreads, this rou
1b7a0 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  tine is only use
1b7b0 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20  d.** on schemas 
1b7c0 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75  where the maximu
1b7d0 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73  m valid header s
1b7e0 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20  ize is 63 bytes 
1b7f0 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  or less..*/.stat
1b800 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b810 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69  dCompareInt(.  i
1b820 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1b830 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1b840 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1b850 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1b860 4b 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20 52  Key2,       /* R
1b870 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1b880 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20  t bSkip         
1b890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b8a0 67 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  gnored */.){.  c
1b8b0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1b8c0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1b8d0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1b8e0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1b8f0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1b900 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1b910 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1b920 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1b930 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1b940 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1b950 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1b960 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b970 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61  TER(bSkip);..  a
1b980 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20  ssert( bSkip==0 
1b990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28  );.  assert( (*(
1b9a0 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46  u8*)pKey1)<=0x3F
1b9b0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b9c0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1b9d0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1b9e0 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
1b9f0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1ba00 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1ba10 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
1ba20 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1ba30 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1ba40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ba50 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f  .    case 2: { /
1ba60 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 2-byte signed 
1ba70 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1ba80 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f   lhs = TWO_BYTE_
1ba90 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1baa0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1bab0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1bac0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1bad0 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
1bae0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1baf0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52  .      lhs = THR
1bb00 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1bb10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bb20 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1bb30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bb40 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20     case 4: { /* 
1bb50 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  4-byte signed in
1bb60 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79  teger */.      y
1bb70 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1bb80 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c  T(aKey);.      l
1bb90 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a  hs = (i64)*(int*
1bba0 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&y;.      testc
1bbb0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1bbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bbd0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
1bbe0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
1bbf0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1bc00 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45   lhs = FOUR_BYTE
1bc10 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20  _UINT(aKey+2) + 
1bc20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54  (((i64)1)<<32)*T
1bc30 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1bc40 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1bc50 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1bc60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1bc70 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20     case 6: { /* 
1bc80 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
1bc90 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78  teger */.      x
1bca0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1bcb0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78  T(aKey);.      x
1bcc0 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
1bcd0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1bce0 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d  +4);.      lhs =
1bcf0 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
1bd00 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1bd10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1bd20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bd30 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d   8: .      lhs =
1bd40 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1bd50 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20  .    case 9:.   
1bd60 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20     lhs = 1;.    
1bd70 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a    break;..    /*
1bd80 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64   This case could
1bd90 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68   be removed with
1bda0 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65  out changing the
1bdb0 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e   results of runn
1bdc0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ing.    ** this 
1bdd0 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20  code. Including 
1bde0 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f  it causes gcc to
1bdf0 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74   generate a fast
1be00 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a  er switch .    *
1be10 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e  * statement (sin
1be20 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  ce the range of 
1be30 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e  switch targets n
1be40 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72  ow starts at zer
1be50 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20  o and.    ** is 
1be60 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20  contiguous) but 
1be70 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
1be80 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64  ny duplicate cod
1be90 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65  e to be generate
1bea0 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63  d.    ** (as gcc
1beb0 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67   is clever enoug
1bec0 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  h to combine the
1bed0 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29   two like cases)
1bee0 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  . Other .    ** 
1bef0 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20  compilers might 
1bf00 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20  be similar.  */ 
1bf10 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73  .    case 0: cas
1bf20 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72  e 7:.      retur
1bf30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1bf40 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31  ordCompare(nKey1
1bf50 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1bf60 20 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c   0);..    defaul
1bf70 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
1bf80 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1bf90 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
1bfa0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
1bfb0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e  );.  }..  if( v>
1bfc0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1bfd0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
1bfe0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
1bff0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
1c000 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
1c010 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
1c020 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
1c030 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1c040 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
1c050 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
1c060 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
1c070 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
1c080 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
1c090 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1c0a0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
1c0b0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b  ey1, pPKey2, 1);
1c0c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1c0d0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
1c0e0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
1c0f0 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20  s are equal and 
1c100 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61  there are no tra
1c110 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65  iling.    ** fie
1c120 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65  lds. Return pPKe
1c130 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69  y2->default_rc i
1c140 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a  n this case. */.
1c150 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1c160 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
1c170 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 65  }..  assert( (re
1c180 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63 6f  s==0 && vdbeReco
1c190 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c1a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c1b0 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  ey2)==0).       
1c1c0 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64 62  || (res<0 && vdb
1c1d0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1c1e0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1c1f0 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20  , pPKey2)<0).   
1c200 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26 26      || (res>0 &&
1c210 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c220 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1c230 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29  Key1, pPKey2)>0)
1c240 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
1c250 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65 74  PT_DB.  );.  ret
1c260 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1c270 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c280 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1c290 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1c2a0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1c2b0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1c2c0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1c2d0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1c2e0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28  a string, that (
1c2f0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  b) the first fie
1c300 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63  ld.** uses the c
1c310 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1c320 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29  e BINARY and (c)
1c330 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
1c340 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
1c350 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74  .** at the start
1c360 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1c370 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1c380 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74  le byte..*/.stat
1c390 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1c3a0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a  dCompareString(.
1c3b0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1c3c0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1c3d0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1c3e0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1c3f0 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 2f  *pPKey2,       /
1c400 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1c410 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20 20   int bSkip.){.  
1c420 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1c430 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1c440 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1c450 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1c460 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c470 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20  ETER(bSkip);..  
1c480 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30  assert( bSkip==0
1c490 20 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33   );.  getVarint3
1c4a0 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72  2(&aKey1[1], ser
1c4b0 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69 66  ial_type);..  if
1c4c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1c4d0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1c4e0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
1c4f0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
1c500 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
1c510 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
1c520 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1c530 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
1c540 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1c550 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
1c560 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1c570 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
1c580 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
1c590 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
1c5a0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
1c5b0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
1c5c0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
1c5d0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
1c5e0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
1c5f0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
1c600 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75   pPKey2->isCorru
1c610 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  pt = (u8)SQLITE_
1c620 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c630 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1c640 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1c650 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70  /.    }.    nCmp
1c660 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e   = MIN( pPKey2->
1c670 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20  aMem[0].n, nStr 
1c680 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d  );.    res = mem
1c690 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72  cmp(&aKey1[szHdr
1c6a0 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  ], pPKey2->aMem[
1c6b0 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20  0].z, nCmp);..  
1c6c0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
1c6d0 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72        res = nStr
1c6e0 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b   - pPKey2->aMem[
1c6f0 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  0].n;.      if( 
1c700 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
1c710 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46    if( pPKey2->nF
1c720 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20  ield>1 ){.      
1c730 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
1c740 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c750 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1c760 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
1c770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c780 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1c790 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1c7a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c7b0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1c7c0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
1c7d0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
1c7e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c7f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1c800 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
1c810 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
1c820 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
1c830 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
1c840 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
1c850 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1c860 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
1c870 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76 64  t( (res==0 && vd
1c880 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1c890 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1c8a0 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20  1, pPKey2)==0). 
1c8b0 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30 20        || (res<0 
1c8c0 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  && vdbeRecordCom
1c8d0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1c8e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3c   pKey1, pPKey2)<
1c8f0 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65  0).       || (re
1c900 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  s>0 && vdbeRecor
1c910 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1c920 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1c930 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c  y2)>0).       ||
1c940 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20   CORRUPT_DB.    
1c950 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b     || pPKey2->pK
1c960 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1c970 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20  ocFailed.  );.  
1c980 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1c990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
1c9a0 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
1c9b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c9c0 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c  pare() compatibl
1c9d0 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75  e function.** su
1c9e0 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61  itable for compa
1c9f0 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20  ring serialized 
1ca00 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75  records to the u
1ca10 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70  npacked record p
1ca20 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
1ca30 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  only argument..*
1ca40 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20  /.RecordCompare 
1ca50 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
1ca60 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52  ompare(UnpackedR
1ca70 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20  ecord *p){.  /* 
1ca80 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1ca90 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72  areInt() and var
1caa0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1cab0 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73  String() both as
1cac0 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  sume.  ** that t
1cad0 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1cae0 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63  r varint that oc
1caf0 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
1cb00 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64  t of each record
1cb10 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20  .  ** fits in a 
1cb20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65  single byte (i.e
1cb30 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73  . is 127 or less
1cb40 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  ). varintRecordC
1cb50 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a  ompareInt().  **
1cb60 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1cb70 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  at it is safe to
1cb80 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66   overread a buff
1cb90 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74  er by at least t
1cba0 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d  he .  ** maximum
1cbb0 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20   possible legal 
1cbc0 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73  header size plus
1cbd0 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73   8 bytes. Becaus
1cbe0 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20  e there is.  ** 
1cbf0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1cc00 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75   at least 74 (bu
1cc10 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73  t not 136) bytes
1cc20 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c   of padding foll
1cc30 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20  owing each.  ** 
1cc40 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
1cc50 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1cc60 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d  pareInt() this m
1cc70 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65  akes it convenie
1cc80 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74  nt to.  ** limit
1cc90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1cca0 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79   header to 64 by
1ccb0 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65  tes in cases whe
1ccc0 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65  re the first fie
1ccd0 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e  ld.  ** is an in
1cce0 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  teger..  **.  **
1ccf0 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79   The easiest way
1cd00 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73   to enforce this
1cd10 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e   limit is to con
1cd20 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72  sider only recor
1cd30 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20  ds with.  ** 13 
1cd40 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20  fields or less. 
1cd50 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65  If the first fie
1cd60 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ld is an integer
1cd70 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65  , the maximum le
1cd80 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  gal.  ** header 
1cd90 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20  size is (12*5 + 
1cda0 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a  1 + 1) bytes.  *
1cdb0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79  /.  if( (p->pKey
1cdc0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1cdd0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1cde0 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20  eld)<=13 ){.    
1cdf0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61  int flags = p->a
1ce00 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20  Mem[0].flags;.  
1ce10 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66    if( p->pKeyInf
1ce20 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d  o->aSortOrder[0]
1ce30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20   ){.      p->r1 
1ce40 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32  = 1;.      p->r2
1ce50 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
1ce60 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
1ce70 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20  -1;.      p->r2 
1ce80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
1ce90 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f  f( (flags & MEM_
1cea0 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  Int) ){.      re
1ceb0 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
1cec0 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d  ompareInt;.    }
1ced0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
1cee0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1cef0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1cf00 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c   flags & MEM_Nul
1cf10 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
1cf20 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  e( flags & MEM_B
1cf30 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28  lob );.    if( (
1cf40 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61  flags & (MEM_Rea
1cf50 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42  l|MEM_Null|MEM_B
1cf60 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70  lob))==0 && p->p
1cf70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
1cf80 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  ]==0 ){.      as
1cf90 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45  sert( flags & ME
1cfa0 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72  M_Str );.      r
1cfb0 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
1cfc0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20  CompareString;. 
1cfd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1cfe0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1cff0 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a  cordCompare;.}..
1d000 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74  /*.** pCur point
1d010 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e  s at an index en
1d020 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e  try created usin
1d030 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  g the OP_MakeRec
1d040 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52  ord opcode..** R
1d050 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74  ead the rowid (t
1d060 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e  he last field in
1d070 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64   the record) and
1d080 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f   store it in *ro
1d090 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  wid..** Return S
1d0a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1d0b0 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72  ything works, or
1d0c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f   an error code o
1d0d0 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20  therwise..**.** 
1d0e0 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f  pCur might be po
1d0f0 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f  inting to text o
1d100 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63  btained from a c
1d110 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
1d120 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20  file..** So the 
1d130 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62  content cannot b
1d140 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61  e trusted.  Do a
1d150 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b  ppropriate check
1d160 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  s on the content
1d170 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d180 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c  VdbeIdxRowid(sql
1d190 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73  ite3 *db, BtCurs
1d1a0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72  or *pCur, i64 *r
1d1b0 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65  owid){.  i64 nCe
1d1c0 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
1d1d0 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72   rc;.  u32 szHdr
1d1e0 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ;        /* Size
1d1f0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a   of the header *
1d200 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69  /.  u32 typeRowi
1d210 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20  d;    /* Serial 
1d220 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69  type of the rowi
1d230 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f  d */.  u32 lenRo
1d240 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  wid;     /* Size
1d250 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
1d260 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20  .  Mem m, v;..  
1d270 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d280 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
1d290 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d2a0 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
1d2b0 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
1d2c0 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
1d2d0 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
1d2e0 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
1d2f0 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
1d300 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d310 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
1d320 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
1d330 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
1d340 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
1d350 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
1d360 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
1d370 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
1d380 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
1d390 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
1d3a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d3b0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1d3c0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
1d3d0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
1d3e0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1d3f0 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
1d400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1d410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
1d420 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
1d430 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
1d440 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
1d450 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
1d460 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
1d470 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
1d480 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
1d490 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
1d4a0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
1d4b0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
1d4c0 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d  y */.  memset(&m
1d4d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b  , 0, sizeof(m));
1d4e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
1d4f0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28  dbeMemFromBtree(
1d500 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43  pCur, 0, (u32)nC
1d510 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a  ellKey, 1, &m);.
1d520 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1d530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1d540 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65    /* The index e
1d550 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20  ntry must begin 
1d560 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69  with a header si
1d570 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  ze */.  (void)ge
1d580 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d  tVarint32((u8*)m
1d590 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65  .z, szHdr);.  te
1d5a0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33  stcase( szHdr==3
1d5b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1d5c0 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20  szHdr==m.n );.  
1d5d0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48  if( unlikely(szH
1d5e0 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48  dr<3 || (int)szH
1d5f0 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67  dr>m.n) ){.    g
1d600 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f  oto idx_rowid_co
1d610 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20  rruption;.  }.. 
1d620 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65   /* The last fie
1d630 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  ld of the index 
1d640 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74  should be an int
1d650 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44  eger - the ROWID
1d660 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68  ..  ** Verify th
1d670 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  at the last entr
1d680 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69  y really is an i
1d690 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f  nteger. */.  (vo
1d6a0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
1d6b0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31  u8*)&m.z[szHdr-1
1d6c0 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20  ], typeRowid);. 
1d6d0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d6e0 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73  owid==1 );.  tes
1d6f0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d700 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==2 );.  testcas
1d710 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20  e( typeRowid==3 
1d720 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d730 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20  ypeRowid==4 );. 
1d740 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1d750 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73  owid==5 );.  tes
1d760 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1d770 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==6 );.  testcas
1d780 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20  e( typeRowid==8 
1d790 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1d7a0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20  ypeRowid==9 );. 
1d7b0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79   if( unlikely(ty
1d7c0 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70  peRowid<1 || typ
1d7d0 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65  eRowid>9 || type
1d7e0 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20  Rowid==7) ){.   
1d7f0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
1d800 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
1d810 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c    lenRowid = sql
1d820 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1d830 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29  peLen(typeRowid)
1d840 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
1d850 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
1d860 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
1d870 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
1d880 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
1d890 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
1d8a0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
1d8b0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
1d8c0 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
1d8d0 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
1d8e0 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
1d8f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
1d900 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
1d910 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
1d920 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
1d930 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
1d940 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
1d950 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
1d960 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1d970 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1d980 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
1d990 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
1d9a0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
1d9b0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
1d9c0 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
1d9d0 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
1d9e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d9f0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
1da00 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
1da10 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a  .  testcase( m.z
1da20 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
1da30 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1da40 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
1da50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1da60 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
1da70 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
1da80 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1da90 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1daa0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
1dab0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
1dac0 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
1dad0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
1dae0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
1daf0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
1db00 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1db10 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1db20 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
1db30 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
1db40 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
1db50 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
1db60 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1db70 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
1db80 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
1db90 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
1dba0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
1dbb0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
1dbc0 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
1dbd0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1dbe0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
1dbf0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
1dc00 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
1dc10 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
1dc20 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
1dc30 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
1dc40 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
1dc50 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
1dc60 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
1dc70 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
1dc80 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
1dc90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1dca0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
1dcb0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
1dcc0 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
1dcd0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
1dce0 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
1dcf0 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
1dd00 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
1dd10 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
1dd20 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
1dd30 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
1dd40 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1dd60 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
1dd70 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
1dd80 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
1dd90 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
1dda0 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
1ddb0 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73  pCur = pC->pCurs
1ddc0 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  or;.  Mem m;..  
1ddd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1dde0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1ddf0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1de00 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1de10 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1de20 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1de30 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1de40 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1de50 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
1de60 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
1de70 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
1de80 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20  /.  /* nCellKey 
1de90 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62  will always be b
1dea0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66  etween 0 and 0xf
1deb0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20  fffffff because 
1dec0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20  of the way.  ** 
1ded0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43  that btreeParseC
1dee0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c  ellPtr() and sql
1def0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28  ite3GetVarint32(
1df00 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
1df10 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c  d */.  if( nCell
1df20 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b  Key<=0 || nCellK
1df30 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b  ey>0x7fffffff ){
1df40 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20  .    *res = 0;. 
1df50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1df60 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1df70 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20   }.  memset(&m, 
1df80 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20  0, sizeof(m));. 
1df90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
1dfa0 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43  eMemFromBtree(pC
1dfb0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28 75  ->pCursor, 0, (u
1dfc0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
1dfd0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
1dfe0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1dff0 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
1e000 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e010 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
1e020 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20  pUnpacked, 0);. 
1e030 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1e040 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
1e050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e060 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1e070 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
1e080 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
1e090 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
1e0a0 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
1e0b0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
1e0c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1e0d0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
1e0e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
1e0f0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
1e100 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
1e110 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
1e120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e130 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
1e140 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
1e150 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
1e160 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
1e170 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
1e180 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
1e190 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
1e1a0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
1e1b0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
1e1c0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
1e1d0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
1e1e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
1e1f0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
1e200 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
1e210 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
1e220 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
1e230 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
1e240 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e250 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
1e260 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
1e270 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
1e280 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
1e290 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
1e2a0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
1e2b0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
1e2c0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
1e2d0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
1e2e0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
1e2f0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
1e300 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
1e310 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
1e320 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
1e330 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
1e340 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1e350 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
1e360 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
1e370 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
1e380 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
1e390 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
1e3a0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1e3b0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
1e3c0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
1e3d0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
1e3e0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
1e3f0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
1e400 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
1e410 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1e420 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
1e430 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
1e440 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1e450 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
1e460 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
1e470 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
1e480 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
1e490 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
1e4a0 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
1e4b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e4c0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
1e4d0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
1e4e0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
1e4f0 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
1e500 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
1e510 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
1e520 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
1e530 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
1e540 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
1e550 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
1e560 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
1e570 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
1e580 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
1e590 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
1e5a0 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
1e5b0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
1e5c0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
1e5d0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
1e5e0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
1e5f0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
1e600 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
1e610 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
1e620 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
1e630 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
1e640 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
1e650 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
1e660 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
1e670 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
1e680 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
1e690 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
1e6a0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
1e6b0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
1e6c0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
1e6d0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
1e6e0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
1e6f0 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
1e700 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e710 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
1e720 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
1e730 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e740 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
1e750 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
1e760 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
1e770 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1e780 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
1e790 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1e7a0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
1e7b0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
1e7c0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
1e7d0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
1e7e0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
1e7f0 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
1e800 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
1e810 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
1e820 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
1e830 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
1e840 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
1e850 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
1e860 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
1e870 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
1e880 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
1e890 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
1e8a0 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
1e8b0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
1e8c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
1e8d0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
1e8e0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
1e8f0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
1e900 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e910 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
1e920 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
1e930 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
1e940 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
1e950 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1e960 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1e970 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1e980 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
1e990 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
1e9a0 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
1e9b0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
1e9c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1e9d0 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
1e9e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
1e9f0 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
1ea00 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
1ea10 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 73  tab *pVtab){.  s
1ea20 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
1ea30 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  db;.  sqlite3DbF
1ea40 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
1ea50 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
1ea60 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
1ea70 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
1ea80 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1ea90 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
1eaa0 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62  ErrMsg);.  pVtab
1eab0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d  ->zErrMsg = 0;.}
1eac0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1ead0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1eae0 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  BLE */..#ifdef S
1eaf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45  QLITE_ENABLE_PRE
1eb00 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a  UPDATE_HOOK../*.
1eb10 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
1eb20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
1eb30 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61   NULL, release a
1eb40 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ny allocations a
1eb50 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
1eb60 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  th the memory ce
1eb70 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d  lls in the p->aM
1eb80 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f  em[] array. Also
1eb90 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b   free the Unpack
1eba0 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
1ebb0 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73  cture itself, us
1ebc0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1ebd0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  e()..**.** This 
1ebe0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1ebf0 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65   to free Unpacke
1ec00 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
1ec10 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  es allocated by.
1ec20 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63  ** the vdbeUnpac
1ec30 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69  kRecord() functi
1ec40 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65  on found in vdbe
1ec50 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  api.c..*/.static
1ec60 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e   void vdbeFreeUn
1ec70 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a  packed(sqlite3 *
1ec80 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  db, UnpackedReco
1ec90 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  rd *p){.  if( p 
1eca0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1ecb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1ecc0 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  nField; i++){.  
1ecd0 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
1ece0 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20  &p->aMem[i];.   
1ecf0 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61     if( pMem->zMa
1ed00 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64  lloc ) sqlite3Vd
1ed10 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65  beMemRelease(pMe
1ed20 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  m);.    }.    sq
1ed30 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ed40 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
1ed50 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 2d   Invoke the pre-
1ed60 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20  update hook. If 
1ed70 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 54  this is an UPDAT
1ed80 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 2d  E or DELETE pre-
1ed90 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20  update call,.** 
1eda0 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 73  then cursor pass
1edb0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1edc0 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
1edd0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
1ede0 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65  w about.** to be
1edf0 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 74   update or delet
1ee00 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c 69  ed. If the appli
1ee10 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c  cation calls sql
1ee20 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 6f  ite3_preupdate_o
1ee30 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71  ld(),.** the req
1ee40 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c 6c  uired value will
1ee50 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
1ee60 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
1ee70 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76   points to..*/.v
1ee80 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
1ee90 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20  reUpdateHook(.  
1eea0 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
1eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eec0 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 61  /* Vdbe pre-upda
1eed0 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b  te hook is invok
1eee0 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 43  ed by */.  VdbeC
1eef0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 20  ursor *pCsr,    
1ef00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1ef10 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c 64  rsor to grab old
1ef20 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a  .* values from *
1ef30 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef50 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
1ef60 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
1ef70 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73  DELETE */.  cons
1ef80 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1efa0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a  atabase name */.
1efb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 61    /* Modified ta
1efe0 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65  ble */.  i64 iKe
1eff0 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y1,             
1f000 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
1f010 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f  ial key value */
1f020 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20  .  int iReg     
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66     /* Register f
1f050 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20  or new.* record 
1f060 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1f070 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69  *db = v->db;.  i
1f080 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 55  64 iKey2;.  PreU
1f090 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 3b  pdate preupdate;
1f0a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f0b0 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tbl = pTab->zNam
1f0c0 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  e;.  static cons
1f0d0 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 64  t u8 fakeSortOrd
1f0e0 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  er = 0;..  asser
1f0f0 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  t( db->pPreUpdat
1f100 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74  e==0 );.  memset
1f110 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c 20  (&preupdate, 0, 
1f120 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 65  sizeof(PreUpdate
1f130 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51  ));.  if( op==SQ
1f140 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a 20  LITE_UPDATE ){. 
1f150 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d     iKey2 = v->aM
1f160 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20  em[iReg].u.i;.  
1f170 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 32  }else{.    iKey2
1f180 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20   = iKey1;.  }.. 
1f190 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 6e   assert( pCsr->n
1f1a0 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f  Field==pTab->nCo
1f1b0 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 43  l .       || (pC
1f1c0 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62  sr->nField==pTab
1f1d0 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d  ->nCol+1 && op==
1f1e0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 26  SQLITE_DELETE &&
1f1f0 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a   iReg==-1).  );.
1f200 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d  .  preupdate.v =
1f210 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e   v;.  preupdate.
1f220 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70  pCsr = pCsr;.  p
1f230 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70  reupdate.op = op
1f240 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e  ;.  preupdate.iN
1f250 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  ewReg = iReg;.  
1f260 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
1f270 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65  o.db = db;.  pre
1f280 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65  update.keyinfo.e
1f290 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
1f2a0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
1f2b0 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 2d  o.nField = pTab-
1f2c0 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61  >nCol;.  preupda
1f2d0 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74  te.keyinfo.aSort
1f2e0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 61  Order = (u8*)&fa
1f2f0 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70  keSortOrder;.  p
1f300 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 3d  reupdate.iKey1 =
1f310 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 64   iKey1;.  preupd
1f320 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79  ate.iKey2 = iKey
1f330 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69  2;.  preupdate.i
1f340 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50 4b  PKey = pTab->iPK
1f350 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55  ey;..  db->pPreU
1f360 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61  pdate = &preupda
1f370 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70  te;.  db->xPreUp
1f380 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d  dateCallback(db-
1f390 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20  >pPreUpdateArg, 
1f3a0 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62  db, op, zDb, zTb
1f3b0 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29  l, iKey1, iKey2)
1f3c0 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ;.  db->pPreUpda
1f3d0 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  te = 0;.  sqlite
1f3e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75  3DbFree(db, preu
1f3f0 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a  pdate.aRecord);.
1f400 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
1f410 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
1f420 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76  .pUnpacked);.  v
1f430 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
1f440 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e  db, preupdate.pN
1f450 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69  ewUnpacked);.  i
1f460 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  f( preupdate.aNe
1f470 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  w ){.    int i;.
1f480 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f490 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b  Csr->nField; i++
1f4a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f4b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f4c0 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69  preupdate.aNew[i
1f4d0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ]);.    }.    sq
1f4e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1f4f0 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b  preupdate.aNew);
1f500 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1f510 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
1f520 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f  REUPDATE_HOOK */
1f530 0a                                               .