/ Hex Artifact Content
Login

Artifact 9c9571706aaf0e5debab5b01629ef569cde40920:


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 74   char *zTmp;.  t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
08c0: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
08d0: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
08e0: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
08f0: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0900: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
0910: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
0920: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
0930: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
0940: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
0950: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
0960: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0970: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0980: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0990: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
09a0: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
09b0: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
09c0: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
09d0: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
09e0: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
09f0: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a00: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0a10: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0a20: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0a30: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0a40: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0a50: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0a60: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0a70: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0a80: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0a90: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0aa0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0ab0: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0ac0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0ad0: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0ae0: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0af0: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b00: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0b10: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0b20: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0b30: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0b40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0b50: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0b60: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0b70: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0b80: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0b90: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0ba0: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0bb0: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0bc0: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0bd0: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0be0: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0bf0: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c00: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0c10: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0c20: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0c30: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0c40: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0c50: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0c60: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0c70: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0c80: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0c90: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0ca0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0cb0: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0cc0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0cd0: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0ce0: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0cf0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d00: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0d10: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0d20: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d30: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0d40: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0d50: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0d60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0d70: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0d80: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0d90: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0da0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0db0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0dc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0dd0: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0de0: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0df0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0e00: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71  p->nOpAlloc = sq
0e10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
0e20: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73  e(p->db, pNew)/s
0e30: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76  izeof(Op);.    v
0e40: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20  ->aOp = pNew;.  
0e50: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77  }.  return (pNew
0e60: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53   ? SQLITE_OK : S
0e70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a  QLITE_NOMEM);.}.
0e80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0e90: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
0ea0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
0eb0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
0ec0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
0ed0: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
0ee0: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
0ef0: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
0f00: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
0f10: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
0f20: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
0f30: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
0f40: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
0f50: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
0f60: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
0f70: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
0f80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0f90: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
0fa0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
0fb0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
0fc0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
0fd0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
0fe0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
0ff0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
1010: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
1020: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1030: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
1040: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
1060: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
1070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
1080: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
1090: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
10a0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
10b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10c0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
10d0: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
10e0: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
10f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1100: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1110: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1120: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
1130: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rand..*/.int sql
1140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56  ite3VdbeAddOp3(V
1150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1160: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
1170: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69  int p3){.  int i
1180: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
1190: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a  ..  i = p->nOp;.
11a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
11b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
11c0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
11d0: 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66   op>0 && op<0xff
11e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61   );.  if( p->pPa
11f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69  rse->nOpAlloc<=i
1200: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77   ){.    if( grow
1210: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 7b  OpArray(p, 1) ){
1220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
1240: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp++;.  pOp = &
1250: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70  p->aOp[i];.  pOp
1260: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f  ->opcode = (u8)o
1270: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30  p;.  pOp->p5 = 0
1280: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31  ;.  pOp->p1 = p1
1290: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32  ;.  pOp->p2 = p2
12a0: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33  ;.  pOp->p3 = p3
12b0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20  ;.  pOp->p4.p = 
12c0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  0;.  pOp->p4type
12d0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23   = P4_NOTUSED;.#
12e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
12f0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
1300: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d  ENTS.  pOp->zCom
1310: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ment = 0;.#endif
1320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1330: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62  EBUG.  if( p->db
1340: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1350: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20  _VdbeAddopTrace 
1360: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b  ){.    int jj, k
1370: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  k;.    Parse *pP
1380: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
1390: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d  ;.    for(jj=kk=
13a0: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43  0; jj<SQLITE_N_C
13b0: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a  OLCACHE; jj++){.
13c0: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f        struct yCo
13d0: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72  lCache *x = pPar
13e0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20  se->aColCache + 
13f0: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d  jj;.      if( x-
1400: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e  >iLevel>pParse->
1410: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78  iCacheLevel || x
1420: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74  ->iReg==0 ) cont
1430: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e  inue;.      prin
1440: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25  tf(" r[%d]={%d:%
1450: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d  d}", x->iReg, x-
1460: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c  >iTable, x->iCol
1470: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b  umn);.      kk++
1480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1490: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22  kk ) printf("\n"
14a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14b0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20  bePrintOp(0, i, 
14c0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
14d0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
14e0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65  kpoint();.  }.#e
14f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45  ndif.#ifdef VDBE
1500: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e  _PROFILE.  pOp->
1510: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f  cycles = 0;.  pO
1520: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  p->cnt = 0;.#end
1530: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1540: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20  _VDBE_COVERAGE. 
1550: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d   pOp->iSrcLine =
1560: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
1570: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn i;.}.int sql
1580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56  ite3VdbeAddOp0(V
1590: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b  dbe *p, int op){
15a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
15b0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
15c0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69  p, 0, 0, 0);.}.i
15d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
15e0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp1(Vdbe *p, in
15f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20  t op, int p1){. 
1600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1610: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1620: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e   p1, 0, 0);.}.in
1630: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  t sqlite3VdbeAdd
1640: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  Op2(Vdbe *p, int
1650: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74   op, int p1, int
1660: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   p2){.  return s
1670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1680: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1690: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  0);.}.../*.** Ad
16a0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
16b0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
16c0: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e   value as a poin
16d0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
16e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20  te3VdbeAddOp4(. 
16f0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
1700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20       /* Add the 
1710: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  opcode to this V
1720: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  M */.  int op,  
1730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1740: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a  e new opcode */.
1750: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20    int p1,       
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20        /* The P1 
1770: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1780: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20   p2,            
1790: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61   /* The P2 opera
17a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20  nd */.  int p3, 
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17c0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f  he P3 operand */
17d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17e0: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34  P4,    /* The P4
17f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1800: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20  t p4type        
1810: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20    /* P4 operand 
1820: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  type */.){.  int
1830: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1840: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1850: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1870: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34  eP4(p, addr, zP4
1880: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74  , p4type);.  ret
1890: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
18a0: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72  ** Add an OP_Par
18b0: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e  seSchema opcode.
18c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
18d0: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f  s broken out fro
18e0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
18f0: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69  AddOp4() since i
1900: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20  t needs to also 
1910: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c  needs to mark al
1920: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68  l btrees.** as h
1930: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e  aving been used.
1940: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72  .**.** The zWher
1950: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61  e string must ha
1960: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
1970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1980: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20  lloc()..** This 
1990: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b  routine will tak
19a0: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74  e ownership of t
19b0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d  he allocated mem
19c0: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ory..*/.void sql
19d0: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
19e0: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70  SchemaOp(Vdbe *p
19f0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20  , int iDb, char 
1a00: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20  *zWhere){.  int 
1a10: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  j;.  int addr = 
1a20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a30: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  3(p, OP_ParseSch
1a40: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b  ema, iDb, 0, 0);
1a50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1a60: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1a70: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
1a80: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
1a90: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
1aa0: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
1ab0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
1ac0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1ad0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1ae0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1af0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
1b00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
1b10: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
1b20: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
1b30: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
1b40: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
1b50: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b70: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
1b80: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
1b90: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
1ba0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1bb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
1bc0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
1bd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1bf0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
1c00: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
1c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
1c20: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
1c30: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
1c40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
1c50: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1c60: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
1c70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1c80: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
1c90: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
1ca0: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
1cb0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1cc0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1cd0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  new symbolic lab
1ce0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75  el for an instru
1cf0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79  ction that has y
1d00: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65  et to be.** code
1d10: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63  d.  The symbolic
1d20: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79   label is really
1d30: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65   just a negative
1d40: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a   number.  The.**
1d50: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73   label can be us
1d60: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c  ed as the P2 val
1d70: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69  ue of an operati
1d80: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e  on.  Later, when
1d90: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73  .** the label is
1da0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73   resolved to a s
1db0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c  pecific address,
1dc0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73   the VDBE will s
1dd0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69  can.** through i
1de0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73  ts operation lis
1df0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c  t and change all
1e00: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68   values of P2 wh
1e10: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65  ich match.** the
1e20: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20   label into the 
1e30: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73  resolved address
1e40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45  ..**.** The VDBE
1e50: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32   knows that a P2
1e60: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65   value is a labe
1e70: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73  l because labels
1e80: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e   are.** always n
1e90: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76  egative and P2 v
1ea0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73  alues are suppos
1eb0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  e to be non-nega
1ec0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  tive..** Hence, 
1ed0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61  a negative P2 va
1ee0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74  lue is a label t
1ef0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62  hat has yet to b
1f00: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a  e resolved..**.*
1f10: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * Zero is return
1f20: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29  ed if a malloc()
1f30: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73   fails..*/.int s
1f40: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
1f50: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  bel(Vdbe *v){.  
1f60: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50  Parse *p = v->pP
1f70: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20  arse;.  int i = 
1f80: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61  p->nLabel++;.  a
1f90: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
1fa0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1fb0: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28   );.  if( (i & (
1fc0: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  i-1))==0 ){.    
1fd0: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69  p->aLabel = sqli
1fe0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
1ff0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61  ee(p->db, p->aLa
2000: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20  bel, .          
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a               (i*
2030: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  2+1)*sizeof(p->a
2040: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a  Label[0]));.  }.
2050: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
2060: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
2070: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  [i] = -1;.  }.  
2080: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a  return -1-i;.}..
2090: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61  /*.** Resolve la
20a0: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68  bel "x" to be th
20b0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
20c0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
20d0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72  n to.** be inser
20e0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65  ted.  The parame
20f0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76  ter "x" must hav
2100: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  e been obtained 
2110: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20  from.** a prior 
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
2130: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a  dbeMakeLabel()..
2140: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2150: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2160: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b  Vdbe *v, int x){
2170: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d  .  Parse *p = v-
2180: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a  >pParse;.  int j
2190: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72   = -1-x;.  asser
21a0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
21b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
21c0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e    assert( j<p->n
21d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41  Label );.  if( A
21e0: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70  LWAYS(j>=0) && p
21f0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2200: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2210: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
2220: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
2230: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
2240: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2250: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2260: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
2270: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2280: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2290: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
22a0: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
22b0: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
22c0: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
22d0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
22e0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
22f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2300: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2310: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2320: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2330: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2340: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2350: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
2360: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
2370: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2380: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2390: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
23a0: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
23b0: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
23c0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
23d0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
23e0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
23f0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2400: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2410: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
2420: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
2450: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
2460: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2470: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2480: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2490: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
24a0: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
24b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
24c0: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
24d0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
24e0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
24f0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2500: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2510: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
2520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2530: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
2540: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2550: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
2560: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
2570: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2580: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2590: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
25a0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
25b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25c0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
25d0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
25e0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
25f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2600: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2610: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
2620: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
2650: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
2660: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
2670: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2680: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2690: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
26a0: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
26b0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
26c0: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
26d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
26e0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
26f0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2700: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2710: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2720: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
2740: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
2750: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
2760: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
2770: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
2780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2790: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
27a0: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
27b0: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
27c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
27d0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
27e0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
27f0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
2800: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
2810: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
2820: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
2830: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
2840: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
2850: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
2860: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
2870: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2890: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
28a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
28b0: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
28c0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
28d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28e0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
28f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
2900: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
2910: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
2920: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
2930: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
2940: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
2950: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
2960: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2970: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
2980: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
2990: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
29a0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
29b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
29c0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
29d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
29e0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
29f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
2a00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
2a10: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
2a20: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
2a30: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
2a40: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
2a50: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
2a60: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
2a70: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
2a80: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
2a90: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
2aa0: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
2ab0: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
2ac0: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
2ad0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2ae0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
2af0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
2b00: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
2b10: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
2b20: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
2b30: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
2b40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
2b50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
2b60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
2b70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
2b80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
2b90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
2ba0: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
2bb0: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
2bc0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
2bd0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a  constraint).**.*
2be0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
2bf0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
2c00: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
2c10: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
2c20: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
2c30: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
2c40: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
2c50: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
2c60: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
2c70: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
2c80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
2c90: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
2ca0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
2cb0: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
2cc0: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
2cd0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
2ce0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
2cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
2d00: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
2d10: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
2d20: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
2d30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2d40: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
2d50: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
2d60: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
2d70: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70  sAbort = 0;.  Op
2d80: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49   *pOp;.  VdbeOpI
2d90: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d  ter sIter;.  mem
2da0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73  set(&sIter, 0, s
2db0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20  izeof(sIter));. 
2dc0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20   sIter.v = v;.. 
2dd0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2de0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2df0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
2e00: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f   opcode = pOp->o
2e10: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f  pcode;.    if( o
2e20: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f  pcode==OP_Destro
2e30: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  y || opcode==OP_
2e40: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64  VUpdate || opcod
2e50: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23  e==OP_VRename .#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e70: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
2e80: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d      || (opcode==
2e90: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
2ea0: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
2eb0: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69  p->p2==1) .#endi
2ec0: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f  f.     || ((opco
2ed0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f  de==OP_Halt || o
2ee0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66  pcode==OP_HaltIf
2ef0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20  Null) .      && 
2f00: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d  ((pOp->p1&0xff)=
2f10: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2f20: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f  NT && pOp->p2==O
2f30: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b  E_Abort)).    ){
2f40: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20  .      hasAbort 
2f50: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2f70: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
2f80: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b  b, sIter.apSub);
2f90: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72  ..  /* Return tr
2fa0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d  ue if hasAbort==
2fb0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20  mayAbort. Or if 
2fc0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
2fd0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20   occurred..  ** 
2fe0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  If malloc failed
2ff0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65  , then the while
3000: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61  () loop above ma
3010: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61  y not have itera
3020: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ted.  ** through
3030: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64   all opcodes and
3040: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65   hasAbort may be
3050: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79   set incorrectly
3060: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  . Return.  ** tr
3070: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65  ue for this case
3080: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
3090: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20  assert() in the 
30a0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20  callers frame.  
30b0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e  ** from failing.
30c0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20    */.  return ( 
30d0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  v->db->mallocFai
30e0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d  led || hasAbort=
30f0: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23  =mayAbort );.}.#
3100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3110: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
3120: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3130: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
3140: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f  ./*.** Loop thro
3150: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20  ugh the program 
3160: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76  looking for P2 v
3170: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e  alues that are n
3180: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75  egative.** on ju
3190: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e  mp instructions.
31a0: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75    Each such valu
31b0: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52  e is a label.  R
31c0: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61  esolve the.** la
31d0: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74  bel by setting t
31e0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69  he P2 value to i
31f0: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a  ts correct non-z
3200: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
3210: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3220: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74   called once aft
3230: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
3240: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
3250: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c  d..**.** Variabl
3260: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20  e *pMaxFuncArgs 
3270: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61  is set to the ma
3280: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61  ximum value of a
3290: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a  ny P2 argument .
32a0: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63  ** to an OP_Func
32b0: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70  tion, OP_AggStep
32c0: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f   or OP_VFilter o
32d0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75  pcode. This is u
32e0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74  sed by .** sqlit
32f0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
3300: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64  ) to size the Vd
3310: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79  be.apArg[] array
3320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f  ..**.** The Op.o
3330: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20  pflags field is 
3340: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64  set on all opcod
3350: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
3360: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75  id resolveP2Valu
3370: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  es(Vdbe *p, int 
3380: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a  *pMaxFuncArgs){.
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33a0: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46  MaxArgs = *pMaxF
33b0: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70  uncArgs;.  Op *p
33c0: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  Op;.  Parse *pPa
33d0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b  rse = p->pParse;
33e0: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d  .  int *aLabel =
33f0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b   pParse->aLabel;
3400: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  .  p->readOnly =
3410: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64   1;.  p->bIsRead
3420: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f  er = 0;.  for(pO
3430: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e  p=p->aOp, i=p->n
3440: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  Op-1; i>=0; i--,
3450: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20   pOp++){.    u8 
3460: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3470: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f  code;..    /* NO
3480: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
3490: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
34a0: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20  awk when adding 
34b0: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
34c0: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68  ** cases from th
34d0: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20  is switch! */.  
34e0: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65    switch( opcode
34f0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
3500: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20  P_Function:.    
3510: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65    case OP_AggSte
3520: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  p: {.        if(
3530: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67   pOp->p5>nMaxArg
3540: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
3550: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20  Op->p5;.        
3560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
3570: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
3580: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
3590: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
35a0: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
35b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
35c0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
35d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
35e0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
35f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
3600: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
3610: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3620: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3630: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
3640: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3650: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
3660: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
3670: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
3680: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
3690: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
36a0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
36b0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
36c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
36d0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
36e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
36f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
3700: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
3710: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
3720: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
3730: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
3740: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
3750: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
3760: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3770: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
3780: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
3790: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
37a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
37b0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
37c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37d0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
37e0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
37f0: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
3800: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
3810: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
3820: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
3830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3840: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
3850: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
3870: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
3880: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
3890: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  xt: {.        pO
38a0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
38b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
38c0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t;.        pOp->
38d0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
38e0: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
38f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3900: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
3910: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3920: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
3930: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
3940: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
3950: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
3960: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3970: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
39a0: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
39b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
39c0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
39d0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
39e0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
39f0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
3a00: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
3a10: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70  rt( -1-pOp->p2<p
3a20: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
3a30: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
3a40: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e   aLabel[-1-pOp->
3a50: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  p2];.    }.  }. 
3a60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
3a70: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c  ->db, pParse->aL
3a80: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d  abel);.  pParse-
3a90: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70  >aLabel = 0;.  p
3aa0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20  Parse->nLabel = 
3ab0: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72  0;.  *pMaxFuncAr
3ac0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20  gs = nMaxArgs;. 
3ad0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52   assert( p->bIsR
3ae0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61  eader!=0 || DbMa
3af0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
3b00: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a  eeMask) );.}../*
3b10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
3b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
3b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
3b40: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  o be inserted..*
3b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3b60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62  eCurrentAddr(Vdb
3b70: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
3b80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
3b90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
3ba0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d  return p->nOp;.}
3bb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
3bc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
3bd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
3be0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
3bf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
3c00: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
3c10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
3c20: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
3c30: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
3c40: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
3c50: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
3c60: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
3c70: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
3c80: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
3c90: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
3ca0: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
3cb0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
3cc0: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
3cd0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
3ce0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3cf0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
3d00: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
3d10: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
3d20: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
3d30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
3d40: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
3d50: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
3d60: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
3d70: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
3d80: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
3d90: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
3da0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
3db0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
3dc0: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
3dd0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
3de0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
3df0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
3e00: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
3e10: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
3e20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
3e30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
3e40: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
3e50: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
3e60: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
3e70: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
3e80: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
3e90: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
3ea0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
3eb0: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
3ec0: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
3ed0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
3ee0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
3ef0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
3f00: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
3f10: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
3f20: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
3f30: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72  turn the.** addr
3f40: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
3f50: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64   operation added
3f60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
3f70: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64  VdbeAddOpList(Vd
3f80: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20  be *p, int nOp, 
3f90: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
3fa0: 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65   *aOp, int iLine
3fb0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b  no){.  int addr;
3fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3fd0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3fe0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
3ff0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
4000: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
4010: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
4020: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
4030: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
4040: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  ddr = p->nOp;.  
4050: 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30  if( ALWAYS(nOp>0
4060: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ) ){.    int i;.
4070: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63      VdbeOpList c
4080: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b  onst *pIn = aOp;
4090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
40a0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29  nOp; i++, pIn++)
40b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  {.      int p2 =
40c0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pIn->p2;.      
40d0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26  VdbeOp *pOut = &
40e0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a  p->aOp[i+addr];.
40f0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f        pOut->opco
4100: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65  de = pIn->opcode
4110: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31  ;.      pOut->p1
4120: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20   = pIn->p1;.    
4130: 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20    if( p2<0 ){.  
4140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
4150: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65  lite3OpcodePrope
4160: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65  rty[pOut->opcode
4170: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29  ] & OPFLG_JUMP )
4180: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
4190: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52  p2 = addr + ADDR
41a0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  (p2);.      }els
41b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  e{.        pOut-
41c0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20  >p2 = p2;.      
41d0: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33  }.      pOut->p3
41e0: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20   = pIn->p3;.    
41f0: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
4200: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
4210: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20     pOut->p4.p = 
4220: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70  0;.      pOut->p
4230: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
4240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
4250: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
4260: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e     pOut->zCommen
4270: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
4280: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
4290: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  _COVERAGE.      
42a0: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
42b0: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
42c0: 65 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c  e.      (void)iL
42d0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
42e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
42f0: 47 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64  G.      if( p->d
4300: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
4310: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65  E_VdbeAddopTrace
4320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4330: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
4340: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f  , i+addr, &p->aO
4350: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20  p[i+addr]);.    
4360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
4370: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e  .    p->nOp += n
4380: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Op;.  }.  return
4390: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   addr;.}../*.** 
43a0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
43b0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61   of the P1 opera
43c0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
43d0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
43e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
43f0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20  s useful when a 
4400: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73  large program is
4410: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a   loaded from a.*
4420: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75  * static array u
4430: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65  sing sqlite3Vdbe
4440: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65  AddOpList but we
4450: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a   want to make a.
4460: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61  ** few minor cha
4470: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67  nges to the prog
4480: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ram..*/.void sql
4490: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31  ite3VdbeChangeP1
44a0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
44b0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
44c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
44d0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e    if( ((u32)p->n
44e0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20  Op)>addr ){.    
44f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20  p->aOp[addr].p1 
4500: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = val;.  }.}../*
4510: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
4520: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f  alue of the P2 o
4530: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
4540: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
4550: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
4560: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  ne is useful for
4570: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20   setting a jump 
4580: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a  destination..*/.
4590: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
45a0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
45b0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
45c0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20  val){.  assert( 
45d0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28  p!=0 );.  if( ((
45e0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72  u32)p->nOp)>addr
45f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61   ){.    p->aOp[a
4600: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20  ddr].p2 = val;. 
4610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
4620: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4630: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66  the P3 operand f
4640: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4650: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
4660: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
4670: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
4680: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
4690: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
46a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
46b0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
46c0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
46d0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p3 = val;.  }
46e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
46f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4700: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P5 operand for
4710: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
4720: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72  ly.** added oper
4730: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
4740: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
4750: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76  P5(Vdbe *p, u8 v
4760: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  al){.  assert( p
4770: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
4780: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  aOp ){.    asser
4790: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
47a0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
47b0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20  -1].p5 = val;.  
47c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
47d0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
47e0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
47f0: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
4800: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4810: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4820: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
4830: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
4840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4850: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
4860: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
4870: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
4880: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
4890: 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73  nOp);.  p->pPars
48a0: 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d  e->iFixedOp = p-
48b0: 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  >nOp - 1;.}.../*
48c0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
48d0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
48e0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
48f0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
4900: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
4910: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
4920: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
4930: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
4940: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
4950: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
4960: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
4970: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
4980: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
4990: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
49a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
49b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
49c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
49d0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
49e0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
49f0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
4a00: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
4a10: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
4a20: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
4a30: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
4a40: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
4a50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
4a60: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
4a70: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
4a80: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
4a90: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
4aa0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
4ab0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
4ac0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
4ad0: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
4ae0: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
4af0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
4b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4b10: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
4b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4b30: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4b40: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
4b50: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
4b60: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
4b70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
4b80: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
4b90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4bb0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
4bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
4bd0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4be0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
4bf0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
4c00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4c10: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
4c20: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
4c30: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
4c40: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
4c50: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
4c60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4c70: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
4c80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4c90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
4cb0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
4cc0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
4cd0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
4ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
4cf0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
4d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
4d10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
4d20: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4d40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  ee(db, p);.     
4d50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
4d60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4d70: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a    case P4_VTAB :
4d80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4d90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4da0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
4db0: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
4dc0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )p4);.        br
4dd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4de0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
4df0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61  Free the space a
4e00: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70  llocated for aOp
4e10: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75   and any p4 valu
4e20: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  es allocated for
4e30: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20   the.** opcodes 
4e40: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
4e50: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20  . If aOp is not 
4e60: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d  NULL it is assum
4e70: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a  ed to contain .*
4e80: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a  * nOp entries. .
4e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4ea0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
4eb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a  qlite3 *db, Op *
4ec0: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20  aOp, int nOp){. 
4ed0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20   if( aOp ){.    
4ee0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72  Op *pOp;.    for
4ef0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61  (pOp=aOp; pOp<&a
4f00: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b  Op[nOp]; pOp++){
4f10: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
4f20: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
4f30: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65  Op->p4.p);.#ifde
4f40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4f50: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
4f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4f70: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43  Free(db, pOp->zC
4f80: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20  omment);.#endif 
4f90: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20      .    }.  }. 
4fa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4fb0: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, aOp);.}../*.*
4fc0: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72  * Link the SubPr
4fd0: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73  ogram object pas
4fe0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
4ff0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20  d argument into 
5000: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69  the linked.** li
5010: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50  st at Vdbe.pSubP
5020: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73  rogram. This lis
5030: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c  t is used to del
5040: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67  ete all sub-prog
5050: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77  ram.** objects w
5060: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f  hen the VM is no
5070: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64   longer required
5080: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5090: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67  3VdbeLinkSubProg
50a0: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ram(Vdbe *pVdbe,
50b0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b   SubProgram *p){
50c0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56  .  p->pNext = pV
50d0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20  dbe->pProgram;. 
50e0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d   pVdbe->pProgram
50f0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = p;.}../*.** C
5100: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65  hange the opcode
5110: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50   at addr into OP
5120: 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71  _Noop.*/.void sq
5130: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5140: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
5150: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20  nt addr){.  if( 
5160: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20  addr<p->nOp ){. 
5170: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d     VdbeOp *pOp =
5180: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
5190: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
51a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65  = p->db;.    fre
51b0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74  eP4(db, pOp->p4t
51c0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b  ype, pOp->p4.p);
51d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  .    memset(pOp,
51e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
51f0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70  ]));.    pOp->op
5200: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
5210: 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d      if( addr==p-
5220: 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d  >nOp-1 ) p->nOp-
5230: 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
5240: 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73 74 20  Remove the last 
5250: 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65 64 0a  opcode inserted.
5260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
5270: 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63  beDeletePriorOpc
5280: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20  ode(Vdbe *p, u8 
5290: 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e  op){.  if( (p->n
52a0: 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65  Op-1)>(p->pParse
52b0: 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70  ->iFixedOp) && p
52c0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
52d0: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20  opcode==op ){.  
52e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
52f0: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
5300: 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  nOp-1);.    retu
5310: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 1;.  }else{. 
5320: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
5340: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
5350: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P4 operand for
5360: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
5370: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
5380: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
5390: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20  ul when a large 
53a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65  program is loade
53b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74  d from a.** stat
53c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73  ic array using s
53d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
53e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20  ist but we want 
53f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77  to make a.** few
5400: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74   minor changes t
5410: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a  o the program..*
5420: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65  *.** If n>=0 the
5430: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64  n the P4 operand
5440: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61   is dynamic, mea
5450: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79  ning that a copy
5460: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e   of.** the strin
5470: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d  g is made into m
5480: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
5490: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
54a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65  oc()..** A value
54b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63   of n==0 means c
54c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34  opy bytes of zP4
54d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75   up to and inclu
54e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73  ding the.** firs
54f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66  t null byte.  If
5500: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e   n>0 then copy n
5510: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e  +1 bytes of zP4.
5520: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61  .** .** Other va
5530: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54  lues of n (P4_ST
5540: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  ATIC, P4_COLLSEQ
5550: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20   etc.) indicate 
5560: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a  that zP4 points.
5570: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f  ** to a string o
5580: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  r structure that
5590: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
55a0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20  o exist for the 
55b0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74  lifetime of.** t
55c0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73  he Vdbe. In thes
55d0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a  e cases we can j
55e0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69  ust copy the poi
55f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  nter..**.** If a
5600: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67  ddr<0 then chang
5610: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74  e P4 on the most
5620: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
5630: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ed instruction..
5640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5650: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65  dbeChangeP4(Vdbe
5660: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63   *p, int addr, c
5670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20  onst char *zP4, 
5680: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f  int n){.  Op *pO
5690: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
56a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ;.  assert( p!=0
56b0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   );.  db = p->db
56c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
56d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
56e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70  _INIT );.  if( p
56f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp==0 || db->
5700: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
5710: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54      if( n!=P4_VT
5720: 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  AB ){.      free
5730: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
5740: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
5750: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5760: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
5770: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61   p->nOp>0 );.  a
5780: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e  ssert( addr<p->n
5790: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72  Op );.  if( addr
57a0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d  <0 ){.    addr =
57b0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d   p->nOp - 1;.  }
57c0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
57d0: 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74  [addr];.  assert
57e0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
57f0: 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20 20  4_NOTUSED.      
5800: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   || pOp->p4type=
5810: 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20 20  =P4_INT32.      
5820: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d   || pOp->p4type=
5830: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20  =P4_KEYINFO );. 
5840: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
5850: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
5860: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70  .p);.  pOp->p4.p
5870: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50   = 0;.  if( n==P
5880: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
5890: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
58a0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
58b0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
58c0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
58d0: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
58e0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
58f0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
5900: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
5910: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
5920: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
5930: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
5940: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
5950: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70   zP4==0 ){.    p
5960: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
5970: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
5980: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65  P4_NOTUSED;.  }e
5990: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45  lse if( n==P4_KE
59a0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70  YINFO ){.    pOp
59b0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29  ->p4.p = (void*)
59c0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  zP4;.    pOp->p4
59d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46  type = P4_KEYINF
59e0: 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  O;.  }else if( n
59f0: 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20  ==P4_VTAB ){.   
5a00: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
5a10: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
5a20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54  ->p4type = P4_VT
5a30: 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AB;.    sqlite3V
5a40: 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20  tabLock((VTable 
5a50: 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65  *)zP4);.    asse
5a60: 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a  rt( ((VTable *)z
5a70: 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29  P4)->db==p->db )
5a80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c  ;.  }else if( n<
5a90: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
5aa0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b  .p = (void*)zP4;
5ab0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5ac0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29   = (signed char)
5ad0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
5ae0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73  if( n==0 ) n = s
5af0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
5b00: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  P4);.    pOp->p4
5b10: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  .z = sqlite3DbSt
5b20: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34  rNDup(p->db, zP4
5b30: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  , n);.    pOp->p
5b40: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d  4type = P4_DYNAM
5b50: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  IC;.  }.}../*.**
5b60: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74   Set the P4 on t
5b70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
5b80: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f   added opcode to
5b90: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72   the KeyInfo for
5ba0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69   the.** index gi
5bb0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
5bc0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
5bd0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
5be0: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
5bf0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
5c00: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
5c10: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20  ssert( v!=0 );. 
5c20: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30   assert( pIdx!=0
5c30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   );.  sqlite3Vdb
5c40: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c  eChangeP4(v, -1,
5c50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
5c60: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50  eyInfoOfIndex(pP
5c70: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20  arse, pIdx),.   
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
5ca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
5cb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
5cc0: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43  COMMENTS./*.** C
5cd0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e  hange the commen
5ce0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
5cf0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73  cently coded ins
5d00: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a  truction.  Or.**
5d10: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20   insert a No-op 
5d20: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d  and add the comm
5d30: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20  ent to that new 
5d40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68  instruction.  Th
5d50: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20  is.** makes the 
5d60: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72  code easier to r
5d70: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67  ead during debug
5d80: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  ging.  None of t
5d90: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69  his happens.** i
5da0: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62  n a production b
5db0: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uild..*/.static 
5dc0: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e  void vdbeVCommen
5dd0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
5de0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
5df0: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61  va_list ap){.  a
5e00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
5e10: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a  || p->aOp==0 );.
5e20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5e30: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d  ==0 || p->aOp[p-
5e40: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
5e50: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61  ==0 || p->db->ma
5e60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
5e70: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  if( p->nOp ){.  
5e80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70    assert( p->aOp
5e90: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
5ea0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e  bFree(p->db, p->
5eb0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5ec0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e  omment);.    p->
5ed0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
5ee0: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33  omment = sqlite3
5ef0: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  VMPrintf(p->db, 
5f00: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
5f10: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  }.}.void sqlite3
5f20: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65  VdbeComment(Vdbe
5f30: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
5f40: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
5f50: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
5f60: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f  if( p ){.    va_
5f70: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
5f80: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
5f90: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
5fa0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
5fb0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  (ap);.  }.}.void
5fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70   sqlite3VdbeNoop
5fd0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
5fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
5ff0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6000: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6010: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
6020: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50  VdbeAddOp0(p, OP
6030: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73  _Noop);.    va_s
6040: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
6050: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
6060: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
6070: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
6080: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ap);.  }.}.#endi
6090: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  f  /* NDEBUG */.
60a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
60b0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a  DBE_COVERAGE./*.
60c0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
60d0: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65   if the iSrcLine
60e0: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70   field for the p
60f0: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20  reviously coded 
6100: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
6110: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6120: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64  SetLineNumber(Vd
6130: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65  be *v, int iLine
6140: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
6150: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72  GetOp(v,-1)->iSr
6160: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d  cLine = iLine;.}
6170: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6180: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20  E_VDBE_COVERAGE 
6190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
61a0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   the opcode for 
61b0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e  a given address.
61c0: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73    If the address
61d0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20   is -1, then.** 
61e0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  return the most 
61f0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
6200: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  d opcode..**.** 
6210: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
6220: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73  cation error has
6230: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20   occurred prior 
6240: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f  to the calling o
6250: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  f this.** routin
6260: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  e, then a pointe
6270: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62  r to a dummy Vdb
6280: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75  eOp will be retu
6290: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f  rned.  That opco
62a0: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c  de.** is readabl
62b0: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62  e but not writab
62c0: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73  le, though it is
62d0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61   cast to a writa
62e0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  ble value..** Th
62f0: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75  e return of a du
6300: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77  mmy opcode allow
6310: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  s the call to co
6320: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69  ntinue functioni
6330: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f  ng.** after a OO
6340: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
6350: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
6360: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
6370: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
6380: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
6390: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
63a0: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
63b0: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
63c0: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
63d0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
63e0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
63f0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
6400: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
6410: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
6420: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
6430: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
6440: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
6450: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
6460: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
6470: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
6480: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
6490: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
64a0: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
64b0: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
64c0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
64d0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
64e0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
64f0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
6500: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
6510: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
6520: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
6530: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
6540: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
6550: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
6560: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6570: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6580: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
6590: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
65a0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
65b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
65c0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
65d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
65e0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
65f0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
6600: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6610: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
6620: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
6630: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
6640: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
6650: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
6660: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
6670: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
6680: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
6690: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
66a0: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
66b0: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
66c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
66d0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
66e0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
66f0: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
6700: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
6710: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
6720: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
6730: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
6740: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
6750: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
6760: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
6770: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
6780: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
6790: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
67a0: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
67b0: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
67c0: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
67d0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
67e0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
67f0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
6800: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
6810: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
6820: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
6830: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
6840: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
6850: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
6860: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
6870: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
6880: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
6890: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
68a0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
68b0: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
68c0: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
68d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
68e0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
68f0: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
6900: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
6910: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
6920: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
6930: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
6940: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
6950: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
6960: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
6970: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
6980: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
6990: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
69a0: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
69b0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
69c0: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
69d0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
69e0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
69f0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
6a00: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
6a10: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
6a20: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
6a30: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
6a40: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
6a50: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
6a60: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
6a70: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
6a80: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
6a90: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
6aa0: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
6ab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
6ac0: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
6ad0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
6ae0: 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  , jj;.  zOpName 
6af0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
6b00: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
6b10: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
6b20: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
6b30: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
6b40: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
6b50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
6b60: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
6b70: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
6b80: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
6b90: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
6ba0: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
6bb0: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
6bc0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
6bd0: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
6be0: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
6bf0: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
6c00: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
6c10: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
6c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
6c30: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
6c40: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
6c50: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
6c60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
6c70: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
6c80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6c90: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6ca0: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
6cb0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
6cc0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
6cd0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
6ce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
6cf0: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
6d00: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
6d10: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
6d20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
6d30: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
6d40: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
6d50: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
6d60: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
6d70: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
6d80: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
6d90: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
6da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
6db0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
6dc0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
6dd0: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
6de0: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
6df0: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
6e00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6e10: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6e20: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
6e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6e40: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
6e50: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
6e60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6e70: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
6e80: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
6e90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6ea0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
6eb0: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
6ec0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
6ed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6ee0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
6ef0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
6f00: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
6f10: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
6f20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
6f30: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
6f40: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
6f50: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
6f60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
6f70: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
6f80: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
6f90: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
6fa0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6fb0: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
6fc0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
6fd0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
6fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
6ff0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7000: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
7010: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
7020: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
7030: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
7040: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
7050: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
7060: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
7070: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
7080: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
7090: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
70a0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
70b0: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
70c0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
70d0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
70e0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
70f0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7100: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
7110: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
7120: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7130: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 66  E_DEBUG */...#if
7140: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7150: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c  _OMIT_EXPLAIN) |
7160: 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  | !defined(NDEBU
7170: 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66  G) \.     || def
7180: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
7190: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
71a0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
71b0: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
71c0: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
71d0: 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74  s the P4 paramet
71e0: 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65  er for an opcode
71f0: 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66  ..** Use zTemp f
7200: 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20  or any required 
7210: 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72  temporary buffer
7220: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7230: 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50  c char *displayP
7240: 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20  4(Op *pOp, char 
7250: 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d  *zTemp, int nTem
7260: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20  p){.  char *zP4 
7270: 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 72  = zTemp;.  asser
7280: 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a  t( nTemp>=20 );.
7290: 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 70    switch( pOp->p
72a0: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  4type ){.    cas
72b0: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a  e P4_KEYINFO: {.
72c0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a        int i, j;.
72d0: 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
72e0: 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70  KeyInfo = pOp->p
72f0: 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  4.pKeyInfo;.    
7300: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
7310: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
7320: 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
7330: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7340: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 22  p, zTemp, "k(%d"
7350: 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  , pKeyInfo->nFie
7360: 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 73  ld);.      i = s
7370: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7380: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f 72  Temp);.      for
7390: 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f  (j=0; j<pKeyInfo
73a0: 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a  ->nField; j++){.
73b0: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
73c0: 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e 66  *pColl = pKeyInf
73d0: 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  o->aColl[j];.   
73e0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
73f0: 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f  *zColl = pColl ?
7400: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20   pColl->zName : 
7410: 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 69  "nil";.        i
7420: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
7430: 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20  rlen30(zColl);. 
7440: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 20         if( n==6 
7450: 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c  && memcmp(zColl,
7460: 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 29  "BINARY",6)==0 )
7470: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
7480: 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 20  l = "B";.       
7490: 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20     n = 1;.      
74a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
74b0: 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a 20  i+n>nTemp-6 ){. 
74c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
74d0: 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22  &zTemp[i],",..."
74e0: 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ,4);.          b
74f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7500: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b          zTemp[i+
7510: 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20  +] = ',';.      
7520: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
7530: 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 7b  aSortOrder[j] ){
7540: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70  .          zTemp
7550: 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 20  [i++] = '-';.   
7560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
7570: 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c  emcpy(&zTemp[i],
7580: 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20   zColl, n+1);.  
7590: 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20        i += n;.  
75a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
75b0: 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20  p[i++] = ')';.  
75c0: 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30      zTemp[i] = 0
75d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
75e0: 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20  i<nTemp );.     
75f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7600: 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45    case P4_COLLSE
7610: 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  Q: {.      CollS
7620: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d  eq *pColl = pOp-
7630: 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  >p4.pColl;.     
7640: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7650: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7660: 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c  "(%.20s)", pColl
7670: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
7680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7690: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46   case P4_FUNCDEF
76a0: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65  : {.      FuncDe
76b0: 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70  f *pDef = pOp->p
76c0: 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73  4.pFunc;.      s
76d0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
76e0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
76f0: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
7700: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
7710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7720: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7730: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
7740: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7750: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7760: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
7770: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
7780: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7790: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
77a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
77b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
77c0: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
77d0: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
77e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
77f0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
7800: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7810: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7820: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
7830: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
7840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7850: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
7860: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
7870: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
7880: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
7890: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
78a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
78b0: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
78c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
78d0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
78e0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
78f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7900: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
7910: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
7920: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
7930: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
7940: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
7950: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7960: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7970: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
7980: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
7990: 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  if( pMem->flags 
79a0: 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  & MEM_Null ){.  
79b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
79c0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
79d0: 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  emp, "NULL");.  
79e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
79f0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
7a00: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f  >flags & MEM_Blo
7a10: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34  b );.        zP4
7a20: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20   = "(blob)";.   
7a30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7a40: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
7a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7a60: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
7a70: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20  e P4_VTAB: {.   
7a80: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20     sqlite3_vtab 
7a90: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34  *pVtab = pOp->p4
7aa0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20  .pVtab->pVtab;. 
7ab0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ac0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7ad0: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22  mp, "vtab:%p:%p"
7ae0: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e  , pVtab, pVtab->
7af0: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20  pModule);.      
7b00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
7b10: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
7b20: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7b50: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20   "intarray");.  
7b60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b70: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42  .    case P4_SUB
7b80: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20  PROGRAM: {.     
7b90: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ba0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7bb0: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20  "program");.    
7bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7bd0: 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e     case P4_ADVAN
7be0: 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d  CE: {.      zTem
7bf0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
7c00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7c10: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
7c20: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
7c30: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
7c40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
7c50: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
7c60: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
7c70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7c80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50    }.  assert( zP
7c90: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
7ca0: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   zP4;.}.#endif..
7cb0: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f  /*.** Declare to
7cc0: 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 74   the Vdbe that t
7cd0: 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20  he BTree object 
7ce0: 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73  at db->aDb[i] is
7cf0: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   used..**.** The
7d00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
7d10: 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f  ents need to kno
7d20: 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65  w in advance the
7d30: 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66   complete set of
7d40: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
7d50: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c  abases that will
7d60: 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b   be use.  A mask
7d70: 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 61   of these databa
7d80: 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61  ses.** is mainta
7d90: 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65  ined in p->btree
7da0: 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f  Mask.  The p->lo
7db0: 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20  ckMask value is 
7dc0: 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a  the subset of.**
7dd0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66   p->btreeMask of
7de0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
7df0: 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c  will require a l
7e00: 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ock..*/.void sql
7e10: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
7e20: 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  e(Vdbe *p, int i
7e30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  ){.  assert( i>=
7e40: 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44  0 && i<p->db->nD
7e50: 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65  b && i<(int)size
7e60: 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b  of(yDbMask)*8 );
7e70: 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e  .  assert( i<(in
7e80: 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65  t)sizeof(p->btre
7e90: 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62  eMask)*8 );.  Db
7ea0: 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65  MaskSet(p->btree
7eb0: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20  Mask, i);.  if( 
7ec0: 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42  i!=1 && sqlite3B
7ed0: 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e  treeSharable(p->
7ee0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20  db->aDb[i].pBt) 
7ef0: 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
7f00: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29  (p->lockMask, i)
7f10: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65  ;.  }.}..#if !de
7f20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7f30: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
7f40: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
7f50: 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SAFE>0./*.** If 
7f60: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
7f70: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
7f80: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
7f90: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
7fa0: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
7fb0: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
7fc0: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
7fd0: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
7fe0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
7ff0: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
8000: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
8010: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
8020: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
8030: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
8040: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
8050: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
8060: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
8070: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
8080: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
8090: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
80a0: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
80b0: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
80c0: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
80d0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
80e0: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
80f0: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
8100: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
8110: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
8120: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
8130: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
8140: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
8150: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
8160: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
8170: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
8180: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
8190: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
81a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
81b0: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
81c0: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
81d0: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
81e0: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
81f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
8200: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
8210: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
8220: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
8230: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
8240: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
8250: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
8260: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
8270: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
8280: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
8290: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
82a0: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
82b0: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
82c0: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
82d0: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
82e0: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
82f0: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
8300: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
8310: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
8320: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
8330: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
8340: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
8350: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
8360: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
8370: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
8380: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
8390: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
83a0: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
83b0: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
83c0: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
83d0: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
83e0: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
83f0: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
8400: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
8410: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
8420: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
8430: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
8440: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
8450: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
8460: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
8470: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
8480: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
8490: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
84a0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
84b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
84c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
84d0: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
84e0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
84f0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
8500: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
8510: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
8520: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
8530: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
8540: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8550: 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  VdbeLeave(Vdbe *
8560: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8570: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
8580: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
8590: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
85a0: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
85b0: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
85c0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
85d0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
85e0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
85f0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
8600: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
8610: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
8620: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
8630: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
8640: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
8650: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
8660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
8670: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
8680: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
8690: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
86a0: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
86b0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
86c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
86d0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
86e0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
86f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8700: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
8710: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
8720: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
8730: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
8740: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
8750: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
8760: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
8770: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
8780: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
8790: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
87a0: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
87b0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
87c0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
87d0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
87e0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
87f0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
8800: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
8810: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8820: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
8830: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
8840: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
8850: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
8860: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
8870: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
8880: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
8890: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
88a0: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
88b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
88c0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
88d0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
88e0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
88f0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
8900: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
8910: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
8920: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
8930: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
8940: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
8950: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
8960: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
8970: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
8980: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
8990: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
89a0: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
89b0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
89c0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
89d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
89e0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
89f0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
8a00: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
8a10: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
8a20: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
8a30: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
8a40: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
8a50: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  d;.    sqlite3 *
8a60: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
8a70: 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  u8 malloc_failed
8a80: 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
8a90: 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  led;.    if( db-
8aa0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
8ab0: 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 3d  .      for(pEnd=
8ac0: 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  &p[N]; p<pEnd; p
8ad0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
8ae0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
8af0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
8b00: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
8b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
8b20: 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45  pEnd=&p[N]; p<pE
8b30: 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20  nd; p++){.      
8b40: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d  assert( (&p[1])=
8b50: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62  =pEnd || p[0].db
8b60: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20  ==p[1].db );.   
8b70: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8b80: 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e  e3VdbeCheckMemIn
8b90: 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a  variants(p) );..
8ba0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
8bb0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e  ock is really an
8bc0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e   inlined version
8bd0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d   of sqlite3VdbeM
8be0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20  emRelease().    
8bf0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20    ** that takes 
8c00: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65  advantage of the
8c10: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d   fact that the m
8c20: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65  emory cell value
8c30: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65   is .      ** be
8c40: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  ing set to NULL 
8c50: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20  after releasing 
8c60: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f  any dynamic reso
8c70: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a  urces..      **.
8c80: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73        ** The jus
8c90: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64  tification for d
8ca0: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20  uplicating code 
8cb0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e  is that accordin
8cc0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63  g to .      ** c
8cd0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63  allgrind, this c
8ce0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20  auses a certain 
8cf0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74  test case to hit
8d00: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20   the CPU 4.7 .  
8d10: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c      ** percent l
8d20: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20  ess (x86 linux, 
8d30: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e  gcc version 4.1.
8d40: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20  2, -O6) than if 
8d50: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
8d60: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65  3MemRelease() we
8d70: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68  re called from h
8d80: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74  ere. With -O2, t
8d90: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20  his jumps.      
8da0: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e  ** to 6.6 percen
8db0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65  t. The test case
8dc0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30   is inserting 10
8dd0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74  00 rows into a t
8de0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77  able .      ** w
8df0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75  ith no indexes u
8e00: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72  sing a single pr
8e10: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74  epared INSERT st
8e20: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20  atement, bind() 
8e30: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65  .      ** and re
8e40: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61  set(). Inserts a
8e50: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20  re grouped into 
8e60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  a transaction.. 
8e70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65       */.      te
8e80: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
8e90: 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20   & MEM_Agg );.  
8ea0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
8eb0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e  >flags & MEM_Dyn
8ec0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
8ed0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
8ee0: 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20  EM_Frame );.    
8ef0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
8f00: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
8f10: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
8f20: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67  ->flags&(MEM_Agg
8f30: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61  |MEM_Dyn|MEM_Fra
8f40: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29  me|MEM_RowSet) )
8f50: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8f60: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
8f70: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  p);.      }else 
8f80: 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 29  if( p->zMalloc )
8f90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
8fb0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
8fc0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b   p->zMalloc = 0;
8fd0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
8fe0: 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  p->flags = MEM_U
8ff0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 0a  ndefined;.    }.
9000: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
9010: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
9020: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
9030: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
9040: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
9050: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
9060: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
9070: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
9080: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
9090: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
90a0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
90b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
90c0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
90d0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
90e0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
90f0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
9100: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
9110: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
9120: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
9130: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
9140: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9150: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
9160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
9170: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
9180: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
9190: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
91a0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
91b0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
91c0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
91d0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
91e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
91f0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
9200: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
9210: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
9220: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
9230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
9240: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
9250: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
9260: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
9270: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
9280: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
9290: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
92a0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
92b0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
92c0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
92d0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
92e0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
92f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
9300: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
9310: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
9320: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
9330: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
9340: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
9350: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
9360: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
9370: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
9380: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
9390: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
93a0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
93b0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
93c0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
93d0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
93e0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
93f0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
9400: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
9410: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
9420: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
9430: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
9440: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
9450: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
9460: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9480: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
9490: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
94c0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
94d0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
94e0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9510: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
9520: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
9530: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
9540: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9550: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
9560: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
9570: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
95a0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
95b0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
95c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
95d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
95f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9600: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9630: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
9640: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
9670: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
9680: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
9690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
96a0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
96b0: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
96c0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
96d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
96e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
96f0: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
9700: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
9710: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
9720: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
9730: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9740: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
9750: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
9760: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
9770: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
9780: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
9790: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
97a0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
97b0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
97c0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
97d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
97e0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
97f0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
9800: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
9810: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
9820: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
9830: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
9840: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
9850: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
9860: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
9870: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
9880: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
9890: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
98a0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
98b0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
98c0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
98d0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
98e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
98f0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
9900: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
9910: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
9920: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
9930: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
9940: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
9950: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
9960: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
9970: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
9980: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
9990: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
99a0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
99b0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
99c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
99d0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
99e0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
99f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
9a00: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
9a10: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
9a20: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
9a30: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
9a40: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
9a50: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
9a60: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
9a70: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
9a80: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
9a90: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
9aa0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
9ab0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
9ac0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
9ad0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
9ae0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
9af0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
9b00: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
9b10: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
9b20: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
9b30: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
9b40: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
9b50: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
9b60: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
9b70: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
9b80: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
9b90: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
9ba0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
9bb0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
9bc0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
9bd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
9be0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
9bf0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
9c00: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
9c10: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
9c20: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
9c30: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
9c40: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
9c50: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
9c60: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
9c70: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
9c80: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
9c90: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
9ca0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
9cb0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
9cc0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
9cd0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
9ce0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
9cf0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
9d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
9d10: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
9d20: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
9d30: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
9d40: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
9d50: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
9d60: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
9d70: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
9d80: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
9d90: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
9da0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
9db0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
9dc0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9dd0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
9de0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
9df0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
9e00: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
9e10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
9e20: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
9e30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
9e40: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
9e50: 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
9e60: 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  db, "%s", sqlite
9e70: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
9e80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
9e90: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
9ea0: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
9eb0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
9ec0: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
9ed0: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
9ee0: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
9ef0: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
9f00: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
9f10: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
9f20: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
9f30: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
9f40: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
9f50: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
9f60: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
9f70: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
9f80: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
9f90: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
9fa0: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
9fb0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
9fc0: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
9fd0: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
9fe0: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
9ff0: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
a000: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
a010: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
a020: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
a030: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
a040: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
a050: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
a060: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a070: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
a080: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a0b0: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
a0c0: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
a0d0: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
a0e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
a0f0: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
a100: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
a110: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
a120: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a130: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
a140: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
a150: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
a160: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
a170: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
a180: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
a190: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
a1a0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
a1b0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
a1c0: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
a1d0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
a1e0: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
a1f0: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
a200: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
a210: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
a220: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
a230: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
a240: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
a250: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
a260: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
a270: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
a280: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
a290: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
a2a0: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
a2b0: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
a2c0: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
a2d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a2e0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
a2f0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
a300: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
a310: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
a320: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
a330: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
a340: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
a350: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
a360: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
a370: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
a380: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
a390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a3a0: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
a3b0: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
a3c0: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
a3d0: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
a3e0: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
a3f0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
a400: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
a410: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
a420: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
a430: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
a440: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
a450: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
a460: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
a470: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
a480: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
a490: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a4a0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
a4b0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a4c0: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
a4d0: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4f0: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
a500: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a510: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
a520: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
a530: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
a560: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
a570: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
a580: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
a590: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
a5a0: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a5c0: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
a5d0: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
a5e0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65  3VdbeMemGrow(pMe
a5f0: 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 20  m, 32, 0) ){    
a600: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f          /* P4 */
a610: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a620: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
a630: 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
a640: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a650: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d  .    }.    pMem-
a660: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
a670: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a  |MEM_Term;.    z
a680: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70  P4 = displayP4(p
a690: 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29  Op, pMem->z, 32)
a6a0: 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70  ;.    if( zP4!=p
a6b0: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  Mem->z ){.      
a6c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65  sqlite3VdbeMemSe
a6d0: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20  tStr(pMem, zP4, 
a6e0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
a6f0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
a700: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
a710: 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20  em->z!=0 );.    
a720: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69    pMem->n = sqli
a730: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d  te3Strlen30(pMem
a740: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  ->z);.      pMem
a750: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
a760: 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  TF8;.    }.    p
a770: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20  Mem++;..    if( 
a780: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
a790: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
a7a0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d  e3VdbeMemGrow(pM
a7b0: 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 20  em, 4, 0) ){.   
a7c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a7d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a7e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
a7f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
a800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
a810: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
a820: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
a830: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
a840: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a850: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
a860: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
a870: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
a880: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
a890: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a8a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
a8b0: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
a8c0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
a8d0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
a8e0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
a8f0: 47 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c 20  Grow(pMem, 500, 
a900: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  0) ){.        as
a910: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
a920: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a930: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a940: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
a950: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  }.      pMem->fl
a960: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
a970: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
a980: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43  em->n = displayC
a990: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
a9a0: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a   pMem->z, 500);.
a9b0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
a9c0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
a9d0: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d  else.      pMem-
a9e0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
a9f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
aa00: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
aa10: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ent */.#endif.  
aa20: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73    }..    p->nRes
aa30: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28  Column = 8 - 4*(
aa40: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20  p->explain-1);. 
aa50: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74     p->pResultSet
aa60: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a   = &p->aMem[1];.
aa70: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
aa80: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
aa90: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a  SQLITE_ROW;.  }.
aaa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
aab0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
aac0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
aad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aae0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
aaf0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61   the SQL that wa
ab00: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
ab10: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61  te a VDBE progra
ab20: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
ab30: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56  e3VdbePrintSql(V
ab40: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74  dbe *p){.  const
ab50: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
ab60: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
ab70: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a     z = p->zSql;.
ab80: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e    }else if( p->n
ab90: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  Op>=1 ){.    con
aba0: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d  st VdbeOp *pOp =
abb0: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20   &p->aOp[0];.   
abc0: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
abd0: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
abe0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
abf0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a     z = pOp->p4.z
ac00: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73  ;.      while( s
ac10: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a  qlite3Isspace(*z
ac20: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) z++;.    }. 
ac30: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69   }.  if( z ) pri
ac40: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e  ntf("SQL: [%s]\n
ac50: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ", z);.}.#endif.
ac60: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
ac70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
ac80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ac90: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
aca0: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  E)./*.** Print a
acb0: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67  n IOTRACE messag
acc0: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f  e showing SQL co
acd0: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ntent..*/.void s
ace0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63  qlite3VdbeIOTrac
acf0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  eSql(Vdbe *p){. 
ad00: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f   int nOp = p->nO
ad10: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  p;.  VdbeOp *pOp
ad20: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  ;.  if( sqlite3I
ad30: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75  oTrace==0 ) retu
ad40: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20  rn;.  if( nOp<1 
ad50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20  ) return;.  pOp 
ad60: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
ad70: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
ad80: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
ad90: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
ada0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68  int i, j;.    ch
adb0: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20  ar z[1000];.    
adc0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
add0: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
ade0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b  %s", pOp->p4.z);
adf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71  .    for(i=0; sq
ae00: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
ae10: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66  ]); i++){}.    f
ae20: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(j=0; z[i]; i+
ae30: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
ae40: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69  lite3Isspace(z[i
ae50: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
ae60: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b  ( z[i-1]!=' ' ){
ae70: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  .          z[j++
ae80: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
ae90: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
aea0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
aeb0: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20   z[i];.      }. 
aec0: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
aed0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
aee0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22  Trace("SQL %s\n"
aef0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , z);.  }.}.#end
af00: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
af10: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49  IT_TRACE && SQLI
af20: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
af30: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  E */../*.** Allo
af40: 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20  cate space from 
af50: 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66  a fixed size buf
af60: 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61  fer and return a
af70: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74   pointer to.** t
af80: 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69  hat space.  If i
af90: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
afa0: 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
afb0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
afc0: 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61  ** The pBuf para
afd0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69  meter is the ini
afe0: 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20  tial value of a 
aff0: 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69  pointer which wi
b000: 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68  ll.** receive th
b010: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70  e new memory.  p
b020: 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  Buf is normally 
b030: 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69  NULL.  If pBuf i
b040: 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69  s not.** NULL, i
b050: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d  t means that mem
b060: 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c  ory space has al
b070: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
b080: 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a  ated and that.**
b090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   this routine sh
b0a0: 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74  ould not allocat
b0b0: 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79  e any new memory
b0c0: 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20  .  When pBuf is 
b0d0: 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70  not.** NULL simp
b0e0: 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20  ly return pBuf. 
b0f0: 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e   Only allocate n
b100: 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20  ew memory space 
b110: 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20  when pBuf.** is 
b120: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74  NULL..**.** nByt
b130: 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  e is the number 
b140: 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
b150: 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  e needed..**.** 
b160: 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74  *ppFrom points t
b170: 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  o available spac
b180: 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74  e and pEnd point
b190: 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  s to the end of 
b1a0: 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  the.** available
b1b0: 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 70   space.  When sp
b1c0: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
b1d0: 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 76  , *ppFrom is adv
b1e0: 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 68  anced past.** th
b1f0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c  e end of the all
b200: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a  ocated space..**
b210: 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 61  .** *pnByte is a
b220: 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 20   counter of the 
b230: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b240: 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 61  of space that ha
b250: 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20  ve failed.** to 
b260: 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 68  allocate.  If th
b270: 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 69  ere is insuffici
b280: 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 70  ent space in *pp
b290: 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20  From to satisfy 
b2a0: 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20  the.** request, 
b2b0: 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a  then increment *
b2c0: 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 6d  pnByte by the am
b2d0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 75  ount of the requ
b2e0: 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  est..*/.static v
b2f0: 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28  oid *allocSpace(
b300: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
b310: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
b320: 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 20   return pointer 
b330: 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 2a  will be stored *
b340: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
b350: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b360: 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61  er of bytes to a
b370: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 20  llocate */.  u8 
b380: 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 20  **ppFrom,       
b390: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c    /* IN/OUT: All
b3a0: 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 72  ocate from *ppFr
b3b0: 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  om */.  u8 *pEnd
b3c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
b3d0: 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 74  Pointer to 1 byt
b3e0: 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
b3f0: 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 72  f *ppFrom buffer
b400: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74   */.  int *pnByt
b410: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e          /* If
b420: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e   allocation cann
b430: 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72  ot be made, incr
b440: 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f  ement *pnByte */
b450: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49  .){.  assert( EI
b460: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
b470: 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20  NT(*ppFrom) );. 
b480: 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74 75   if( pBuf ) retu
b490: 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 65  rn pBuf;.  nByte
b4a0: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29   = ROUND8(nByte)
b4b0: 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 6f  ;.  if( &(*ppFro
b4c0: 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e  m)[nByte] <= pEn
b4d0: 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d 20  d ){.    pBuf = 
b4e0: 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a  (void*)*ppFrom;.
b4f0: 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e      *ppFrom += n
b500: 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Byte;.  }else{. 
b510: 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42     *pnByte += nB
b520: 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
b530: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pBuf;.}../*.**
b540: 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45   Rewind the VDBE
b550: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67   back to the beg
b560: 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72  inning in prepar
b570: 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e  ation for.** run
b580: 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64  ning it..*/.void
b590: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
b5a0: 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66  nd(Vdbe *p){.#if
b5b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b5c0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
b5d0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a  d(VDBE_PROFILE).
b5e0: 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a    int i;.#endif.
b5f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
b600: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
b610: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
b620: 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54  _INIT );..  /* T
b630: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
b640: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f  t least one opco
b650: 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  de..  */.  asser
b660: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a  t( p->nOp>0 );..
b670: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67    /* Set the mag
b680: 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43  ic to VDBE_MAGIC
b690: 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68  _RUN sooner rath
b6a0: 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a  er than later. *
b6b0: 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  /.  p->magic = V
b6c0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a  DBE_MAGIC_RUN;..
b6d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
b6e0: 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69  BUG.  for(i=1; i
b6f0: 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a  <p->nMem; i++){.
b700: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
b710: 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62  Mem[i].db==p->db
b720: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
b730: 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70   p->pc = -1;.  p
b740: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
b750: 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69  ;.  p->errorActi
b760: 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  on = OE_Abort;. 
b770: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
b780: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d  _MAGIC_RUN;.  p-
b790: 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
b7a0: 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b  p->cacheCtr = 1;
b7b0: 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69  .  p->minWriteFi
b7c0: 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a  leFormat = 255;.
b7d0: 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20    p->iStatement 
b7e0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e  = 0;.  p->nFkCon
b7f0: 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66  straint = 0;.#if
b800: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
b810: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b820: 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
b830: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20  p->aOp[i].cnt = 
b840: 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d  0;.    p->aOp[i]
b850: 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d  .cycles = 0;.  }
b860: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b870: 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75   Prepare a virtu
b880: 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65  al machine for e
b890: 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65  xecution for the
b8a0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65   first time afte
b8b0: 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68  r.** creating th
b8c0: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
b8d0: 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65  e.  This involve
b8e0: 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a  s things such.**
b8f0: 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73   as allocating s
b900: 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 69  tack space and i
b910: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
b920: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
b930: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
b940: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
b950: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
b960: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
b970: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
b980: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
b990: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
b9a0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
b9b0: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e   called exact on
b9c0: 63 65 20 6f 6e 20 61 20 65 61 63 68 20 76 69 72  ce on a each vir
b9d0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
b9e0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
b9f0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
ba00: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
ba10: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
ba20: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
ba30: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
ba40: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
ba50: 66 75 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  futher calls to 
ba60: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
ba70: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
ba80: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
ba90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
baa0: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
bab0: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
bac0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
bad0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
bae0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
baf0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
bb00: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
bb10: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
bb20: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
bb30: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
bb40: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
bb50: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
bb60: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
bb70: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
bb80: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
bb90: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
bba0: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
bbb0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
bbc0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bbd0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
bbe0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
bc10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
bc40: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
bc50: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
bc60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
bc70: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
bc80: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
bc90: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
bcb0: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
bcc0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bcf0: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
bd00: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
bd10: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
bd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd30: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
bd40: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
bd50: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
bd80: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
bd90: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
bda0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bdb0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bdc0: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
bdd0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
bde0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be00: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
be10: 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 20 20    u8 *zCsr;     
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c   /* Memory avail
be40: 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74  able for allocat
be50: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a 45 6e  ion */.  u8 *zEn
be60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
be70: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
be80: 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c 6f 63   byte past alloc
be90: 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ated memory */. 
bea0: 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20   int nByte;     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72  /* How much extr
bed0: 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64  a memory is need
bee0: 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ed */..  assert(
bef0: 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   p!=0 );.  asser
bf00: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20  t( p->nOp>0 );. 
bf10: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
bf20: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
bf30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
bf40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
bf50: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
bf60: 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62  ->pParse );.  db
bf70: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
bf80: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
bf90: 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61  iled==0 );.  nVa
bfa0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  r = pParse->nVar
bfb0: 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73  ;.  nMem = pPars
bfc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73  e->nMem;.  nCurs
bfd0: 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
bfe0: 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72  b;.  nArg = pPar
bff0: 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e  se->nMaxArg;.  n
c000: 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Once = pParse->n
c010: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63  Once;.  if( nOnc
c020: 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31  e==0 ) nOnce = 1
c030: 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c  ; /* Ensure at l
c040: 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e  east one byte in
c050: 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20   p->aOnceFlag[] 
c060: 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65  */.  .  /* For e
c070: 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69  ach cursor requi
c080: 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61  red, also alloca
c090: 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  te a memory cell
c0a0: 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65  . Memory.  ** ce
c0b0: 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72  lls (nMem+1-nCur
c0c0: 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c  sor)..nMem, incl
c0d0: 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65  usive, will neve
c0e0: 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a  r be used by.  *
c0f0: 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  * the vdbe progr
c100: 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79  am. Instead they
c110: 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c   are used to all
c120: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a  ocate space for.
c130: 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f    ** VdbeCursor/
c140: 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75  BtCursor structu
c150: 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66  res. The blob of
c160: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
c170: 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75  ed with .  ** cu
c180: 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64  rsor 0 is stored
c190: 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
c1a0: 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c  nMem. Memory cel
c1b0: 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20  l (nMem-1).  ** 
c1c0: 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20  stores the blob 
c1d0: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
c1e0: 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
c1f0: 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20   1, etc..  **.  
c200: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c  ** See also: all
c210: 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20  ocateCursor().. 
c220: 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43   */.  nMem += nC
c230: 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ursor;..  /* All
c240: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
c250: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
c260: 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 73 2c  , SQL variables,
c270: 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 61 6e   VDBE cursors an
c280: 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 61 79  d .  ** an array
c290: 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 4c 20   to marshal SQL 
c2a0: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
c2b0: 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7a 43  ts in..  */.  zC
c2c0: 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  sr = (u8*)&p->aO
c2d0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 20 20  p[p->nOp];      
c2e0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
c2f0: 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c  avaliable for al
c300: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45  location */.  zE
c310: 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f  nd = (u8*)&p->aO
c320: 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  p[pParse->nOpAll
c330: 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 20 62  oc];  /* First b
c340: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
c350: 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 65 73  zCsr[] */..  res
c360: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20  olveP2Values(p, 
c370: 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65  &nArg);.  p->use
c380: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28  sStmtJournal = (
c390: 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75  u8)(pParse->isMu
c3a0: 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72  ltiWrite && pPar
c3b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20  se->mayAbort);. 
c3c0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
c3d0: 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20  lain && nMem<10 
c3e0: 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30  ){.    nMem = 10
c3f0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 7a  ;.  }.  memset(z
c400: 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73  Csr, 0, zEnd-zCs
c410: 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 28 7a  r);.  zCsr += (z
c420: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b  Csr - (u8*)0)&7;
c430: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54  .  assert( EIGHT
c440: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  _BYTE_ALIGNMENT(
c450: 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e 65 78  zCsr) );.  p->ex
c460: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
c470: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
c480: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
c490: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
c4a0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
c4b0: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
c4c0: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
c4d0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
c4e0: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
c4f0: 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  e at the .  ** e
c500: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
c510: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
c520: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
c530: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
c540: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
c550: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
c560: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
c570: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
c580: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
c590: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
c5a0: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
c5b0: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
c5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
c5d0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
c5e0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
c5f0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
c600: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
c610: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
c620: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
c630: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
c640: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
c650: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
c660: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
c670: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
c680: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
c690: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
c6a0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  .    nByte = 0;.
c6b0: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
c6c0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
c6d0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
c6e0: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  m), &zCsr, zEnd,
c6f0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
c700: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
c710: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
c720: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
c730: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c740: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67  e);.    p->apArg
c750: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c760: 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a  >apArg, nArg*siz
c770: 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72  eof(Mem*), &zCsr
c780: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b  , zEnd, &nByte);
c790: 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20  .    p->azVar = 
c7a0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a  allocSpace(p->az
c7b0: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66  Var, nVar*sizeof
c7c0: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20  (char*), &zCsr, 
c7d0: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
c7e0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
c7f0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73  locSpace(p->apCs
c800: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f  r, nCursor*sizeo
c810: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a  f(VdbeCursor*),.
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c            &zCsr,
c840: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
c850: 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
c860: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
c870: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
c880: 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  e, &zCsr, zEnd, 
c890: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  &nByte);.    if(
c8a0: 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
c8b0: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
c8c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c8d0: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d  b, nByte);.    }
c8e0: 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70  .    zCsr = p->p
c8f0: 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d  Free;.    zEnd =
c900: 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20   &zCsr[nByte];. 
c910: 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26   }while( nByte &
c920: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
c930: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
c940: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
c950: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
c960: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
c970: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
c980: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
c990: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
c9a0: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
c9b0: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
c9c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c9d0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
c9e0: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
c9f0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
ca00: 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  zVar ){.    p->n
ca10: 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  zVar = pParse->n
ca20: 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79  zVar;.    memcpy
ca30: 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73  (p->azVar, pPars
ca40: 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56  e->azVar, p->nzV
ca50: 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56  ar*sizeof(p->azV
ca60: 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d  ar[0]));.    mem
ca70: 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  set(pParse->azVa
ca80: 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a  r, 0, pParse->nz
ca90: 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  Var*sizeof(pPars
caa0: 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  e->azVar[0]));. 
cab0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
cac0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
cad0: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
cae0: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
caf0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
cb00: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
cb10: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
cb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
cb30: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
cb40: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
cb50: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
cb60: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
cb70: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
cb80: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
cb90: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
cba0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
cbb0: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
cbc0: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
cbd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
cbe0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
cbf0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
cc00: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
cc10: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
cc20: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
cc30: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
cc40: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
cc50: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
cc60: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
cc70: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
cc80: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
cc90: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
cca0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74   sqlite3VdbeSort
ccb0: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70  erClose(p->db, p
ccc0: 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e  Cx);.  if( pCx->
ccd0: 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBt ){.    sqlit
cce0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ccf0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54  ->pBt);.    /* T
cd00: 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20  he pCx->pCursor 
cd10: 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75  will be close au
cd20: 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20  tomatically, if 
cd30: 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20  it exists, by.  
cd40: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
cd50: 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  ove. */.  }else 
cd60: 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72  if( pCx->pCursor
cd70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
cd80: 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
cd90: 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20  pCx->pCursor);. 
cda0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
cdb0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cdc0: 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70  BLE.  if( pCx->p
cdd0: 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20  VtabCursor ){.  
cde0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63    sqlite3_vtab_c
cdf0: 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73  ursor *pVtabCurs
ce00: 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43  or = pCx->pVtabC
ce10: 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ursor;.    const
ce20: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
ce30: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62  *pModule = pVtab
ce40: 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70  Cursor->pVtab->p
ce50: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69  Module;.    p->i
ce60: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b  nVtabMethod = 1;
ce70: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43  .    pModule->xC
ce80: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72  lose(pVtabCursor
ce90: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62  );.    p->inVtab
cea0: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a  Method = 0;.  }.
ceb0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
cec0: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20  Copy the values 
ced0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64  stored in the Vd
cee0: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72  beFrame structur
cef0: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54  e to its Vdbe. T
cf00: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  his.** is used, 
cf10: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
cf20: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d  n a trigger sub-
cf30: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65  program is halte
cf40: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20  d to restore.** 
cf50: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d  control to the m
cf60: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ain program..*/.
cf70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
cf80: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65  rameRestore(Vdbe
cf90: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a  Frame *pFrame){.
cfa0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61    Vdbe *v = pFra
cfb0: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63  me->v;.  v->aOnc
cfc0: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
cfd0: 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  aOnceFlag;.  v->
cfe0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61  nOnceFlag = pFra
cff0: 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20  me->nOnceFlag;. 
d000: 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65   v->aOp = pFrame
d010: 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20  ->aOp;.  v->nOp 
d020: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20  = pFrame->nOp;. 
d030: 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d   v->aMem = pFram
d040: 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d  e->aMem;.  v->nM
d050: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65  em = pFrame->nMe
d060: 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20  m;.  v->apCsr = 
d070: 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20  pFrame->apCsr;. 
d080: 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46   v->nCursor = pF
d090: 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20  rame->nCursor;. 
d0a0: 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69   v->db->lastRowi
d0b0: 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74  d = pFrame->last
d0c0: 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61  Rowid;.  v->nCha
d0d0: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43  nge = pFrame->nC
d0e0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  hange;.  return 
d0f0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f  pFrame->pc;.}../
d100: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63  *.** Close all c
d110: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  ursors..**.** Al
d120: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64  so release any d
d130: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65  ynamic memory he
d140: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20  ld by the VM in 
d150: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65  the Vdbe.aMem me
d160: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72  mory .** cell ar
d170: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63  ray. This is nec
d180: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65  essary as the me
d190: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20  mory cell array 
d1a0: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70  may contain.** p
d1b0: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46  ointers to VdbeF
d1c0: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68  rame objects, wh
d1d0: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20  ich may in turn 
d1e0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
d1f0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73   to.** open curs
d200: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
d210: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  oid closeAllCurs
d220: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ors(Vdbe *p){.  
d230: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b  if( p->pFrame ){
d240: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
d250: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28  pFrame;.    for(
d260: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65  pFrame=p->pFrame
d270: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e  ; pFrame->pParen
d280: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65  t; pFrame=pFrame
d290: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  ->pParent);.    
d2a0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
d2b0: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b  Restore(pFrame);
d2c0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65  .  }.  p->pFrame
d2d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d   = 0;.  p->nFram
d2e0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  e = 0;..  if( p-
d2f0: 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e  >apCsr ){.    in
d300: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
d310: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20  ; i<p->nCursor; 
d320: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65  i++){.      Vdbe
d330: 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e  Cursor *pC = p->
d340: 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20  apCsr[i];.      
d350: 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20  if( pC ){.      
d360: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65    sqlite3VdbeFre
d370: 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a  eCursor(p, pC);.
d380: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72          p->apCsr
d390: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
d3a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
d3b0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
d3c0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
d3d0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e  &p->aMem[1], p->
d3e0: 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69  nMem);.  }.  whi
d3f0: 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  le( p->pDelFrame
d400: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
d410: 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65  e *pDel = p->pDe
d420: 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70  lFrame;.    p->p
d430: 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d  DelFrame = pDel-
d440: 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71  >pParent;.    sq
d450: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
d460: 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a  lete(pDel);.  }.
d470: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
d480: 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74   auxdata allocat
d490: 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65  ions made by the
d4a0: 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   VM */.  sqlite3
d4b0: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
d4c0: 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61  a(p, -1, 0);.  a
d4d0: 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61  ssert( p->pAuxDa
d4e0: 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ta==0 );.}../*.*
d4f0: 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56  * Clean up the V
d500: 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  M after executio
d510: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  n..**.** This ro
d520: 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d  utine will autom
d530: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61  atically close a
d540: 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74  ny cursors, list
d550: 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72  s, and/or.** sor
d560: 74 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c  ters that were l
d570: 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c  eft open.  It al
d580: 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76  so deletes the v
d590: 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69  alues of.** vari
d5a0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61  ables in the aVa
d5b0: 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  r[] array..*/.st
d5c0: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
d5d0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
d5e0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
d5f0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
d600: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
d610: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
d620: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
d630: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
d640: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
d650: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
d660: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
d670: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
d680: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
d690: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d6a0: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
d6b0: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
d6c0: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
d6d0: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
d6e0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
d6f0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d  (i=1; i<=p->nMem
d700: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70  ; i++) assert( p
d710: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d  ->aMem[i].flags=
d720: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29  =MEM_Undefined )
d730: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
d740: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
d750: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
d760: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
d770: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
d780: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
d790: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
d7a0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
d7b0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
d7c0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51  urned by this SQ
d7d0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20  L.** statement. 
d7e0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20  This is now set 
d7f0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c  at compile time,
d800: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72   rather than dur
d810: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  ing.** execution
d820: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f   of the vdbe pro
d830: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c  gram so that sql
d840: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
d850: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61  t() can.** be ca
d860: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73  lled on an SQL s
d870: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20  tatement before 
d880: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a  sqlite3_step()..
d890: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
d8a0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64  dbeSetNumCols(Vd
d8b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43  be *p, int nResC
d8c0: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70  olumn){.  Mem *p
d8d0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e  ColName;.  int n
d8e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
d8f0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65  = p->db;..  rele
d900: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
d910: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73  ColName, p->nRes
d920: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e  Column*COLNAME_N
d930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
d940: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
d950: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43  me);.  n = nResC
d960: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b  olumn*COLNAME_N;
d970: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  .  p->nResColumn
d980: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75   = (u16)nResColu
d990: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d  mn;.  p->aColNam
d9a0: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28  e = pColName = (
d9b0: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  Mem*)sqlite3DbMa
d9c0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
d9d0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20  eof(Mem)*n );.  
d9e0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d  if( p->aColName=
d9f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
da00: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b  hile( n-- > 0 ){
da10: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66  .    pColName->f
da20: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
da30: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64  .    pColName->d
da40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70  b = p->db;.    p
da50: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d  ColName++;.  }.}
da60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
da70: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27  name of the idx'
da80: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20  th column to be 
da90: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
daa0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
dab0: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20  * zName must be 
dac0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  a pointer to a n
dad0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74  ul terminated st
dae0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ring..**.** This
daf0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61   call must be ma
db00: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  de after a call 
db10: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  to sqlite3VdbeSe
db20: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a  tNumCols()..**.*
db30: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61  * The final para
db40: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73  meter, xDel, mus
db50: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49  t be one of SQLI
db60: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49  TE_DYNAMIC, SQLI
db70: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20  TE_STATIC.** or 
db80: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
db90: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54  . If it is SQLIT
dba0: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20  E_DYNAMIC, then 
dbb0: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
dbc0: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d  ed.** to by zNam
dbd0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  e will be freed 
dbe0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  by sqlite3DbFree
dbf0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65  () when the vdbe
dc00: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a   is destroyed..*
dc10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
dc20: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56  eSetColName(.  V
dc30: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc50: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f  /* Vdbe being co
dc60: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e  nfigured */.  in
dc70: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  t idx,          
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
dca0: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20  n zName applies 
dcb0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c  to */.  int var,
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
dce0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a  of the COLNAME_*
dcf0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
dd00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
dd10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
dd20: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
dd30: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
dd40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20   name */.  void 
dd50: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20  (*xDel)(void*)  
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
dd70: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74  emory management
dd80: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e   strategy for zN
dd90: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ame */.){.  int 
dda0: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e  rc;.  Mem *pColN
ddb0: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ame;.  assert( i
ddc0: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  dx<p->nResColumn
ddd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61   );.  assert( va
dde0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20  r<COLNAME_N );. 
ddf0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
de00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
de10: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c  assert( !zName |
de20: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44  | xDel!=SQLITE_D
de30: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65  YNAMIC );.    re
de40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
de50: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  M;.  }.  assert(
de60: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
de70: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
de80: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
de90: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
dea0: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
deb0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
dec0: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
ded0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
dee0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
def0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
df00: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
df10: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
df20: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
df30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
df40: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
df50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
df60: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
df70: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
df80: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
df90: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
dfa0: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
dfb0: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
dfc0: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
dfd0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
dfe0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
dff0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
e000: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
e010: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
e020: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e030: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
e040: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
e050: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
e060: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
e070: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
e080: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
e090: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
e0a0: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
e0b0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  e-transaction */
e0c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e0d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65  TE_OK;.  int nee
e0e0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23  dXcommit = 0;..#
e0f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e100: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
e110: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70   /* With this op
e120: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61  tion, sqlite3Vta
e130: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e  bSync() is defin
e140: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20  ed to be simply 
e150: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  .  ** SQLITE_OK 
e160: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64  so p is not used
e170: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44  . .  */.  UNUSED
e180: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23  _PARAMETER(p);.#
e190: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f  endif..  /* Befo
e1a0: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
e1b0: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65  g else, call the
e1c0: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63   xSync() callbac
e1d0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76  k for any.  ** v
e1e0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61  irtual module ta
e1f0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20  bles written in 
e200: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
e210: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20  . This has to.  
e220: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  ** be done befor
e230: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68  e determining wh
e240: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a  ether a master j
e250: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a  ournal file is .
e260: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61    ** required, a
e270: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c  s an xSync() cal
e280: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e  lback may add an
e290: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e2a0: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74  se.  ** to the t
e2b0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
e2c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e2d0: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a  tabSync(db, p);.
e2e0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
e2f0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69  determines (a) i
e300: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  f the commit hoo
e310: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f  k should be invo
e320: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29  ked and.  ** (b)
e330: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61   how many databa
e340: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70  se files have op
e350: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
e360: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a  tions, not .  **
e370: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
e380: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62  emp database. (b
e390: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62  ) is important b
e3a0: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74  ecause if more t
e3b0: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61  han .  ** one da
e3c0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
e3d0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
e3e0: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73  ansaction, a mas
e3f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ter journal.  **
e400: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65   file is require
e410: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20  d for an atomic 
e420: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20  commit..  */ .  
e430: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
e440: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
e450: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
e460: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
e470: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
e480: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
e490: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
e4a0: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f  ){.      needXco
e4b0: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
e4c0: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e  if( i!=1 ) nTran
e4d0: 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s++;.      sqlit
e4e0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
e4f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
e500: 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
e510: 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42  iveLock(sqlite3B
e520: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b  treePager(pBt));
e530: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
e540: 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
e550: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
e560: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e570: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e580: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
e590: 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
e5a0: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
e5b0: 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
e5c0: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
e5d0: 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
e5e0: 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
e5f0: 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
e600: 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
e610: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
e620: 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
e630: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
e640: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
e650: 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
e660: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e670: 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
e680: 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
e690: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
e6a0: 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
e6b0: 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
e6c0: 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
e6d0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
e6e0: 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
e6f0: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
e700: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
e710: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
e720: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
e730: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
e740: 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
e750: 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
e760: 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
e770: 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
e780: 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
e790: 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
e7a0: 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
e7b0: 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
e7c0: 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
e7d0: 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
e7e0: 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
e7f0: 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
e800: 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
e810: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
e820: 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
e830: 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
e840: 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
e850: 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
e860: 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
e870: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
e880: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
e890: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
e8a0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
e8b0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
e8c0: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
e8d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
e8e0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
e8f0: 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
e900: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e910: 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
e920: 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
e930: 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
e940: 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
e950: 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
e960: 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
e970: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
e980: 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
e990: 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
e9a0: 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
e9b0: 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
e9c0: 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
e9d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
e9e0: 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
e9f0: 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
ea00: 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
ea10: 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
ea20: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
ea30: 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
ea40: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
ea50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ea60: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ea70: 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
ea80: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
ea90: 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
eaa0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
eab0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
eac0: 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
ead0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
eae0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
eaf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eb00: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
eb10: 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
eb20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
eb30: 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
eb40: 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
eb50: 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
eb60: 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
eb70: 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
eb80: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
eb90: 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
eba0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
ebb0: 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
ebc0: 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f  d atomicly..  */
ebd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ebe0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c  OMIT_DISKIO.  el
ebf0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
ec00: 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e  vfs *pVfs = db->
ec10: 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65  pVfs;.    int ne
ec20: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
ec30: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
ec40: 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
ec50: 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
ec60: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
ec70: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
ec80: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
ec90: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
eca0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
ecb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
ecc0: 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
ecd0: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
ece0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
ecf0: 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
ed00: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
ed10: 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
ed20: 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
ed30: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ed40: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
ed50: 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
ed60: 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
ed70: 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
ed80: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ed90: 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
eda0: 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
edb0: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
edc0: 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
edd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ede0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
edf0: 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
ee00: 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
ee10: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
ee20: 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
ee30: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
ee40: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
ee50: 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
ee60: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
ee70: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ee80: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
ee90: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
eea0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eeb0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
eec0: 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
eed0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eee0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
eef0: 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
ef00: 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
ef10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ef20: 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
ef30: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
ef40: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
ef50: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
ef60: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
ef70: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
ef80: 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
ef90: 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
efa0: 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
efd0: 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
efe0: 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
eff0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
f000: 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
f010: 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
f020: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
f030: 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
f040: 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
f050: 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
f060: 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
f070: 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
f080: 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
f090: 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
f0a0: 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
f0b0: 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
f0c0: 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
f0d0: 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
f0e0: 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
f0f0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f100: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
f110: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
f120: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
f130: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
f140: 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
f150: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f160: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
f170: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
f180: 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
f190: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f1a0: 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
f1b0: 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
f1c0: 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
f1d0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f1e0: 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
f1f0: 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
f200: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
f210: 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
f220: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
f230: 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
f240: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
f250: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
f270: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
f280: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
f290: 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
f2a0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
f2b0: 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
f2c0: 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
f2d0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
f2e0: 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
f2f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
f300: 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
f310: 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
f320: 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
f330: 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
f340: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f350: 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
f360: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
f370: 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
f380: 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
f390: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
f3a0: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
f3b0: 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
f3c0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
f3d0: 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
f3e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
f3f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
f400: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
f410: 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
f420: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
f430: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
f440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
f450: 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
f460: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
f470: 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
f480: 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
f490: 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
f4a0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
f4b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
f4c0: 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
f4d0: 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
f4e0: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
f4f0: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
f500: 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
f510: 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
f520: 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63     if( !needSync
f530: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
f540: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42  eSyncDisabled(pB
f550: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
f560: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
f570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
f580: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
f590: 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
f5a0: 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
f5b0: 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
f5c0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
f5d0: 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
f5e0: 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
f5f0: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
f600: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f610: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f620: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
f630: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
f640: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
f650: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f660: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
f670: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f680: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f690: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f6a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f6b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
f6c0: 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
f6d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
f6e0: 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
f6f0: 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
f700: 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
f710: 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
f720: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
f730: 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20  if( needSync .  
f740: 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65     && 0==(sqlite
f750: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
f760: 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72  eristics(pMaster
f770: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
f780: 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20  EQUENTIAL).     
f790: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
f7a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
f7b0: 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  c(pMaster, SQLIT
f7c0: 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a  E_SYNC_NORMAL)).
f7d0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c      ){.      sql
f7e0: 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
f7f0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
f800: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
f810: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
f820: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f830: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
f840: 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
f850: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
f860: 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65   /* Sync all the
f870: 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76   db files involv
f880: 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  ed in the transa
f890: 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20  ction. The same 
f8a0: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73  call.    ** sets
f8b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f8c0: 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65  nal pointer in e
f8d0: 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  ach individual j
f8e0: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a  ournal. If.    *
f8f0: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
f900: 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64  s here, do not d
f910: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f920: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
f930: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
f940: 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73  the error occurs
f950: 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73   during the firs
f960: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
f970: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
f980: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74  mitPhaseOne(), t
f990: 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63  hen there is a c
f9a0: 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20  hance that the. 
f9b0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
f9c0: 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62  rnal file will b
f9d0: 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20  e orphaned. But 
f9e0: 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65  we cannot delete
f9f0: 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63   it,.    ** in c
fa00: 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ase the master j
fa10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
fa20: 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
fa30: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
fa40: 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65    ** file before
fa50: 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63   the failure occ
fa60: 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  urred..    */.  
fa70: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
fa80: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
fa90: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
faa0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
fab0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
fac0: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
fad0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
fae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
faf0: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a  tPhaseOne(pBt, z
fb00: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d  Master);.      }
fb10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fb20: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
fb30: 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65  aster);.    asse
fb40: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  rt( rc!=SQLITE_B
fb50: 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72  USY );.    if( r
fb60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
fb70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fb80: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
fb90: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
fba0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
fbb0: 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   Delete the mast
fbc0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
fbd0: 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68   This commits th
fbe0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  e transaction. A
fbf0: 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e  fter.    ** doin
fc00: 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63  g this the direc
fc10: 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61  tory is synced a
fc20: 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20  gain before any 
fc30: 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a  individual.    *
fc40: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69  * transaction fi
fc50: 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e  les are deleted.
fc60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
fc70: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
fc80: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
fc90: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  1);.    sqlite3D
fca0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fcb0: 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
fcc0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
fcd0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
fce0: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
fcf0: 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
fd00: 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
fd10: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
fd20: 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
fd30: 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
fd40: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
fd50: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
fd60: 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
fd70: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
fd80: 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
fd90: 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
fda0: 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
fdb0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
fdc0: 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
fdd0: 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
fde0: 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
fdf0: 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
fe00: 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
fe10: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
fe20: 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
fe30: 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
fe40: 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
fe50: 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
fe60: 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
fe70: 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
fe80: 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
fe90: 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
fea0: 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
feb0: 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
fec0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
fed0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
fee0: 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
fef0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
ff00: 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
ff10: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
ff20: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
ff30: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
ff40: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ff50: 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
ff60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ff70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ff80: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ff90: 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
ffa0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
ffb0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
ffc0: 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
ffd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
ffe0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
fff0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10000 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
10010 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
10020 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
10030 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
10040 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
10050 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
10060 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
10070 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
10080 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
10090 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
100a0 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
100b0 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
100c0 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
100d0 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
100e0 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
100f0 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
10100 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
10110 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
10120 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
10130 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
10140 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
10150 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
10160 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
10170 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
10180 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
10190 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
101a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
101b0 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
101c0 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
101d0 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
101e0 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
101f0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
10200 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
10210 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
10220 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
10230 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
10240 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
10250 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
10260 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
10270 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
10280 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
10290 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
102a0 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
102b0 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
102c0 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
102d0 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
102e0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
102f0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
10300 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
10310 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
10320 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
10330 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
10340 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
10350 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
10360 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
10370 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
10380 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
10390 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
103a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
103b0 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
103c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
103d0 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
103e0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
103f0 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
10400 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
10410 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
10420 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
10430 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10440 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
10450 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
10460 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
10470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
10480 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
10490 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
104a0 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
104b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
104c0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
104d0 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
104e0 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
104f0 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
10500 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
10510 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
10520 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
10530 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10540 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
10550 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
10560 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
10570 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
10580 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
10590 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
105a0 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
105b0 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
105c0 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
105d0 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
105e0 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
105f0 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
10600 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
10610 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
10620 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
10630 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
10640 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
10650 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
10660 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
10670 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
10680 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
10690 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
106a0 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
106b0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
106c0 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
106d0 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
106e0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
106f0 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
10700 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
10710 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
10720 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
10730 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
10740 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
10750 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
10760 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
10770 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
10780 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10790 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
107a0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
107b0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
107c0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
107d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
107e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
107f0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
10800 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
10810 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
10830 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
10840 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10850 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
10860 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
10870 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
10880 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
10890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
108a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
108b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
108c0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
108d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
108e0 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
108f0 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
10900 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
10910 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10930 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
10940 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
10950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10960 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
10970 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
10980 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
10990 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
109a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
109b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
109c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
109d0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
109e0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
109f0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10a10 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
10a20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
10a30 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
10a40 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
10a50 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
10a60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10a70 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
10a80 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
10a90 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
10aa0 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
10ab0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
10ac0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
10ad0 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
10ae0 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
10af0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
10b00 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
10b10 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
10b20 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
10b30 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
10b40 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
10b50 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
10b60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10b70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10b80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
10b90 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
10ba0 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
10bb0 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
10bc0 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
10bd0 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
10be0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
10bf0 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
10c00 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
10c10 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
10c20 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
10c30 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
10c40 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
10c50 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
10c60 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
10c70 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
10c80 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
10c90 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
10ca0 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
10cb0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
10cc0 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
10cd0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
10ce0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
10cf0 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
10d00 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
10d10 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
10d20 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
10d30 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
10d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
10d50 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
10d60 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
10d70 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
10d80 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
10d90 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
10da0 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
10db0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
10dc0 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
10dd0 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
10de0 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
10df0 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
10e00 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
10e10 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
10e20 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
10e30 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
10e40 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
10e50 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
10e60 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
10e70 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  rt;.    sqlite3S
10e80 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72  etString(&p->zEr
10e90 72 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49  rMsg, db, "FOREI
10ea0 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
10eb0 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
10ec0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
10ed0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
10ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
10ef0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
10f00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
10f10 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
10f20 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
10f30 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
10f40 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
10f50 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
10f60 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
10f70 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
10f80 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
10f90 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
10fa0 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
10fb0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
10fc0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10fd0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
10fe0 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
10ff0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
11000 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
11010 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
11020 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
11030 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
11040 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
11050 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
11060 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11070 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
11080 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
11090 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
110a0 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
110b0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
110c0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
110d0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
110e0 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
110f0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
11100 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
11110 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
11120 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
11130 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
11140 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
11150 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
11160 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
11190 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
111a0 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
111b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
111c0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
111d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
111e0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
111f0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
11200 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
11210 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
11220 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
11230 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
11240 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
11250 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
11260 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
11270 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
11280 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
11290 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
112a0 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
112b0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
112c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
112d0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
112e0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
112f0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
11300 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
11310 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
11320 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
11330 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
11340 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
11350 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
11360 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
11370 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
11380 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
11390 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
113a0 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
113b0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
113c0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
113d0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
113e0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
113f0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64    */..  if( p->d
11400 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11410 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
11420 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11430 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46  .  if( p->aOnceF
11440 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e  lag ) memset(p->
11450 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d  aOnceFlag, 0, p-
11460 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63  >nOnceFlag);.  c
11470 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  loseAllCursors(p
11480 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69  );.  if( p->magi
11490 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c!=VDBE_MAGIC_RU
114a0 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
114b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
114c0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
114d0 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e  Cnt(db);..  /* N
114e0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  o commit or roll
114f0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74  back needed if t
11500 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72  he program never
11510 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74   started or if t
11520 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  he.  ** SQL stat
11530 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72  ement does not r
11540 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64  ead or write a d
11550 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a  atabase file.  *
11560 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
11570 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72   && p->bIsReader
11580 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b   ){.    int mrc;
11590 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72     /* Primary er
115a0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d  ror code from p-
115b0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65  >rc */.    int e
115c0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b  StatementOp = 0;
115d0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69  .    int isSpeci
115e0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20  alError;        
115f0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72      /* Set to tr
11600 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c  ue if a 'special
11610 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20  ' error */..    
11620 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65  /* Lock all btre
11630 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73  es used by the s
11640 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
11650 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
11660 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (p);..    /* Che
11670 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  ck for one of th
11680 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73  e special errors
11690 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d   */.    mrc = p-
116a0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20  >rc & 0xff;.    
116b0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d  isSpecialError =
116c0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d   mrc==SQLITE_NOM
116d0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  EM || mrc==SQLIT
116e0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  E_IOERR.        
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11700 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc==SQLITE_INTE
11710 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51  RRUPT || mrc==SQ
11720 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69  LITE_FULL;.    i
11730 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  f( isSpecialErro
11740 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  r ){.      /* If
11750 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72   the query was r
11760 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65  ead-only and the
11770 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
11780 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c  QLITE_INTERRUPT,
11790 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f   .      ** no ro
117a0 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73  llback is necess
117b0 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ary. Otherwise, 
117c0 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70  at least a savep
117d0 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74  oint .      ** t
117e0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
117f0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  be rolled back t
11800 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
11810 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20  tabase to a .   
11820 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74     ** consistent
11830 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a   state..      **
11840 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69  .      ** Even i
11850 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11860 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74  is read-only, it
11870 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
11880 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a   perform.      *
11890 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  * a statement or
118a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
118b0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e  lback operation.
118c0 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20   If the error . 
118d0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64       ** occurred
118e0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74   while writing t
118f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73  o the journal, s
11900 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61  ub-journal or da
11910 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
11920 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20  file as part of 
11930 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65  an effort to fre
11940 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65  e up cache space
11950 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20   (see function. 
11960 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72       ** pagerStr
11970 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63  ess() in pager.c
11980 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ), the rollback 
11990 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72  is required to r
119a0 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a  estore .      **
119b0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20   the pager to a 
119c0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
119d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
119e0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
119f0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45  y || mrc!=SQLITE
11a00 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20  _INTERRUPT ){.  
11a10 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d        if( (mrc==
11a20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11a30 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
11a40 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74  ) && p->usesStmt
11a50 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
11a60 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
11a70 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
11a80 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20  LLBACK;.        
11a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11aa0 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65   /* We are force
11ab0 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74  d to roll back t
11ac0 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  he active transa
11ad0 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f  ction. Before do
11ae0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
11af0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f   so, abort any o
11b00 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20  ther statements 
11b10 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72  this handle curr
11b20 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65  ently has active
11b30 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
11b40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11b50 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
11b60 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
11b70 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
11b80 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
11b90 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
11ba0 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
11bb0 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
11bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11bd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
11be0 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20  k for immediate 
11bf0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c  foreign key viol
11c00 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69  ations. */.    i
11c10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
11c20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
11c30 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
11c40 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  p, 0);.    }.  .
11c50 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75      /* If the au
11c60 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
11c70 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69  s set and this i
11c80 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76  s the only activ
11c90 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a  e writer .    **
11ca0 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20   VM, then we do 
11cb0 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20  either a commit 
11cc0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74  or rollback of t
11cd0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
11ce0 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a  action. .    **.
11cf0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69      ** Note: Thi
11d00 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e  s block also run
11d10 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s if one of the 
11d20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68  special errors h
11d30 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61  andled .    ** a
11d40 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65  bove has occurre
11d50 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d. .    */.    i
11d60 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49  f( !sqlite3VtabI
11d70 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20  nSync(db) .     
11d80 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  && db->autoCommi
11d90 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e  t .     && db->n
11da0 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72  VdbeWrite==(p->r
11db0 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20  eadOnly==0) .   
11dc0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
11dd0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
11de0 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  | (p->errorActio
11df0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69  n==OE_Fail && !i
11e00 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29  sSpecialError) )
11e10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
11e20 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46  qlite3VdbeCheckF
11e30 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  k(p, 1);.       
11e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11e60 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61  if( NEVER(p->rea
11e70 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
11e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11e90 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
11ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
11eb0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
11ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ed0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
11ee0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
11ef0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KEY;.        }el
11f00 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f  se{ .          /
11f10 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  * The auto-commi
11f20 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20  t flag is true, 
11f30 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d  the vdbe program
11f40 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20   was successful 
11f50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  .          ** or
11f60 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c   hit an 'OR FAIL
11f70 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64  ' constraint and
11f80 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65   there are no de
11f90 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20  ferred foreign. 
11fa0 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20           ** key 
11fb0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68  constraints to h
11fc0 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73  old up the trans
11fd0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61  action. This mea
11fe0 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20  ns a commit .   
11ff0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71         ** is req
12000 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  uired. */.      
12010 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d      rc = vdbeCom
12020 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  mit(db, p);.    
12030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12040 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12050 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  Y && p->readOnly
12060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12070 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
12080 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
12090 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
120a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
120b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
120c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
120d0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
120e0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
120f0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12100 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  E_OK);.        }
12110 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
12120 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12130 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
12140 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
12150 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  mCons = 0;.     
12160 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
12170 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46  = ~SQLITE_DeferF
12180 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Ks;.          sq
12190 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
121a0 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a  nalChanges(db);.
121b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
121c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
121d0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
121e0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
121f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12200 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
12210 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
12220 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
12230 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
12240 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12250 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
12260 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
12270 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12280 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12290 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
122a0 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
122b0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
122c0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
122d0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
122e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
122f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12300 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12310 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12320 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12330 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12340 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12350 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12360 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
12370 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12380 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53  .  .    /* If eS
12390 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f  tatementOp is no
123a0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73  n-zero, then a s
123b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
123c0 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20  tion needs to.  
123d0 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65    ** be committe
123e0 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
123f0 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  . Call sqlite3Vd
12400 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12410 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20  () to.    ** do 
12420 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72  so. If this oper
12430 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ation returns an
12440 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20   error, and the 
12450 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
12460 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63  t.    ** error c
12470 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b  ode is SQLITE_OK
12480 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   or SQLITE_CONST
12490 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d  RAINT, then prom
124a0 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ote the.    ** c
124b0 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
124c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20   error code..   
124d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61   */.    if( eSta
124e0 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20  tementOp ){.    
124f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
12500 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12510 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  (p, eStatementOp
12520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12530 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
12540 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
12550 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d  || (p->rc&0xff)=
12560 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
12570 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NT ){.          
12580 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
12590 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
125a0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
125b0 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  sg);.          p
125c0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
125d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
125e0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
125f0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
12600 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
12610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12620 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
12630 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
12640 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
12650 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
12670 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
12680 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
12690 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
126a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
126b0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
126c0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
126d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
126e0 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
126f0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
12700 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
12710 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
12720 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
12730 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
12740 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12750 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
12760 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
12770 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
12780 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12790 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
127a0 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
127b0 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
127c0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
127d0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
127e0 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
127f0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
12800 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
12810 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
12820 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
12830 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
12840 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
12850 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
12860 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
12870 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
12880 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
12890 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
128a0 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
128b0 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
128c0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
128d0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
128e0 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
128f0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
12900 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
12910 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
12920 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
12930 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
12940 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
12950 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
12960 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
12970 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12980 28 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  (db);.  if( p->d
12990 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
129a0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
129b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
129c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
129d0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
129e0 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
129f0 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
12a00 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
12a10 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
12a20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
12a30 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
12a40 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
12a50 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
12a60 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
12a70 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
12a80 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
12a90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
12aa0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
12ab0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
12ac0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
12ad0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
12ae0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
12af0 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
12b00 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
12b10 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
12b20 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
12b30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
12b40 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
12b50 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
12b60 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
12b70 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
12b80 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12b90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
12ba0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
12bb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
12bc0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
12bd0 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
12be0 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
12bf0 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
12c00 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
12c10 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
12c20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12c30 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
12c40 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
12c50 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
12c60 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
12c70 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
12c80 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
12c90 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
12ca0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
12cb0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
12cc0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
12cd0 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
12ce0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
12cf0 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
12d00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
12d10 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
12d20 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
12d30 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
12d40 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
12d50 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12d60 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
12d70 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
12d80 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
12d90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12da0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
12db0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
12dc0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
12dd0 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69      u8 mallocFai
12de0 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63  led = db->malloc
12df0 46 61 69 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69  Failed;.    sqli
12e00 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
12e10 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
12e20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
12e30 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
12e40 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
12e50 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12e60 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
12e70 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
12e80 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
12e90 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12ea0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
12eb0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
12ec0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12ed0 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  d = mallocFailed
12ee0 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
12ef0 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
12f00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
12f10 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
12f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12f30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12f40 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a  ENABLE_SQLLOG./*
12f50 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 45  .** If an SQLITE
12f60 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68  _CONFIG_SQLLOG h
12f70 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 65  ook is registere
12f80 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 73  d and the VM has
12f90 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69   been run, .** i
12fa0 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  nvoke it..*/.sta
12fb0 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e 76  tic void vdbeInv
12fc0 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a  okeSqllog(Vdbe *
12fd0 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  v){.  if( sqlite
12fe0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
12ff0 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d  qllog && v->rc==
13000 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e  SQLITE_OK && v->
13010 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30  zSql && v->pc>=0
13020 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45   ){.    char *zE
13030 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 65  xpanded = sqlite
13040 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 76  3VdbeExpandSql(v
13050 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20  , v->zSql);.    
13060 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69  assert( v->db->i
13070 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20  nit.busy==0 );. 
13080 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 64     if( zExpanded
13090 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
130a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
130b0 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 20  qllog(.         
130c0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
130d0 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
130e0 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65   v->db, zExpande
130f0 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 20  d, 1.      );.  
13100 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13110 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  e(v->db, zExpand
13120 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ed);.    }.  }.}
13130 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
13140 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13150 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
13160 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42  * Clean up a VDB
13170 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
13180 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c  n but do not del
13190 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 73  ete the VDBE jus
131a0 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20  t yet..** Write 
131b0 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
131c0 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  es into *pzErrMs
131d0 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  g.  Return the r
131e0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  esult code..**.*
131f0 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75  * After this rou
13200 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65  tine is run, the
13210 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20   VDBE should be 
13220 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 63  ready to be exec
13230 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a  uted.** again..*
13240 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20  *.** To look at 
13250 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20  it another way, 
13260 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  this routine res
13270 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
13280 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20   the.** virtual 
13290 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42  machine from VDB
132a0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56  E_MAGIC_RUN or V
132b0 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62  DBE_MAGIC_HALT b
132c0 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d  ack to.** VDBE_M
132d0 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e  AGIC_INIT..*/.in
132e0 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  t sqlite3VdbeRes
132f0 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  et(Vdbe *p){.  s
13300 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62  qlite3 *db;.  db
13310 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13320 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f  If the VM did no
13330 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74  t run to complet
13340 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63  ion or if it enc
13350 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a  ountered an.  **
13360 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20   error, then it 
13370 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62  might not have b
13380 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65  een halted prope
13390 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20  rly.  So halt.  
133a0 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  ** it now..  */.
133b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c    sqlite3VdbeHal
133c0 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  t(p);..  /* If t
133d0 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 72  he VDBE has be r
133e0 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c  un even partiall
133f0 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72  y, then transfer
13400 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
13410 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d    ** and error m
13420 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20  essage from the 
13430 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61  VDBE into the ma
13440 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
13450 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a  cture.  But.  **
13460 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 73   if the VDBE has
13470 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 74   just been set t
13480 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f  o run but has no
13490 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75  t actually execu
134a0 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73  ted any.  ** ins
134b0 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c  tructions yet, l
134c0 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61  eave the main da
134d0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66  tabase error inf
134e0 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  ormation unchang
134f0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
13500 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76  ->pc>=0 ){.    v
13510 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28  dbeInvokeSqllog(
13520 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  p);.    sqlite3V
13530 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
13540 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
13550 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
13560 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
13570 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
13580 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e  if( p->runOnlyOn
13590 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 20  ce ) p->expired 
135a0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
135b0 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 70   p->rc && p->exp
135c0 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ired ){.    /* T
135d0 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 20  he expired flag 
135e0 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 56  was set on the V
135f0 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 66  DBE before the f
13600 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  irst call.    **
13610 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
13620 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 65  (). For consiste
13630 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 74  ncy (since sqlit
13640 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 20  e3_step() was.  
13650 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65    ** called), se
13660 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 65  t the database e
13670 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 73  rror in this cas
13680 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a  e as well..    *
13690 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
136a0 6f 72 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d  or(db, p->rc, p-
136b0 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20  >zErrMsg ? "%s" 
136c0 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  : 0, p->zErrMsg)
136d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
136e0 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
136f0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
13700 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Msg = 0;.  }..  
13710 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d  /* Reclaim all m
13720 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
13730 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c  e VDBE.  */.  Cl
13740 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20  eanup(p);..  /* 
13750 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69  Save profiling i
13760 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
13770 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20  this VDBE run.. 
13780 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f   */.#ifdef VDBE_
13790 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20  PROFILE.  {.    
137a0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65  FILE *out = fope
137b0 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e  n("vdbe_profile.
137c0 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20  out", "a");.    
137d0 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20  if( out ){.     
137e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70   int i;.      fp
137f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d  rintf(out, "----
13800 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ");.      for(i
13810 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
13820 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
13830 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c  ntf(out, "%02x",
13840 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
13850 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13860 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13870 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20  \n");.      if( 
13880 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20  p->zSql ){.     
13890 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20     char c, pc = 
138a0 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  0;.        fprin
138b0 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a  tf(out, "-- ");.
138c0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
138d0 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d   (c = p->zSql[i]
138e0 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
138f0 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c        if( pc=='\
13900 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
13910 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
13920 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29      putc(c, out)
13930 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  ;.          pc =
13940 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   c;.        }.  
13950 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c        if( pc!='\
13960 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  n' ) fprintf(out
13970 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  , "\n");.      }
13980 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
13990 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
139a0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64          char zHd
139b0 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20  r[100];.        
139c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
139d0 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a  (sizeof(zHdr), z
139e0 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75  Hdr, "%6u %12llu
139f0 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20   %8llu ",.      
13a00 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
13a10 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  nt,.           p
13a20 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c  ->aOp[i].cycles,
13a30 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61  .           p->a
13a40 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d  Op[i].cnt>0 ? p-
13a50 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70  >aOp[i].cycles/p
13a60 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30  ->aOp[i].cnt : 0
13a70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
13a80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
13a90 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20   "%s", zHdr);.  
13aa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13ab0 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c  ePrintOp(out, i,
13ac0 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20   &p->aOp[i]);.  
13ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f      }.      fclo
13ae0 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  se(out);.    }. 
13af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69   }.#endif.  p->i
13b00 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b  CurrentTime = 0;
13b10 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
13b20 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
13b30 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20   return p->rc & 
13b40 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20  db->errMask;.}. 
13b50 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
13b60 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42  and delete a VDB
13b70 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f  E after executio
13b80 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  n.  Return an in
13b90 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a  teger which is.*
13ba0 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  * the result cod
13bb0 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72  e.  Write any er
13bc0 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74  ror message text
13bd0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e   into *pzErrMsg.
13be0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13bf0 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65  dbeFinalize(Vdbe
13c00 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
13c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
13c20 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
13c30 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d  _MAGIC_RUN || p-
13c40 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
13c50 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72  IC_HALT ){.    r
13c60 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
13c70 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73  eset(p);.    ass
13c80 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62  ert( (rc & p->db
13c90 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29  ->errMask)==rc )
13ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
13cb0 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20  dbeDelete(p);.  
13cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13cd0 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
13ce0 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61   iOp is less tha
13cf0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76  n zero, then inv
13d00 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
13d10 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75  or for.** all au
13d20 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
13d30 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20  nters currently 
13d40 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d  cached by the VM
13d50 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68   passed as.** th
13d60 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13d70 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69  ..**.** Or, if i
13d80 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68  Op is greater th
13d90 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
13da0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65  ero, then the de
13db0 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f  structor is.** o
13dc0 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20  nly invoked for 
13dd0 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20  those auxiliary 
13de0 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72  data pointers cr
13df0 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65  eated by the use
13e00 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  r .** function i
13e10 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50  nvoked by the OP
13e20 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65  _Function opcode
13e30 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   at instruction 
13e40 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56  iOp of .** VM pV
13e50 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  dbe, and only th
13e60 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  en if:.**.**    
13e70 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  * the associated
13e80 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
13e90 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20  ter is the 32nd 
13ea0 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69  or later (counti
13eb0 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ng.**      from 
13ec0 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20  left to right), 
13ed0 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  or.**.**    * th
13ee0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
13ef0 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20  bit in argument 
13f00 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77  mask is clear (w
13f10 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  here the first.*
13f20 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  *      function 
13f30 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70  parameter corrsp
13f40 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
13f50 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
13f60 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
13f70 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
13f80 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
13f90 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
13fa0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
13fb0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
13fc0 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
13fd0 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
13fe0 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
13ff0 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
14000 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
14010 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
14020 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
14030 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
14040 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
14050 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
14060 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
14070 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
14080 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
14090 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
140a0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
140b0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
140c0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
140d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
140e0 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
140f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14100 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
14110 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
14120 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
14130 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
14140 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
14150 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
14160 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
14170 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
14180 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
14190 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
141a0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
141b0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
141c0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
141d0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
141e0 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
141f0 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
14200 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
14210 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
14220 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
14230 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
14240 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14250 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
14260 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
14270 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
14280 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
14290 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
142a0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
142b0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
142c0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
142d0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
142e0 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
142f0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14300 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
14310 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14320 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
14330 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
14340 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
14350 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
14360 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
14370 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
14380 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
14390 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
143a0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
143b0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
143c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
143d0 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
143e0 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
143f0 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
14400 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14410 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
14420 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14430 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
14440 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14450 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
14460 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
14470 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
14480 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14490 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
144a0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
144b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
144c0 5f 45 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69  _EXPLAIN).  sqli
144d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
144e0 3e 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71  >zExplain);.  sq
144f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14500 70 2d 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65  p->pExplain);.#e
14510 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
14520 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
14530 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
14540 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
14550 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
14560 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
14570 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
14580 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
14590 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
145a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
145b0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
145c0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
145d0 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
145e0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
145f0 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
14600 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
14610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
14620 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
14630 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
14640 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
14650 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
14660 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
14670 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
14680 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
14690 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
146a0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
146b0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
146c0 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
146d0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
146e0 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
146f0 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
14700 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
14710 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
14720 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
14730 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
14740 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
14750 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
14760 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
14770 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
14780 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
14790 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
147a0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
147b0 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
147c0 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
147d0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
147e0 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
147f0 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
14800 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
14810 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
14820 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
14830 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
14840 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14850 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
14860 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
14870 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
14880 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
14890 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
148a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
148b0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
148c0 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
148d0 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
148e0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
148f0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
14900 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
14910 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
14920 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
14930 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
14940 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
14950 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64   *p){.  if( p->d
14960 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
14970 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63  .    int res, rc
14980 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14990 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20  TEST.    extern 
149a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
149b0 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
149c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
149d0 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72  isTable );.    r
149e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
149f0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
14a00 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
14a10 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
14a20 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28  , &res);.    if(
14a30 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14a40 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69  .    p->lastRowi
14a50 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72  d = p->movetoTar
14a60 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73  get;.    if( res
14a70 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
14a80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
14a90 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73  ;.    p->rowidIs
14aa0 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65  Valid = 1;.#ifde
14ab0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
14ac0 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68    sqlite3_search
14ad0 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
14ae0 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64  .    p->deferred
14af0 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20  Moveto = 0;.    
14b00 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
14b10 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
14b20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 70 43 75  }else if( p->pCu
14b30 72 73 6f 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  rsor ){.    int 
14b40 68 61 73 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e  hasMoved;.    in
14b50 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  t rc = sqlite3Bt
14b60 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
14b70 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68  d(p->pCursor, &h
14b80 61 73 4d 6f 76 65 64 29 3b 0a 20 20 20 20 69 66  asMoved);.    if
14b90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14ba0 3b 0a 20 20 20 20 69 66 28 20 68 61 73 4d 6f 76  ;.    if( hasMov
14bb0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63  ed ){.      p->c
14bc0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
14bd0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 20 20 20 20  HE_STALE;.      
14be0 69 66 28 20 68 61 73 4d 6f 76 65 64 3d 3d 32 20  if( hasMoved==2 
14bf0 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31  ) p->nullRow = 1
14c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14c20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
14c30 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
14c40 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
14c50 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
14c60 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
14c70 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
14c80 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
14c90 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
14ca0 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
14cb0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
14cc0 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
14cd0 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
14ce0 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
14cf0 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
14d00 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
14d10 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
14d20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
14d30 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
14d40 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
14d50 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
14d60 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
14d70 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
14d80 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
14d90 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
14da0 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
14db0 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
14dc0 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
14dd0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
14de0 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
14df0 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
14e00 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
14e10 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
14e20 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
14e30 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
14e40 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
14e50 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
14e60 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
14e70 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
14e80 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
14e90 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
14ea0 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
14eb0 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
14ec0 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
14ed0 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
14ee0 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
14ef0 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
14f00 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
14f10 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
14f20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
14f30 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
14f40 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
14f50 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
14f60 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
14f70 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
14f80 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
14f90 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
14fc0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
14fd0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
14fe0 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
14ff0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
15000 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
15010 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
15020 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
15030 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
15040 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
15050 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
15060 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
15090 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
150a0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
150b0 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
150c0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
150d0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
150e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150f0 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
15100 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15110 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
15120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
15130 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15140 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15150 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
15160 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
15170 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
15180 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
151a0 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
151b0 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
151c0 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
151d0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
151e0 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
151f0 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
15200 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
15210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15220 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
15230 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
15240 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
15250 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
15260 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
15270 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
15280 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
15290 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
152a0 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
152b0 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
152c0 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
152d0 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
152e0 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
152f0 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
15300 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
15310 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
15320 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
15330 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
15340 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
15350 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
15360 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
15370 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
15380 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
15390 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c  ormat){.  int fl
153a0 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67  ags = pMem->flag
153b0 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69  s;.  u32 n;..  i
153c0 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
153d0 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
153e0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  0;.  }.  if( fla
153f0 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20  gs&MEM_Int ){.  
15400 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
15410 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31  whether to use 1
15420 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62  , 2, 4, 6 or 8 b
15430 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66  ytes. */.#   def
15440 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28  ine MAX_6BYTE ((
15450 28 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30  ((i64)0x00008000
15460 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36  )<<32)-1).    i6
15470 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b  4 i = pMem->u.i;
15480 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20  .    u64 u;.    
15490 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20  if( i<0 ){.     
154a0 20 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59   if( i<(-MAX_6BY
154b0 54 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a  TE) ) return 6;.
154c0 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
154d0 73 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a  s test prevents:
154e0 20 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32    u = -(-9223372
154f0 30 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f  036854775808) */
15500 0a 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20  .      u = -i;. 
15510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15520 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20  u = i;.    }.   
15530 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20   if( u<=127 ){. 
15540 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26       return ((i&
15550 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
15560 72 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33  rmat>=4) ? 8+(u3
15570 32 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  2)u : 1;.    }. 
15580 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
15590 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20  ) return 2;.    
155a0 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29  if( u<=8388607 )
155b0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69   return 3;.    i
155c0 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37  f( u<=2147483647
155d0 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20   ) return 4;.   
155e0 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
155f0 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20  E ) return 5;.  
15600 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
15610 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
15620 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Real ){.    retu
15630 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 7;.  }.  asse
15640 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61  rt( pMem->db->ma
15650 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c  llocFailed || fl
15660 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d  ags&(MEM_Str|MEM
15670 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65  _Blob) );.  asse
15680 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29  rt( pMem->n>=0 )
15690 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65  ;.  n = (u32)pMe
156a0 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67  m->n;.  if( flag
156b0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a  s & MEM_Zero ){.
156c0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75      n += pMem->u
156d0 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65  .nZero;.  }.  re
156e0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
156f0 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
15700 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
15710 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
15720 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61  ngth of the data
15730 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
15740 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73  o the supplied s
15750 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75  erial-type..*/.u
15760 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
15770 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20  rialTypeLen(u32 
15780 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
15790 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
157a0 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =12 ){.    retur
157b0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  n (serial_type-1
157c0 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  2)/2;.  }else{. 
157d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
157e0 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30  u8 aSize[] = { 0
157f0 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c  , 1, 2, 3, 4, 6,
15800 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20   8, 8, 0, 0, 0, 
15810 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 };.    return 
15820 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70  aSize[serial_typ
15830 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e];.  }.}../*.**
15840 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
15850 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
15860 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
15870 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
15880 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
15890 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
158a0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
158b0 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
158c0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
158d0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
158e0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
158f0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
15900 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
15910 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
15920 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
15930 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
15940 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
15950 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
15960 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
15970 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
15980 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
15990 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
159a0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
159b0 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
159c0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
159d0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
159e0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
159f0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
15a00 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
15a10 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
15a20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
15a30 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
15a40 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
15a50 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
15a60 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
15a70 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
15a80 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
15a90 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
15aa0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
15ab0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
15ac0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
15ad0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
15ae0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
15af0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
15b00 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
15b10 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
15b20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
15b30 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
15b40 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
15b50 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
15b60 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
15b70 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
15b80 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
15b90 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
15ba0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
15bb0 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
15bc0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
15bd0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
15be0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
15bf0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
15c00 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
15c10 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
15c20 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
15c30 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
15c40 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
15c50 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
15c60 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
15c70 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
15c80 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
15c90 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
15ca0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
15cb0 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
15cc0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
15cd0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
15ce0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
15cf0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
15d00 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
15d10 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
15d20 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
15d30 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
15d40 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
15d50 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
15d60 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
15d70 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
15d80 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
15d90 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
15da0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
15db0 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
15dc0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
15dd0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
15de0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
15df0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
15e00 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
15e10 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
15e20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
15e30 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
15e40 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
15e50 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
15e60 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
15e70 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
15e80 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
15e90 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
15ea0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
15eb0 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
15ec0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
15ed0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
15ee0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
15ef0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
15f00 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
15f10 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
15f20 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
15f30 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
15f40 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
15f50 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
15f60 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
15f70 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
15f80 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
15f90 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
15fa0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
15fb0 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
15fc0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
15fd0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
15fe0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
15ff0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
16000 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
16010 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
16020 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
16030 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
16040 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
16050 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16060 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
16070 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
16080 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16090 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
160a0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
160b0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
160c0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
160d0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
160e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
160f0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
16100 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
16110 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
16120 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
16130 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
16140 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
16150 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
16160 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
16170 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16180 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
16190 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
161a0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
161b0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
161c0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
161d0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
161e0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
161f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
16200 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
16210 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
16220 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
16230 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
16240 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
16250 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
16260 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
16270 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
16280 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
16290 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
162a0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
162b0 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
162c0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
162d0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
162e0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
162f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
16300 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72  ==sizeof(pMem->r
16310 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
16320 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c 20  y(&v, &pMem->r, 
16330 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
16340 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
16350 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
16360 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
16370 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
16380 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
16390 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
163a0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
163b0 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
163c0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
163d0 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
163e0 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
163f0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
16400 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
16410 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
16420 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
16430 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
16440 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
16450 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
16460 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
16470 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
16480 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
16490 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
164a0 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
164b0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
164c0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
164d0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
164e0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d 63 70  em->n;.    memcp
164f0 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  y(buf, pMem->z, 
16500 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  len);.    return
16510 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
16520 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74  NULL or constant
16530 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65  s 0 or 1 */.  re
16540 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e  turn 0;.}../* In
16550 70 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71  put "x" is a seq
16560 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65  uence of unsigne
16570 64 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  d characters tha
16580 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a  t represent a.**
16590 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
165a0 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ger.  Return the
165b0 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69   equivalent nati
165c0 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64  ve integer.*/.#d
165d0 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49  efine ONE_BYTE_I
165e0 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78  NT(x)    ((i8)(x
165f0 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57  )[0]).#define TW
16600 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  O_BYTE_INT(x)   
16610 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30   (256*(i8)((x)[0
16620 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69  ])|(x)[1]).#defi
16630 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  ne THREE_BYTE_IN
16640 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38  T(x)  (65536*(i8
16650 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
16660 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64  ]<<8)|(x)[2]).#d
16670 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f  efine FOUR_BYTE_
16680 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29  UINT(x)  (((u32)
16690 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29  (x)[0]<<24)|((x)
166a0 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
166b0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
166c0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
166d0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
166e0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
166f0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
16700 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
16710 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
16720 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
16730 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
16740 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f  f bytes read..*/
16750 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
16760 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
16770 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
16780 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
16790 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
167a0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
167b0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
167c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
167d0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
167e0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
167f0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
16800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16810 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
16820 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
16830 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 3b 0a   */.){.  u64 x;.
16840 20 20 75 33 32 20 79 3b 0a 20 20 73 77 69 74 63    u32 y;.  switc
16850 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
16860 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20  {.    case 10:  
16870 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72   /* Reserved for
16880 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20   future use */. 
16890 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a     case 11:   /*
168a0 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75   Reserved for fu
168b0 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20  ture use */.    
168c0 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55  case 0: {  /* NU
168d0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  LL */.      pMem
168e0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
168f0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ll;.      break;
16900 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
16910 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73  1: { /* 1-byte s
16920 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
16930 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
16940 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
16950 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
16960 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
16970 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
16980 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
16990 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
169a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
169b0 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
169c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
169d0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
169e0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  i = TWO_BYTE_INT
169f0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
16a00 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16a10 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
16a20 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
16a30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16a40 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  2;.    }.    cas
16a50 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65  e 3: { /* 3-byte
16a60 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
16a70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16a80 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  .i = THREE_BYTE_
16a90 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
16aa0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
16ab0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
16ac0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
16ad0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
16ae0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 3;.    }.    
16af0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62  case 4: { /* 4-b
16b00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
16b10 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20  er */.      y = 
16b20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
16b30 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
16b40 3e 75 2e 69 20 3d 20 28 69 36 34 29 2a 28 69 6e  >u.i = (i64)*(in
16b50 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 70 4d 65  t*)&y;.      pMe
16b60 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
16b70 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
16b80 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
16b90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16ba0 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
16bb0 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
16bc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
16bd0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
16be0 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55  .i = FOUR_BYTE_U
16bf0 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28  INT(buf+2) + (((
16c00 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f  i64)1)<<32)*TWO_
16c10 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
16c20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
16c30 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
16c40 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
16c50 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
16c60 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d   return 6;.    }
16c70 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f  .    case 6:   /
16c80 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 8-byte signed 
16c90 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63  integer */.    c
16ca0 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45  ase 7: { /* IEEE
16cb0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
16cc0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
16cd0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
16ce0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
16cf0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
16d00 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20        /* Verify 
16d10 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
16d20 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
16d30 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
16d40 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  same.      ** by
16d50 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
16d60 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
16d70 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
16d80 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20  _FLOAT is.      
16d90 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20  ** defined that 
16da0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20  64-bit floating 
16db0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61  point values rea
16dc0 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20  lly are mixed.  
16dd0 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
16de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16df0 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74  atic const u64 t
16e00 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30  1 = ((u64)0x3ff0
16e10 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20  0000)<<32;.     
16e20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
16e30 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
16e40 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31       u64 t2 = t1
16e50 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
16e60 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
16e70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16e80 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
16e90 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
16ea0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
16eb0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
16ec0 64 69 66 0a 20 20 20 20 20 20 78 20 3d 20 46 4f  dif.      x = FO
16ed0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
16ee0 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
16ef0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
16f00 34 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  4);.      x = (x
16f10 3c 3c 33 32 29 20 7c 20 79 3b 0a 20 20 20 20 20  <<32) | y;.     
16f20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16f30 3d 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==6 ){.        p
16f40 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
16f50 2a 29 26 78 3b 0a 20 20 20 20 20 20 20 20 70 4d  *)&x;.        pM
16f60 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
16f70 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Int;.        tes
16f80 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
16f90 3c 30 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  <0 );.      }els
16fa0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
16fb0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
16fc0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
16fd0 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 20  r)==8 );.       
16fe0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
16ff0 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 20 20  Float(x);.      
17000 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
17010 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29  r, &x, sizeof(x)
17020 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d  );.        pMem-
17030 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
17040 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
17050 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
17060 52 65 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Real;.      }.  
17070 20 20 20 20 72 65 74 75 72 6e 20 38 3b 0a 20 20      return 8;.  
17080 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
17090 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
170a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
170b0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
170c0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
170d0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
170e0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
170f0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
17100 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17110 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
17120 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
17130 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61  c const u16 aFla
17140 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62  g[] = { MEM_Blob
17150 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f  |MEM_Ephem, MEM_
17160 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b  Str|MEM_Ephem };
17170 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d  .      u32 len =
17180 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
17190 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  )/2;.      pMem-
171a0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
171b0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
171c0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65  = len;.      pMe
171d0 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20  m->xDel = 0;.   
171e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
171f0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
17200 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
17210 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20  urn len;.    }. 
17220 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
17230 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17240 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
17250 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
17260 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
17270 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
17280 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
17290 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
172a0 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
172b0 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
172c0 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
172d0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
172e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
172f0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
17300 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
17310 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
17320 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
17330 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
17340 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
17350 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
17360 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
17370 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
17380 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
17390 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
173a0 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
173b0 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
173c0 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
173d0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
173e0 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
173f0 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
17400 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
17410 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
17420 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
17430 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
17440 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
17450 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
17460 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
17470 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
17480 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
17490 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
174a0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
174b0 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
174c0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
174d0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
174e0 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
174f0 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
17500 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
17510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17520 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
17530 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
17540 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
17570 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
17580 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
175b0 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
175c0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
175d0 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
175e0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
175f0 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
17600 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
17610 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
17620 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
17630 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
17640 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
17650 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17670 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
17680 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
17690 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
176a0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
176d0 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
176e0 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
176f0 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
17700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
17710 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
17720 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
17730 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
17740 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
17750 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
17760 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
17770 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
17780 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
17790 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
177a0 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
177b0 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
177c0 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
177d0 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
177e0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
177f0 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
17800 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
17810 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
17820 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
17830 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
17840 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
17850 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
17860 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
17870 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
17880 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
17890 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
178a0 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
178b0 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
178c0 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
178d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
178e0 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
178f0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
17900 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
17910 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
17920 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
17930 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
17940 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
17950 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
17960 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
17970 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
17980 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
17990 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
179a0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
179b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
179c0 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
179d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
179e0 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
179f0 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
17a00 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
17a10 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
17a20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
17a30 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
17a40 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
17a50 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
17a60 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
17a70 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
17a80 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
17a90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
17aa0 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
17ab0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
17ac0 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
17ad0 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
17ae0 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
17af0 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
17b00 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
17b10 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
17b20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
17b30 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
17b40 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
17b50 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
17b60 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
17b70 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
17b80 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
17b90 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
17ba0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
17bb0 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
17bc0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
17bd0 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
17be0 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
17c10 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
17c20 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
17c30 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c50 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
17c60 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
17c70 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
17c80 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
17c90 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
17ca0 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
17cb0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
17cc0 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
17cd0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
17ce0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
17cf0 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
17d00 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
17d10 3c 73 7a 48 64 72 20 26 26 20 75 3c 70 2d 3e 6e  <szHdr && u<p->n
17d20 46 69 65 6c 64 20 26 26 20 64 3c 3d 6e 4b 65 79  Field && d<=nKey
17d30 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
17d40 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
17d50 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
17d60 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
17d70 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
17d80 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
17d90 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
17da0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
17db0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
17dc0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
17dd0 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
17de0 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
17df0 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
17e00 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c  .    pMem->zMall
17e10 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d  oc = 0;.    d +=
17e20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17e30 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20  alGet(&aKey[d], 
17e40 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65  serial_type, pMe
17e50 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  m);.    pMem++;.
17e60 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61      u++;.  }.  a
17e70 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
17e80 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
17e90 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
17ea0 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  u;.}..#if SQLITE
17eb0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
17ec0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
17ed0 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
17ee0 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
17ef0 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
17f00 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
17f10 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
17f20 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
17f30 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
17f40 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
17f50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
17f60 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
17f70 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
17f80 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
17f90 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17fa0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
17fb0 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
17fc0 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
17fd0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
17fe0 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
17ff0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
18000 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
18010 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
18020 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
18030 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
18040 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
18050 6d 69 74 69 76 65 73 2e 0a 2a 2f 0a 73 74 61 74  mitives..*/.stat
18060 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
18070 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
18080 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
18090 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
180a0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
180b0 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
180c0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 2f 2a  cord *pPKey2  /*
180d0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
180e0 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
180f0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
18100 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
18110 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
18120 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
18130 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
18140 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
18150 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c  f next header el
18160 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73  ement */.  u32 s
18170 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a  zHdr1;        /*
18180 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
18190 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
181a0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74  int i = 0;.  int
181b0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74   rc = 0;.  const
181c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
181d0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
181e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
181f0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  Key1;.  KeyInfo 
18200 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d  *pKeyInfo;.  Mem
18210 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e   mem1;..  pKeyIn
18220 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65  fo = pPKey2->pKe
18230 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e  yInfo;.  mem1.en
18240 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
18250 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70  c;.  mem1.db = p
18260 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f  KeyInfo->db;.  /
18270 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30  * mem1.flags = 0
18280 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e  ;  // Will be in
18290 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c  itialized by sql
182a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
182b0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c  t() */.  VVA_ONL
182c0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
182d0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
182e0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
182f0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
18300 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
18310 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
18320 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
18330 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
18340 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
18350 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
18360 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
18370 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
18380 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
18390 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
183a0 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
183b0 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
183c0 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
183d0 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
183e0 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
183f0 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
18400 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
18410 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
18420 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
18430 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
18440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
18450 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
18460 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
18470 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
18480 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
18490 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
184a0 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
184b0 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
184c0 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
184d0 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
184e0 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
184f0 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
18500 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
18510 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
18520 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
18530 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
18540 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
18550 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
18560 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
18570 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
18580 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
18590 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
185a0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
185b0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
185c0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
185d0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
185e0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
185f0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
18600 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
18610 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
18620 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
18630 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
18640 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
18650 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
18660 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
18670 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
18680 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
18690 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
186a0 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
186b0 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
186c0 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
186d0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
186e0 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
186f0 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
18700 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
18710 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
18720 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
18730 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
18740 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
18750 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
18760 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
18770 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
18780 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
18790 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
187a0 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
187b0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
187c0 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
187d0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
187e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
187f0 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
18800 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
18810 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
18820 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18830 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
18840 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
18850 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
18860 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
18870 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
18880 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
18890 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
188a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
188b0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
188c0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
188d0 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
188e0 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
188f0 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
18900 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
18910 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
18920 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
18930 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
18940 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
18950 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
18960 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30   mem1.zMalloc==0
18970 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
18980 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
18990 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d     if( pKeyInfo-
189a0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29  >aSortOrder[i] )
189b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
189c0 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74  rc;  /* Invert t
189d0 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45  he result for DE
189e0 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a  SC sort order. *
189f0 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
18a00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18a10 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
18a20 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
18a30 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
18a40 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
18a50 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
18a60 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
18a70 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
18a80 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
18a90 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
18aa0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
18ab0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
18ac0 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
18ad0 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
18ae0 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
18af0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
18b00 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
18b10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
18b20 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
18b30 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
18b40 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
18b50 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
18b60 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
18b70 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
18b80 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
18b90 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
18ba0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
18bb0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
18bc0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
18bd0 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   return pPKey2->
18be0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65  default_rc;.}.#e
18bf0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
18c00 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
18c10 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
18c20 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
18c30 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
18c40 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
18c50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18c60 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
18c70 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
18c80 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
18c90 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
18ca0 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
18cb0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
18cc0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
18cd0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
18ce0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
18cf0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
18d00 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
18d10 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
18d20 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
18d30 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
18d40 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
18d50 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
18d60 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
18d70 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a   CollSeq *pColl.
18d80 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e  ){.  if( pMem1->
18d90 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
18da0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ){.    /* The st
18db0 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64  rings are alread
18dc0 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  y in the correct
18dd0 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c   encoding.  Call
18de0 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d   the.     ** com
18df0 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
18e00 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20   directly */.   
18e10 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78   return pColl->x
18e20 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
18e30 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d  ,pMem1->n,pMem1-
18e40 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d  >z,pMem2->n,pMem
18e50 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2->z);.  }else{.
18e60 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
18e70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20  const void *v1, 
18e80 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c  *v2;.    int n1,
18e90 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b   n2;.    Mem c1;
18ea0 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20  .    Mem c2;.   
18eb0 20 6d 65 6d 73 65 74 28 26 63 31 2c 20 30 2c 20   memset(&c1, 0, 
18ec0 73 69 7a 65 6f 66 28 63 31 29 29 3b 0a 20 20 20  sizeof(c1));.   
18ed0 20 6d 65 6d 73 65 74 28 26 63 32 2c 20 30 2c 20   memset(&c2, 0, 
18ee0 73 69 7a 65 6f 66 28 63 32 29 29 3b 0a 20 20 20  sizeof(c2));.   
18ef0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
18f00 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
18f10 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
18f20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
18f30 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
18f40 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
18f50 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
18f60 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
18f70 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
18f80 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
18f90 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
18fa0 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
18fb0 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
18fc0 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
18fd0 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
18fe0 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
18ff0 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
19000 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
19010 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
19020 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
19030 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73  , n2, v2);.    s
19040 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
19050 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
19060 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
19070 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
19080 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
19090 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
190a0 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69  he values contai
190b0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d  ned by the two m
190c0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74  emory cells, ret
190d0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69  urning.** negati
190e0 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69  ve, zero or posi
190f0 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73  tive if pMem1 is
19100 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
19110 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
19120 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20  .** than pMem2. 
19130 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73  Sorting order is
19140 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66   NULL's first, f
19150 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65  ollowed by numbe
19160 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20  rs (integers.** 
19170 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65  and reals) sorte
19180 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66  d numerically, f
19190 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20  ollowed by text 
191a0 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63  ordered by the c
191b0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
191c0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66  ence pColl and f
191d0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72  inally blob's or
191e0 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28  dered by memcmp(
191f0 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c  )..**.** Two NUL
19200 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  L values are con
19210 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79  sidered equal by
19220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
19230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65  */.int sqlite3Me
19240 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  mCompare(const M
19250 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74  em *pMem1, const
19260 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e   Mem *pMem2, con
19270 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
19280 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  l){.  int rc;.  
19290 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
192a0 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
192b0 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
192c0 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
192d0 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
192e0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
192f0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
19300 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
19310 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
19320 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
19330 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
19340 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
19350 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
19360 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
19370 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
19380 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
19390 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
193a0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
193b0 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
193c0 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
193d0 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ll);.  }..  /* I
193e0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
193f0 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
19400 6f 74 68 65 72 20 69 73 20 6e 6f 74 2c 20 74 68  other is not, th
19410 65 20 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73  e number is less
19420 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
19430 72 65 20 6e 75 6d 62 65 72 73 2c 20 63 6f 6d 70  re numbers, comp
19440 61 72 65 20 61 73 20 72 65 61 6c 73 20 69 66 20  are as reals if 
19450 6f 6e 65 20 69 73 20 61 20 72 65 61 6c 2c 20 6f  one is a real, o
19460 72 20 61 73 20 69 6e 74 65 67 65 72 73 0a 20 20  r as integers.  
19470 2a 2a 20 69 66 20 62 6f 74 68 20 76 61 6c 75 65  ** if both value
19480 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 2e 0a  s are integers..
19490 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
194a0 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49  ned_flags&(MEM_I
194b0 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a  nt|MEM_Real) ){.
194c0 20 20 20 20 64 6f 75 62 6c 65 20 72 31 2c 20 72      double r1, r
194d0 32 3b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  2;.    if( (f1 &
194e0 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d   f2 & MEM_Int)!=
194f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
19500 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d  Mem1->u.i < pMem
19510 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
19520 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
19530 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32  em1->u.i > pMem2
19540 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 31  ->u.i ) return 1
19550 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
19560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19570 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
19580 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 70   ){.      r1 = p
19590 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c  Mem1->r;.    }el
195a0 73 65 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49  se if( (f1&MEM_I
195b0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
195c0 72 31 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65  r1 = (double)pMe
195d0 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c  m1->u.i;.    }el
195e0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
195f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
19600 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f2&MEM_Real)!
19610 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d  =0 ){.      r2 =
19620 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d   pMem2->r;.    }
19630 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d  else if( (f2&MEM
19640 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
19650 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70    r2 = (double)p
19660 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem2->u.i;.    }
19670 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
19680 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
19690 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74   if( r1<r2 ) ret
196a0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
196b0 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31  r1>r2 ) return 1
196c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
196d0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
196e0 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
196f0 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
19700 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
19710 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
19720 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
19730 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
19740 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
19750 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
19760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
19770 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
19780 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
19790 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
197a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
197b0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
197c0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
197d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
197e0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
197f0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
19800 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
19810 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
19820 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
19830 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
19840 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
19850 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
19860 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
19870 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
19880 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
19890 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
198a0 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
198b0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
198c0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
198d0 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
198e0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
198f0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
19900 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
19910 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
19920 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
19930 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
19940 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
19950 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
19960 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
19970 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
19980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
19990 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
199a0 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
199b0 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   pColl);.    }. 
199c0 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
199d0 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
199e0 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
199f0 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
19a00 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
19a10 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
19a20 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
19a30 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
19a40 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
19a50 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
19a60 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
19a70 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  mp().  */.  rc =
19a80 20 6d 65 6d 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a   memcmp(pMem1->z
19a90 2c 20 70 4d 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65  , pMem2->z, (pMe
19aa0 6d 31 2d 3e 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f  m1->n>pMem2->n)?
19ab0 70 4d 65 6d 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e  pMem2->n:pMem1->
19ac0 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
19ad0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 4d 65 6d  ){.    rc = pMem
19ae0 31 2d 3e 6e 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b  1->n - pMem2->n;
19af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19b00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
19b10 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
19b20 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
19b30 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69  nction is a seri
19b40 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20  al-type that.** 
19b50 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
19b60 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20  n integer - all 
19b70 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31  values between 1
19b80 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65   and 9 inclusive
19b90 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54   .** except 7. T
19ba0 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73  he second points
19bb0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
19bc0 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67  taining an integ
19bd0 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69  er value.** seri
19be0 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67  alized according
19bf0 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e   to serial_type.
19c00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
19c10 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61  eserializes.** a
19c20 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  nd returns the v
19c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
19c40 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65  i64 vdbeRecordDe
19c50 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69  codeInt(u32 seri
19c60 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75  al_type, const u
19c70 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20  8 *aKey){.  u32 
19c80 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  y;.  assert( COR
19c90 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69  RUPT_DB || (seri
19ca0 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65  al_type>=1 && se
19cb0 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20  rial_type<=9 && 
19cc0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20  serial_type!=7) 
19cd0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
19ce0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
19cf0 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65  case 0:.    case
19d00 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   1:.      testca
19d10 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
19d20 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19d30 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b   ONE_BYTE_INT(aK
19d40 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a  ey);.    case 2:
19d50 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19d60 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
19d70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57  .      return TW
19d80 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
19d90 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20  ;.    case 3:.  
19da0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
19db0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
19dc0 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45      return THREE
19dd0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
19de0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
19df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
19e00 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
19e10 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
19e20 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
19e30 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
19e40 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
19e50 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a  }.    case 5: {.
19e60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19e70 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
19e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55        return FOU
19e90 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
19ea0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
19eb0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
19ec0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20  T(aKey);.    }. 
19ed0 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20     case 6: {.   
19ee0 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f     u64 x = FOUR_
19ef0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
19f00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19f10 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
19f20 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
19f30 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
19f40 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
19f50 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
19f60 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a  (i64*)&x;.    }.
19f70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73    }..  return (s
19f80 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b  erial_type - 8);
19f90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
19fa0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
19fb0 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72   the two table r
19fc0 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63  ows or index rec
19fd0 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65  ords.** specifie
19fe0 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65  d by {nKey1, pKe
19ff0 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20  y1} and pPKey2. 
1a000 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65   It returns a ne
1a010 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20  gative, zero.** 
1a020 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65  or positive inte
1a030 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c  ger if key1 is l
1a040 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1a050 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65  to or .** greate
1a060 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68  r than key2.  Th
1a070 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d  e {nKey1, pKey1}
1a080 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62   key must be a b
1a090 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62  lob.** created b
1a0a0 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  y th OP_MakeReco
1a0b0 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1a0c0 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1a0d0 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1a0e0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1a0f0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1a100 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1a110 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1a120 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1a130 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1a140 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1a150 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1a160 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1a170 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1a180 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1a190 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1a1a0 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1a1b0 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1a1c0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1a1d0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1a1e0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1a1f0 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1a200 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1a210 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1a220 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1a230 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1a240 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1a250 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1a260 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1a270 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1a280 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74  PKey2->isCorrupt
1a290 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   to non-zero.** 
1a2a0 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  and return 0..*/
1a2b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1a2c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20  RecordCompare(. 
1a2d0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1a2e0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1a2f0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1a300 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1a310 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1a320 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1a330 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1a360 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1a370 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1a380 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3a0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1a3b0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1a3c0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1a3d0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3f0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1a400 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1a410 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a430 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1a440 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1a450 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1a460 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1a470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1a480 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1a490 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1a4a0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1a4d0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1a4e0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1a4f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1a500 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1a510 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1a520 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1a530 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1a540 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1a550 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1a560 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1a570 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1a580 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1a590 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1a5a0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1a5b0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1a5c0 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1a5d0 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1a5e0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1a5f0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1a600 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1a610 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1a620 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1a630 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1a640 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1a650 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1a660 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1a670 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1a680 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1a690 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1a6a0 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1a6b0 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1a6c0 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1a6d0 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1a6e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1a6f0 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1a700 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1a710 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1a720 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1a730 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1a740 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1a750 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1a760 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1a770 20 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72    pPKey2->isCorr
1a780 75 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45  upt = (u8)SQLITE
1a790 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a7a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1a7b0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1a7c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30  .    }.    i = 0
1a7d0 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c  ;.  }..  VVA_ONL
1a7e0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20  Y( mem1.zMalloc 
1a7f0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
1a800 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
1a810 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
1a820 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1a830 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1a840 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  ld+pPKey2->pKeyI
1a850 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
1a860 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20  Key2->nField .  
1a870 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
1a880 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1a890 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1a8a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1a8b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1a8c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1a8d0 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73  Field>0 );.  ass
1a8e0 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72  ert( idx1<=szHdr
1a8f0 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  1 || CORRUPT_DB 
1a900 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32  );.  do{.    u32
1a910 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1a920 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20     /* RHS is an 
1a930 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69  integer */.    i
1a940 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1a950 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20   MEM_Int ){.    
1a960 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1a970 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1a980 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1a990 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1a9a0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1a9b0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
1a9c0 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1a9d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1a9e0 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1a9f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1aa00 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1aa10 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1aa20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c  ){.        doubl
1aa30 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29  e rhs = (double)
1aa40 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1aa50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1aa60 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1aa70 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1aa80 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1aa90 20 69 66 28 20 6d 65 6d 31 2e 72 3c 72 68 73 20   if( mem1.r<rhs 
1aaa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1aab0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1aac0 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 72 3e 72  lse if( mem1.r>r
1aad0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  hs ){.          
1aae0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20  rc = +1;.       
1aaf0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1ab00 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1ab10 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1ab20 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1ab30 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1ab40 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1ab50 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1ab60 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1ab70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1ab80 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1ab90 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1aba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1abb0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1abc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1abd0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1abe0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1abf0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1ac00 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1ac10 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1ac20 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1ac30 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1ac40 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20  ype>=12 ){.     
1ac50 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1ac60 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1ac70 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1ac80 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1ac90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1aca0 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d      double rhs =
1acb0 20 70 52 68 73 2d 3e 72 3b 0a 20 20 20 20 20 20   pRhs->r;.      
1acc0 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20    double lhs;.  
1acd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1ace0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1acf0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1ad00 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1ad10 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1ad20 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1ad30 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 72      lhs = mem1.r
1ad40 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ad50 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d  .          lhs =
1ad60 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e   (double)mem1.u.
1ad70 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  i;.        }.   
1ad80 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1ad90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1ada0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1adb0 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1adc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1add0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1ade0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1adf0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1ae00 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1ae10 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1ae20 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1ae30 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ae40 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1ae50 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ae60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1ae70 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1ae80 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ae90 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1aea0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1aeb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1aec0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1aed0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1aee0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1aef0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1af00 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1af10 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1af20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1af30 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1af40 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1af50 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1af60 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1af70 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1af80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1af90 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1afa0 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1afb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1afc0 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28  2->isCorrupt = (
1afd0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1afe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1aff0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b010 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1b020 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1b030 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1b040 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1b050 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1b060 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1b070 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1b080 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1b090 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1b0a0 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1b0b0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1b0c0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1b0d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1b0e0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1b0f0 69 6e 67 28 26 6d 65 6d 31 2c 20 70 52 68 73 2c  ing(&mem1, pRhs,
1b100 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1b110 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
1b120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1b130 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65  nt nCmp = MIN(me
1b140 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  m1.n, pRhs->n);.
1b150 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1b160 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1b170 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1b180 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b190 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d  rc==0 ) rc = mem
1b1a0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a  1.n - pRhs->n; .
1b1b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b1c0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1b1d0 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  RHS is a blob */
1b1e0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1b1f0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1b200 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65  Blob ){.      ge
1b210 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1b220 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1b230 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1b240 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1b250 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1b260 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1b270 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70  2 || (serial_typ
1b280 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20  e & 0x01) ){.   
1b290 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1b2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b2b0 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73     int nStr = (s
1b2c0 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1b2d0 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1b2e0 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1b2f0 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1b300 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  y1 );.        te
1b310 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72  stcase( (d1+nStr
1b320 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  +1)==(unsigned)n
1b330 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1b340 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20  if( (d1+nStr) > 
1b350 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b360 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1b370 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d  ey2->isCorrupt =
1b380 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1b390 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1b3a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b3c0 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1b3d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b3e0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1b3f0 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
1b400 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1b410 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1b420 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1b430 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1b440 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1b450 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1b460 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1b470 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1b480 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
1b490 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
1b4a0 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1b4b0 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1b4c0 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
1b4d0 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
1b4e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1b4f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
1b500 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1b510 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1b520 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
1b530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43  .      assert( C
1b540 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
1b550 20 20 20 20 7c 7c 20 28 72 63 3c 30 20 26 26 20      || (rc<0 && 
1b560 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1b570 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1b580 65 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a  ey1, pPKey2)<0).
1b590 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 72 63            || (rc
1b5a0 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64  >0 && vdbeRecord
1b5b0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1b5c0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1b5d0 32 29 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20  2)>0).          
1b5e0 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1b5f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1b600 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
1b610 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f  ert( mem1.zMallo
1b620 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1b630 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1b640 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b  ;.    }..    i++
1b660 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1b670 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1b680 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1b690 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1b6a0 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
1b6b0 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
1b6c0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
1b6d0 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
1b6e0 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70  ed)szHdr1 && i<p
1b6f0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26  PKey2->nField &&
1b700 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
1b710 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
1b720 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1b730 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1b740 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1b750 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1b760 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1b770 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1b780 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1b790 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1b7a0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1b7b0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1b7c0 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1b7d0 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1b7e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1b7f0 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  em1.zMalloc==0 )
1b800 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1b810 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1b820 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1b830 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1b840 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1b850 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1b860 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1b870 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1b880 75 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61  urn the the defa
1b890 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1b8a0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1b8b0 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1b8c0 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 64      || pPKey2->d
1b8d0 65 66 61 75 6c 74 5f 72 63 3d 3d 76 64 62 65 52  efault_rc==vdbeR
1b8e0 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1b8f0 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1b900 70 50 4b 65 79 32 29 20 0a 20 20 20 20 20 20 20  pPKey2) .       
1b910 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1b920 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1b930 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  );.  return pPKe
1b940 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1b950 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1b960 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
1b970 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
1b980 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
1b990 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
1b9a0 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
1b9b0 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
1b9c0 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ey2 is an intege
1b9d0 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a  r, and (b) the .
1b9e0 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  ** size-of-heade
1b9f0 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20  r varint at the 
1ba00 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
1ba10 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
1ba20 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20   single.** byte 
1ba30 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68  (i.e. is less th
1ba40 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54  an 128)..**.** T
1ba50 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73  o avoid concerns
1ba60 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76   about buffer ov
1ba70 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f  erreads, this ro
1ba80 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73  utine is only us
1ba90 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73  ed.** on schemas
1baa0 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d   where the maxim
1bab0 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20  um valid header 
1bac0 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73  size is 63 bytes
1bad0 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61   or less..*/.sta
1bae0 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1baf0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20  rdCompareInt(.  
1bb00 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1bb10 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1bb20 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1bb30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1bb40 50 4b 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20  PKey2,       /* 
1bb50 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1bb60 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb80 49 67 6e 6f 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  Ignored */.){.  
1bb90 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
1bba0 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
1bbb0 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
1bbc0 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
1bbd0 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1bbe0 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
1bbf0 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
1bc00 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
1bc10 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20   u64 x;.  i64 v 
1bc20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
1bc30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73  ].u.i;.  i64 lhs
1bc40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1bc50 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20  ETER(bSkip);..  
1bc60 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d 30  assert( bSkip==0
1bc70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
1bc80 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
1bc90 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
1bca0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1bcb0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1bcc0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1bcd0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1bce0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1bcf0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1bd00 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1bd10 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1bd20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bd30 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1bd40 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1bd50 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1bd60 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1bd70 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1bd80 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1bd90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1bda0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1bdb0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1bdc0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1bdd0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1bde0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1bdf0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1be00 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1be10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1be20 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1be30 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1be40 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1be50 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1be60 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1be70 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1be80 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1be90 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1bea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1beb0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1bec0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1bed0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1bee0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1bef0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1bf00 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1bf10 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1bf20 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1bf30 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1bf40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bf50 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1bf60 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1bf70 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1bf80 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1bf90 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1bfa0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1bfb0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1bfc0 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1bfd0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1bfe0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1bff0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1c000 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1c010 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1c020 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1c030 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1c040 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
1c050 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
1c060 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
1c070 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
1c080 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
1c090 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
1c0a0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
1c0b0 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
1c0c0 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
1c0d0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
1c0e0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
1c0f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
1c100 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
1c110 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
1c120 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
1c130 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
1c140 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
1c150 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
1c160 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
1c170 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
1c180 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
1c190 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
1c1a0 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
1c1b0 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
1c1c0 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
1c1d0 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
1c1e0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
1c1f0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
1c200 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
1c210 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
1c220 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1c230 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1c240 2c 20 30 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  , 0);..    defau
1c250 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
1c260 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c270 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
1c280 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1c290 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  0);.  }..  if( v
1c2a0 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1c2b0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1c2c0 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1c2d0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1c2e0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1c2f0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1c300 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1c310 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1c320 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1c330 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1c340 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1c350 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1c360 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73    */.    res = s
1c370 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1c380 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70  Compare(nKey1, p
1c390 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
1c3a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1c3b0 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1c3c0 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1c3d0 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64  ys are equal and
1c3e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72   there are no tr
1c3f0 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69  ailing.    ** fi
1c400 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b  elds. Return pPK
1c410 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1c420 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f  in this case. */
1c430 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
1c440 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1c450 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72   }..  assert( (r
1c460 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63  es==0 && vdbeRec
1c470 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1c480 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1c490 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20  Key2)==0).      
1c4a0 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64   || (res<0 && vd
1c4b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1c4c0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1c4d0 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20  1, pPKey2)<0).  
1c4e0 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26       || (res>0 &
1c4f0 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  & vdbeRecordComp
1c500 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1c510 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30  pKey1, pPKey2)>0
1c520 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52  ).       || CORR
1c530 55 50 54 5f 44 42 0a 20 20 29 3b 0a 20 20 72 65  UPT_DB.  );.  re
1c540 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
1c550 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c560 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
1c570 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
1c580 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c590 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20  pare() .** that 
1c5a0 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (a) the first fi
1c5b0 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73  eld of pPKey2 is
1c5c0 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20   a string, that 
1c5d0 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69  (b) the first fi
1c5e0 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  eld.** uses the 
1c5f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c600 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63  ce BINARY and (c
1c610 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  ) that the size-
1c620 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1c630 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72   .** at the star
1c640 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79  t of (pKey1/nKey
1c650 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  1) fits in a sin
1c660 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61  gle byte..*/.sta
1c670 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1c680 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1c690 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1c6a0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1c6b0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1c6c0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1c6d0 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1c6e0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1c6f0 20 20 69 6e 74 20 62 53 6b 69 70 0a 29 7b 0a 20    int bSkip.){. 
1c700 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
1c710 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
1c720 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
1c730 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
1c740 73 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  s;.  UNUSED_PARA
1c750 4d 45 54 45 52 28 62 53 6b 69 70 29 3b 0a 0a 20  METER(bSkip);.. 
1c760 20 61 73 73 65 72 74 28 20 62 53 6b 69 70 3d 3d   assert( bSkip==
1c770 30 20 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  0 );.  getVarint
1c780 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
1c790 72 69 61 6c 5f 74 79 70 65 29 3b 0a 0a 20 20 69  rial_type);..  i
1c7a0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1c7b0 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  2 ){.    res = p
1c7c0 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20  PKey2->r1;      
1c7d0 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29  /* (pKey1/nKey1)
1c7e0 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20   is a number or 
1c7f0 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73  a null */.  }els
1c800 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1c810 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a  ype & 0x01) ){ .
1c820 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1c830 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r2;      /* (p
1c840 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
1c850 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65   blob */.  }else
1c860 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a  {.    int nCmp;.
1c870 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20      int nStr;.  
1c880 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b    int szHdr = aK
1c890 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74  ey1[0];..    nSt
1c8a0 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  r = (serial_type
1c8b0 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66  -12) / 2;.    if
1c8c0 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29  ( (szHdr + nStr)
1c8d0 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20   > nKey1 ){.    
1c8e0 20 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72 72    pPKey2->isCorr
1c8f0 75 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54 45  upt = (u8)SQLITE
1c900 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c910 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1c920 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1c930 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d  */.    }.    nCm
1c940 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d  p = MIN( pPKey2-
1c950 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72  >aMem[0].n, nStr
1c960 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65   );.    res = me
1c970 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64  mcmp(&aKey1[szHd
1c980 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r], pPKey2->aMem
1c990 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20  [0].z, nCmp);.. 
1c9a0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1c9b0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74  .      res = nSt
1c9c0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  r - pPKey2->aMem
1c9d0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  [0].n;.      if(
1c9e0 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
1c9f0 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e     if( pPKey2->n
1ca00 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20  Field>1 ){.     
1ca10 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74       res = sqlit
1ca20 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ca30 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1ca40 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1ca50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ca60 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
1ca70 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1ca80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ca90 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1caa0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
1cab0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
1cac0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cad0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1cae0 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
1caf0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
1cb00 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
1cb10 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1cb20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
1cb30 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1cb40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1cb50 72 74 28 20 28 72 65 73 3d 3d 30 20 26 26 20 76  rt( (res==0 && v
1cb60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1cb70 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1cb80 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30 29 0a  y1, pPKey2)==0).
1cb90 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3c 30         || (res<0
1cba0 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f   && vdbeRecordCo
1cbb0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1cbc0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29  , pKey1, pPKey2)
1cbd0 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72  <0).       || (r
1cbe0 65 73 3e 30 20 26 26 20 76 64 62 65 52 65 63 6f  es>0 && vdbeReco
1cbf0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1cc00 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1cc10 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20 20 7c  ey2)>0).       |
1cc20 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20  | CORRUPT_DB.   
1cc30 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70      || pPKey2->p
1cc40 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1cc50 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
1cc60 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1cc70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1cc80 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
1cc90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1cca0 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62  mpare() compatib
1ccb0 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73  le function.** s
1ccc0 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70  uitable for comp
1ccd0 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  aring serialized
1cce0 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
1ccf0 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
1cd00 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
1cd10 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
1cd20 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  */.RecordCompare
1cd30 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
1cd40 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64  Compare(Unpacked
1cd50 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a  Record *p){.  /*
1cd60 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
1cd70 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61  pareInt() and va
1cd80 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1cd90 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61  eString() both a
1cda0 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20  ssume.  ** that 
1cdb0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
1cdc0 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f  er varint that o
1cdd0 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61  ccurs at the sta
1cde0 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72  rt of each recor
1cdf0 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61  d.  ** fits in a
1ce00 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e   single byte (i.
1ce10 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73  e. is 127 or les
1ce20 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64  s). varintRecord
1ce30 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a  CompareInt().  *
1ce40 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  * also assumes t
1ce50 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
1ce60 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66  o overread a buf
1ce70 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20  fer by at least 
1ce80 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75  the .  ** maximu
1ce90 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c  m possible legal
1cea0 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75   header size plu
1ceb0 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75  s 8 bytes. Becau
1cec0 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  se there is.  **
1ced0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1cee0 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62  e at least 74 (b
1cef0 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65  ut not 136) byte
1cf00 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c  s of padding fol
1cf10 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a  lowing each.  **
1cf20 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
1cf30 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  o varintRecordCo
1cf40 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20  mpareInt() this 
1cf50 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69  makes it conveni
1cf60 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69  ent to.  ** limi
1cf70 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
1cf80 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62  e header to 64 b
1cf90 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68  ytes in cases wh
1cfa0 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69  ere the first fi
1cfb0 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69  eld.  ** is an i
1cfc0 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  nteger..  **.  *
1cfd0 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61  * The easiest wa
1cfe0 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  y to enforce thi
1cff0 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f  s limit is to co
1d000 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f  nsider only reco
1d010 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33  rds with.  ** 13
1d020 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e   fields or less.
1d030 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69   If the first fi
1d040 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65  eld is an intege
1d050 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c  r, the maximum l
1d060 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  egal.  ** header
1d070 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b   size is (12*5 +
1d080 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20   1 + 1) bytes.  
1d090 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65  */.  if( (p->pKe
1d0a0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1d0b0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  p->pKeyInfo->nXF
1d0c0 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20  ield)<=13 ){.   
1d0d0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
1d0e0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
1d0f0 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
1d100 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
1d110 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
1d120 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
1d130 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
1d140 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
1d150 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
1d160 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1d170 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
1d180 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
1d190 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
1d1a0 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
1d1b0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1d1c0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
1d1d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1d1e0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
1d1f0 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
1d200 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
1d210 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
1d220 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
1d230 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
1d240 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e  Blob))==0 && p->
1d250 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1d260 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  0]==0 ){.      a
1d270 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d  ssert( flags & M
1d280 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20  EM_Str );.      
1d290 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
1d2a0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
1d2b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1d2c0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1d2d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a  ecordCompare;.}.
1d2e0 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
1d2f0 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
1d300 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
1d310 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
1d320 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
1d330 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
1d340 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
1d350 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
1d360 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
1d370 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
1d380 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
1d390 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
1d3a0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
1d3b0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
1d3c0 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
1d3d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
1d3e0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
1d3f0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
1d400 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
1d410 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
1d420 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
1d430 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
1d440 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
1d450 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1d460 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
1d470 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
1d480 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1d490 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
1d4a0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
1d4b0 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
1d4c0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
1d4d0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
1d4e0 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
1d4f0 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
1d500 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
1d510 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
1d520 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
1d530 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1d540 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
1d550 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d560 52 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  R(db);..  /* Get
1d570 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d580 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
1d590 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
1d5a0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
1d5b0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
1d5c0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
1d5d0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
1d5e0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1d5f0 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
1d600 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
1d610 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
1d620 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
1d630 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
1d640 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
1d650 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
1d660 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
1d670 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
1d680 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d690 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1d6a0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
1d6b0 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
1d6c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1d6d0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
1d6e0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
1d6f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
1d700 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
1d710 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
1d720 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
1d730 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
1d740 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
1d750 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
1d760 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
1d770 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
1d780 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
1d790 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
1d7a0 72 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ry */.  memset(&
1d7b0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29  m, 0, sizeof(m))
1d7c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1d7d0 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
1d7e0 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
1d7f0 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1d800 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1d810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d820 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20  .  /* The index 
1d830 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e  entry must begin
1d840 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73   with a header s
1d850 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ize */.  (void)g
1d860 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29  etVarint32((u8*)
1d870 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74  m.z, szHdr);.  t
1d880 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1d890 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
1d8a0 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20   szHdr==m.n );. 
1d8b0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a   if( unlikely(sz
1d8c0 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a  Hdr<3 || (int)sz
1d8d0 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20  Hdr>m.n) ){.    
1d8e0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
1d8f0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
1d900 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69    /* The last fi
1d910 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  eld of the index
1d920 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e   should be an in
1d930 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49  teger - the ROWI
1d940 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74  D..  ** Verify t
1d950 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  hat the last ent
1d960 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20  ry really is an 
1d970 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76  integer. */.  (v
1d980 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
1d990 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d  (u8*)&m.z[szHdr-
1d9a0 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a  1], typeRowid);.
1d9b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1d9c0 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65  Rowid==1 );.  te
1d9d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1d9e0 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61  d==2 );.  testca
1d9f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33  se( typeRowid==3
1da00 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1da10 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a  typeRowid==4 );.
1da20 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1da30 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65  Rowid==5 );.  te
1da40 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1da50 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61  d==6 );.  testca
1da60 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38  se( typeRowid==8
1da70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1da80 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a  typeRowid==9 );.
1da90 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74    if( unlikely(t
1daa0 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79  ypeRowid<1 || ty
1dab0 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70  peRowid>9 || typ
1dac0 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20  eRowid==7) ){.  
1dad0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1dae0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1daf0 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71  .  lenRowid = sq
1db00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1db10 79 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64  ypeLen(typeRowid
1db20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
1db30 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c  u32)m.n==szHdr+l
1db40 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28  enRowid );.  if(
1db50 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d   unlikely((u32)m
1db60 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69  .n<szHdr+lenRowi
1db70 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  d) ){.    goto i
1db80 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1db90 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  ion;.  }..  /* F
1dba0 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72  etch the integer
1dbb0 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
1dbc0 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  the index record
1dbd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1dbe0 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29  eSerialGet((u8*)
1dbf0 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69  &m.z[m.n-lenRowi
1dc00 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26  d], typeRowid, &
1dc10 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76  v);.  *rowid = v
1dc20 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56  .u.i;.  sqlite3V
1dc30 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1dc40 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1dc50 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1dc60 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61  p here if databa
1dc70 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1dc80 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20   detected after 
1dc90 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  m has been.  ** 
1dca0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65  allocated.  Free
1dcb0 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e   the m object an
1dcc0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1dcd0 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f  CORRUPT. */.idx_
1dce0 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
1dcf0 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e  :.  testcase( m.
1dd00 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
1dd10 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1dd20 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1dd30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dd40 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
1dd50 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
1dd60 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
1dd70 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
1dd80 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
1dd90 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
1dda0 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
1ddb0 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
1ddc0 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
1ddd0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
1dde0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
1ddf0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1de00 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
1de10 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
1de20 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
1de30 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
1de40 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
1de50 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
1de60 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
1de70 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
1de80 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
1de90 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
1dea0 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
1deb0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1dec0 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
1ded0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1dee0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
1def0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
1df00 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
1df10 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
1df20 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
1df30 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
1df40 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
1df50 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
1df60 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
1df70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1df80 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
1df90 28 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  (.  VdbeCursor *
1dfa0 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
1dfb0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1dfc0 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
1dfd0 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
1dfe0 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
1dff0 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55  cked,       /* U
1e000 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
1e010 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  of key */.  int 
1e020 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e040 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
1e050 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
1e060 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
1e070 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
1e080 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
1e090 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72  *pCur = pC->pCur
1e0a0 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20  sor;.  Mem m;.. 
1e0b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e0c0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1e0d0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
1e0e0 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
1e0f0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1e100 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
1e110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
1e120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
1e130 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
1e140 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
1e150 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
1e160 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79  */.  /* nCellKey
1e170 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
1e180 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78  between 0 and 0x
1e190 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65  ffffffff because
1e1a0 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a   of the way.  **
1e1b0 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65   that btreeParse
1e1c0 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71  CellPtr() and sq
1e1d0 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32  lite3GetVarint32
1e1e0 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  () are implement
1e1f0 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c  ed */.  if( nCel
1e200 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c  lKey<=0 || nCell
1e210 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29  Key>0x7fffffff )
1e220 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a  {.    *res = 0;.
1e230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e240 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e250 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c    }.  memset(&m,
1e260 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a   0, sizeof(m));.
1e270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
1e280 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
1e290 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 28  C->pCursor, 0, (
1e2a0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
1e2b0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
1e2c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1e2d0 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
1e2e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1e2f0 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
1e300 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 3b 0a   pUnpacked, 0);.
1e310 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1e320 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
1e330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e350 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
1e360 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
1e370 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
1e380 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
1e390 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
1e3a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1e3b0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
1e3c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1e3d0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
1e3e0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
1e3f0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
1e400 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e410 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
1e420 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
1e430 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
1e440 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
1e450 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
1e460 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
1e470 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
1e480 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
1e490 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
1e4a0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
1e4b0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
1e4c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
1e4d0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
1e4e0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
1e4f0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
1e500 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
1e510 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1e520 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1e530 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
1e540 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
1e550 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
1e560 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
1e570 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
1e580 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
1e590 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
1e5a0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
1e5b0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
1e5c0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
1e5d0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
1e5e0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
1e5f0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
1e600 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
1e610 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
1e620 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
1e630 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
1e640 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
1e650 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
1e660 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
1e670 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
1e680 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1e690 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
1e6a0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
1e6b0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
1e6c0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
1e6d0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
1e6e0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
1e6f0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
1e700 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
1e710 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
1e720 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1e730 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1e740 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
1e750 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
1e760 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
1e770 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
1e780 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
1e790 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1e7a0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
1e7b0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
1e7c0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
1e7d0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
1e7e0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
1e7f0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
1e800 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
1e810 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
1e820 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
1e830 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
1e840 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
1e850 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
1e860 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
1e870 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
1e880 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
1e890 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
1e8a0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
1e8b0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
1e8c0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1e8d0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1e8e0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
1e8f0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
1e900 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
1e910 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
1e920 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
1e930 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
1e940 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
1e950 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
1e960 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
1e970 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
1e980 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
1e990 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
1e9a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1e9b0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
1e9c0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
1e9d0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
1e9e0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e9f0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
1ea00 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
1ea10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ea20 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
1ea30 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
1ea40 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
1ea50 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1ea60 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
1ea70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1ea80 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
1ea90 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
1eaa0 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
1eab0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
1eac0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
1ead0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
1eae0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
1eaf0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
1eb00 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
1eb10 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
1eb20 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
1eb30 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1eb40 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
1eb50 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
1eb60 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
1eb70 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
1eb80 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
1eb90 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
1eba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
1ebb0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
1ebc0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
1ebd0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
1ebe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
1ebf0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
1ec00 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
1ec10 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
1ec20 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
1ec30 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
1ec40 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
1ec50 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
1ec60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
1ec70 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
1ec80 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
1ec90 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
1eca0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1ecb0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
1ecc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
1ecd0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
1ece0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
1ecf0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
1ed00 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1ed10 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >db;.  sqlite3Db
1ed20 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
1ed30 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d  Msg);.  p->zErrM
1ed40 73 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  sg = sqlite3DbSt
1ed50 72 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e  rDup(db, pVtab->
1ed60 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1ed70 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
1ed80 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 56 74 61  zErrMsg);.  pVta
1ed90 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
1eda0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1edb0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1edc0 41 42 4c 45 20 2a 2f 0a                          ABLE */.