/ Hex Artifact Content
Login

Artifact 1401d45425567aef98ec618a247b8ffef8e10ba8:


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 2f 2a 0a 2a 2a  r];.  }.}../*.**
6630: 20 49 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   If the previous
6640: 20 6f 70 63 6f 64 65 20 69 73 20 6e 6f 74 20 22   opcode is not "
6650: 66 69 78 65 64 22 20 28 69 66 20 69 74 20 68 61  fixed" (if it ha
6660: 73 20 6e 6f 74 20 62 65 20 6a 75 6d 70 65 64 20  s not be jumped 
6670: 6f 76 65 72 29 0a 2a 2a 20 61 6e 64 20 69 66 20  over).** and if 
6680: 69 74 73 20 6f 75 74 70 75 74 20 72 65 67 69 73  its output regis
6690: 74 65 72 20 69 73 20 69 4f 6c 64 4f 75 74 2c 20  ter is iOldOut, 
66a0: 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20  then change the 
66b0: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 0a  output register.
66c0: 2a 2a 20 74 6f 20 69 4e 65 77 4f 75 74 20 61 6e  ** to iNewOut an
66d0: 64 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  d return true.  
66e0: 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
66f0: 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73   false..*/.int s
6700: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6710: 44 65 73 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  Dest(Vdbe *p, in
6720: 74 20 69 4f 6c 64 4f 75 74 2c 20 69 6e 74 20 69  t iOldOut, int i
6730: 4e 65 77 4f 75 74 29 7b 0a 20 20 56 64 62 65 4f  NewOut){.  VdbeO
6740: 70 20 2a 70 4f 70 3b 0a 20 20 75 38 20 6f 70 66  p *pOp;.  u8 opf
6750: 6c 61 67 73 3b 0a 20 20 69 66 28 20 28 70 2d 3e  lags;.  if( (p->
6760: 6e 4f 70 2d 31 29 3c 3d 28 70 2d 3e 70 50 61 72  nOp-1)<=(p->pPar
6770: 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 29 20  se->iFixedOp) ) 
6780: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20  return 0;.  pOp 
6790: 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  = &p->aOp[p->nOp
67a0: 2d 31 5d 3b 0a 20 20 6f 70 66 6c 61 67 73 20 3d  -1];.  opflags =
67b0: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72   sqlite3OpcodePr
67c0: 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f  operty[pOp->opco
67d0: 64 65 5d 3b 0a 20 20 69 66 28 20 28 6f 70 66 6c  de];.  if( (opfl
67e0: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 33  ags & OPFLG_OUT3
67f0: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )!=0 && pOp->p3=
6800: 3d 69 4f 6c 64 4f 75 74 20 29 7b 0a 20 20 20 20  =iOldOut ){.    
6810: 70 4f 70 2d 3e 70 33 20 3d 20 69 4e 65 77 4f 75  pOp->p3 = iNewOu
6820: 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  t;.    return 1;
6830: 0a 20 20 7d 0a 20 20 69 66 28 20 28 6f 70 66 6c  .  }.  if( (opfl
6840: 61 67 73 20 26 20 4f 50 46 4c 47 5f 4f 55 54 32  ags & OPFLG_OUT2
6850: 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d  )!=0 && pOp->p3=
6860: 3d 69 4f 6c 64 4f 75 74 20 29 7b 0a 20 20 20 20  =iOldOut ){.    
6870: 70 4f 70 2d 3e 70 32 20 3d 20 69 4e 65 77 4f 75  pOp->p2 = iNewOu
6880: 74 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  t;.    return 1;
6890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
68a0: 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .}...#if defined
68b0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45  (SQLITE_ENABLE_E
68c0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29  XPLAIN_COMMENTS)
68d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
68e0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
68f0: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61  or one of the pa
6900: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20  rameters to the 
6910: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65  opcode pOp.** de
6920: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72  termined by char
6930: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74  acter c..*/.stat
6940: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65  ic int translate
6950: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20  P(char c, const 
6960: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20  Op *pOp){.  if( 
6970: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20  c=='1' ) return 
6980: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63  pOp->p1;.  if( c
6990: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70  =='2' ) return p
69a0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d  Op->p2;.  if( c=
69b0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='3' ) return pO
69c0: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d  p->p3;.  if( c==
69d0: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '4' ) return pOp
69e0: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e  ->p4.i;.  return
69f0: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a   pOp->p5;.}../*.
6a00: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
6a10: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d  ing for the "com
6a20: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61  ment" field of a
6a30: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73   VDBE opcode lis
6a40: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
6a50: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20  Synopsis: field 
6a60: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  in comments in t
6a70: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65  he vdbe.c source
6a80: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65   file gets conve
6a90: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78  rted.** to an ex
6aa0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  tra string that 
6ab0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6ac0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
6ad0: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a  Name().  In the.
6ae0: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74  ** absence of ot
6af0: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68  her comments, th
6b00: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f  is synopsis beco
6b10: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  mes the comment 
6b20: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a  on the opcode..*
6b30: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69  * Some translati
6b40: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a  on occurs:.**.**
6b50: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20         "PX"     
6b60: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20   ->  "r[X]".**  
6b70: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d       "PX@PY"   -
6b80: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22  >  "r[X..X+Y-1]"
6b90: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
6ba0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20   is 0 or 1.**   
6bb0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e      "PX@PY+1" ->
6bc0: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20    "r[X..X+Y]"   
6bd0: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20   or "r[x]" if y 
6be0: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50  is 0.**       "P
6bf0: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58  Y..PY"  ->  "r[X
6c00: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72  ..Y]"      or "r
6c10: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a  [x]" if y<=x.*/.
6c20: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c  static int displ
6c30: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e  ayComment(.  con
6c40: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20  st Op *pOp,     
6c50: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f  /* The opcode to
6c60: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f   be commented */
6c70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6c80: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75  P4,   /* Previou
6c90: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c  sly obtained val
6ca0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63  ue for P4 */.  c
6cb0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20  har *zTemp,     
6cc0: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c    /* Write resul
6cd0: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
6ce0: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f  nTemp          /
6cf0: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c  * Space availabl
6d00: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a  e in zTemp[] */.
6d10: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6d20: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  *zOpName;.  cons
6d30: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69  t char *zSynopsi
6d40: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65  s;.  int nOpName
6d50: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a  ;.  int ii, jj;.
6d60: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69    zOpName = sqli
6d70: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
6d80: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f  p->opcode);.  nO
6d90: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  pName = sqlite3S
6da0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29  trlen30(zOpName)
6db0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b  ;.  if( zOpName[
6dc0: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20  nOpName+1] ){.  
6dd0: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20    int seenCom = 
6de0: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20  0;.    char c;. 
6df0: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a     zSynopsis = z
6e00: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d  OpName += nOpNam
6e10: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69  e + 1;.    for(i
6e20: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70  i=jj=0; jj<nTemp
6e30: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f  -1 && (c = zSyno
6e40: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69  psis[ii])!=0; ii
6e50: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  ++){.      if( c
6e60: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20  =='P' ){.       
6e70: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b   c = zSynopsis[+
6e80: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii];.        if
6e90: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20  ( c=='4' ){.    
6ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
6eb0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
6ec0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c   zTemp+jj, "%s",
6ed0: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d   zP4);.        }
6ee0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20  else if( c=='X' 
6ef0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
6f00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
6f10: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
6f20: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
6f30: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  mment);.        
6f40: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20    seenCom = 1;. 
6f50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6f60: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d          int v1 =
6f70: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70   translateP(c, p
6f80: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Op);.          i
6f90: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20  nt v2;.         
6fa0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
6fb0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
6fc0: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b  p+jj, "%d", v1);
6fd0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
6fe0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
6ff0: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d  +ii+1, "@P", 2)=
7000: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7010: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20    ii += 3;.     
7020: 20 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 20 20 20 20  mp+jj);.        
7050: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61      v2 = transla
7060: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69  teP(zSynopsis[ii
7070: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20  ], pOp);.       
7080: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
7090: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
70a0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20  "+1",2)==0 ){.  
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
70c0: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
70d0: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20     v2++;.       
70e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
70f0: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20     if( v2>1 ){. 
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7110: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7120: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
7130: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d  , "..%d", v1+v2-
7140: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
7150: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
7160: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
7170: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e  ynopsis+ii+1, ".
7180: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70  .P3", 4)==0 && p
7190: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20  Op->p3==0 ){.   
71a0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34           ii += 4
71b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
71c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71d0: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
71e0: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
71f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7200: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b        zTemp[jj++
7210: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = c;.      }. 
7220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65     }.    if( !se
7230: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d  enCom && jj<nTem
7240: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d  p-5 && pOp->zCom
7250: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ment ){.      sq
7260: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7270: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7280: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e  j, "; %s", pOp->
7290: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
72a0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
72b0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
72c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
72d0: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70  jj<nTemp ) zTemp
72e0: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  [jj] = 0;.  }els
72f0: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  e if( pOp->zComm
7300: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ent ){.    sqlit
7310: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7320: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20  p, zTemp, "%s", 
7330: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7340: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33      jj = sqlite3
7350: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7360: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54  .  }else{.    zT
7370: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7380: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  jj = 0;.  }.  re
7390: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69  turn jj;.}.#endi
73a0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
73b0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69  G */...#if !defi
73c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
73d0: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66  EXPLAIN) || !def
73e0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20  ined(NDEBUG) \. 
73f0: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56      || defined(V
7400: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
7410: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
7420: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  EBUG)./*.** Comp
7430: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
7440: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
7450: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
7460: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
7470: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
7480: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
7490: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
74a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
74b0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
74c0: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
74d0: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
74e0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
74f0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65  p;.  assert( nTe
7500: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74  mp>=20 );.  swit
7510: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  ch( pOp->p4type 
7520: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b  ){.    case P4_K
7530: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
7540: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20  int i, j;.      
7550: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
7560: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79  o = pOp->p4.pKey
7570: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65  Info;.      asse
7580: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
7590: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
75a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
75b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
75c0: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79  mp, "k(%d", pKey
75d0: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20  Info->nField);. 
75e0: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33       i = sqlite3
75f0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b  Strlen30(zTemp);
7600: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
7610: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
7620: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
7630: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7640: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
7650: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
7660: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
7670: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
7680: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b  ->zName : "nil";
7690: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
76a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
76b0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  (zColl);.       
76c0: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d   if( n==6 && mem
76d0: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52  cmp(zColl,"BINAR
76e0: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Y",6)==0 ){.    
76f0: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42        zColl = "B
7700: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d  ";.          n =
7710: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
7720: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54        if( i+n>nT
7730: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20  emp-6 ){.       
7740: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70     memcpy(&zTemp
7750: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20  [i],",...",4);. 
7760: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7770: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7780: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
7790: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
77a0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
77b0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
77c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
77d0: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
77e0: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
77f0: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
7800: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
7810: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
7820: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
7830: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
7840: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
7850: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
7860: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
7870: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7880: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20   P4_COLLSEQ: {. 
7890: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
78a0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43  oll = pOp->p4.pC
78b0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  oll;.      sqlit
78c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
78d0: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30  p, zTemp, "(%.20
78e0: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  s)", pColl->zNam
78f0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7910: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
7920: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
7930: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e  f = pOp->p4.pFun
7940: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  c;.      sqlite3
7950: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7960: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22   zTemp, "%s(%d)"
7970: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
7980: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
7990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
79a0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
79b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
79c0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
79d0: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c  , zTemp, "%lld",
79e0: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b   *pOp->p4.pI64);
79f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7a00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
7a10: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73  INT32: {.      s
7a20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7a30: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7a40: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
7a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7a60: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
7a70: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
7a80: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7a90: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31  emp, zTemp, "%.1
7aa0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52  6g", *pOp->p4.pR
7ab0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eal);.      brea
7ac0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7ad0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20  e P4_MEM: {.    
7ae0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f    Mem *pMem = pO
7af0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20  p->p4.pMem;.    
7b00: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67    if( pMem->flag
7b10: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
7b20: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65         zP4 = pMe
7b30: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73  m->z;.      }els
7b40: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
7b50: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20  s & MEM_Int ){. 
7b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7b70: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7b80: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d  Temp, "%lld", pM
7b90: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20  em->u.i);.      
7ba0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
7bb0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
7bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7bd0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7be0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36  mp, zTemp, "%.16
7bf0: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20  g", pMem->r);.  
7c00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7c10: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7c20: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Null ){.        
7c30: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7c40: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7c50: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65  NULL");.      }e
7c60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
7c70: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  ert( pMem->flags
7c80: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
7c90: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62         zP4 = "(b
7ca0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20  lob)";.      }. 
7cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7cc0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7cd0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7ce0: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56  LE.    case P4_V
7cf0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TAB: {.      sql
7d00: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
7d10: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62   = pOp->p4.pVtab
7d20: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73  ->pVtab;.      s
7d30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7d40: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76  nTemp, zTemp, "v
7d50: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61  tab:%p:%p", pVta
7d60: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  b, pVtab->pModul
7d70: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
7d80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7d90: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
7da0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AY: {.      sqli
7db0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7dc0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61  mp, zTemp, "inta
7dd0: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72  rray");.      br
7de0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7df0: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  ase P4_SUBPROGRA
7e00: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M: {.      sqlit
7e10: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7e20: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72  p, zTemp, "progr
7e30: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
7e40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7e50: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
7e60: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
7e70: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
7e80: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7e90: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
7ea0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
7eb0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
7ec0: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
7ed0: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
7ee0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
7ef0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7f00: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29  assert( zP4!=0 )
7f10: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a  ;.  return zP4;.
7f20: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7f30: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
7f40: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
7f50: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
7f60: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
7f70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
7f80: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
7f90: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
7fa0: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
7fb0: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
7fc0: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
7fd0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
7fe0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
7ff0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
8000: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
8010: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
8020: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
8030: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
8040: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
8050: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
8060: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
8070: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
8080: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8090: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
80a0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
80b0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
80c0: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
80d0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
80e0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
80f0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
8100: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
8110: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
8120: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
8130: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
8140: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
8150: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
8160: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
8170: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
8180: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
8190: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
81a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
81b0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
81c0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
81d0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
81e0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
81f0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
8200: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
8210: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
8220: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8230: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
8240: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
8250: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
8260: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
8270: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
8280: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
8290: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
82a0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
82b0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
82c0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
82d0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
82e0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
82f0: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
8300: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
8310: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
8320: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
8330: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
8340: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
8350: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
8360: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
8370: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
8380: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
8390: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
83a0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
83b0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
83c0: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
83d0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
83e0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
83f0: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
8400: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
8410: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
8420: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
8430: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
8440: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
8450: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
8460: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
8470: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
8480: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
8490: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
84a0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
84b0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
84c0: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
84d0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
84e0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
84f0: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
8500: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
8510: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
8520: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
8530: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
8540: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
8550: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
8560: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
8570: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
8580: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
8590: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
85a0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
85b0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
85c0: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
85d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
85e0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
85f0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
8600: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
8610: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
8620: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
8630: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
8640: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
8650: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
8660: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
8670: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
8680: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
8690: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
86a0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
86b0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
86c0: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
86d0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
86e0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
86f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
8700: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
8710: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
8720: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
8730: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8740: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
8750: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
8760: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
8770: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
8780: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
8790: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
87a0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
87b0: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f  beEnter()..*/.vo
87c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65  id sqlite3VdbeLe
87d0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
87e0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
87f0: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
8800: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
8810: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
8820: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
8830: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
8840: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
8850: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
8860: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
8870: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
8880: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
8890: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
88a0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
88b0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
88c0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
88d0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
88e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
88f0: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
8900: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
8910: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
8920: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
8930: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
8940: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72  _DEBUG)./*.** Pr
8950: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63  int a single opc
8960: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
8970: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64  ne is used for d
8980: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
8990: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
89a0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a  bePrintOp(FILE *
89b0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70  pOut, int pc, Op
89c0: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a   *pOp){.  char *
89d0: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72  zP4;.  char zPtr
89e0: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f  [50];.  char zCo
89f0: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63  m[100];.  static
8a00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
8a10: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31  rmat1 = "%4d %-1
8a20: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25  3s %4d %4d %4d %
8a30: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b  -13s %.2X %s\n";
8a40: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29  .  if( pOut==0 )
8a50: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a   pOut = stdout;.
8a60: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50    zP4 = displayP
8a70: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a  4(pOp, zPtr, siz
8a80: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64  eof(zPtr));.#ifd
8a90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
8aa0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
8ab0: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65  S.  displayComme
8ac0: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f  nt(pOp, zP4, zCo
8ad0: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29  m, sizeof(zCom))
8ae0: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30  ;.#else.  zCom[0
8af0: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  ] = 0;.#endif.  
8b00: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69  /* NB:  The sqli
8b10: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20  te3OpcodeName() 
8b20: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  function is impl
8b30: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20  emented by code 
8b40: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20  created.  ** by 
8b50: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
8b60: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e  k and mkopcodec.
8b70: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63  awk scripts whic
8b80: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20  h extract the.  
8b90: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
8ba0: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73  rom the vdbe.c s
8bb0: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20  ource text */.  
8bc0: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46  fprintf(pOut, zF
8bd0: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20  ormat1, pc, .   
8be0: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65     sqlite3Opcode
8bf0: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65  Name(pOp->opcode
8c00: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d  ), pOp->p1, pOp-
8c10: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50  >p2, pOp->p3, zP
8c20: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20  4, pOp->p5,.    
8c30: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66    zCom.  );.  ff
8c40: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65  lush(pOut);.}.#e
8c50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  ndif../*.** Rele
8c60: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20  ase an array of 
8c70: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a  N Mem elements.*
8c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
8c90: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65  leaseMemArray(Me
8ca0: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  m *p, int N){.  
8cb0: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20  if( p && N ){.  
8cc0: 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20    Mem *pEnd;.   
8cd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8ce0: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
8cf0: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
8d00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
8d10: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
8d20: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
8d30: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b   for(pEnd=&p[N];
8d40: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20   p<pEnd; p++){. 
8d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
8d60: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
8d70: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  loc);.      }.  
8d80: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
8d90: 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26  }.    for(pEnd=&
8da0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b  p[N]; p<pEnd; p+
8db0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
8dc0: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
8dd0: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
8de0: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
8df0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
8e00: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
8e10: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
8e20: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
8e30: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
8e40: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
8e50: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
8e60: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
8e70: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
8e80: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
8e90: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
8ea0: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
8eb0: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
8ec0: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
8ed0: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
8ee0: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
8ef0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
8f00: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
8f10: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
8f20: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
8f30: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
8f40: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
8f50: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
8f60: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
8f70: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
8f80: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
8f90: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
8fa0: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
8fb0: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
8fc0: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
8fd0: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
8fe0: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
8ff0: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
9000: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
9010: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
9020: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
9030: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
9040: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
9050: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
9060: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
9070: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
9080: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
9090: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
90a0: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
90b0: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
90c0: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
90d0: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
90e0: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
90f0: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
9100: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
9110: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
9120: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
9130: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
9140: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
9150: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
9160: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
9170: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9180: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
9190: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
91a0: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
91b0: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
91c0: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
91d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
91e0: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
91f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
9200: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  >zMalloc ){.    
9210: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9220: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
9230: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d  );.        p->zM
9240: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
9250: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
9260: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
9270: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ed;.    }.    db
9280: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
9290: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a   malloc_failed;.
92a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
92b0: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
92c0: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
92d0: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
92e0: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
92f0: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
9300: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
9310: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
9320: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
9330: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
9340: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
9350: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
9360: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
9370: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
9380: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
9390: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
93a0: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
93b0: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
93c0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
93d0: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
93e0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
93f0: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
9400: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
9410: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
9420: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
9430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
9440: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
9450: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
9460: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
9470: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
9480: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
9490: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
94a0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
94b0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
94c0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
94d0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
94e0: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
94f0: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
9500: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
9510: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
9520: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
9530: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
9540: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
9550: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
9560: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
9570: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
9580: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
9590: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
95a0: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
95b0: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
95c0: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
95d0: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
95e0: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
95f0: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
9600: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
9610: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
9620: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
9630: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
9640: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
9650: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
9660: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
9670: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
9680: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
9690: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
96a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
96b0: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
96c0: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
96d0: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
96e0: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
96f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
9700: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
9710: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
9740: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
9750: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
9760: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9780: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
9790: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
97a0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
97b0: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
97d0: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
97e0: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
97f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
9810: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
9820: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
9830: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
9840: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
9850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9860: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
9870: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
9880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
98b0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
98c0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
98d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
98e0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
98f0: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
9900: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
9910: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
9920: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
9930: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
9940: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
9950: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
9960: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
9970: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
9980: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
9990: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
99a0: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
99b0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
99c0: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
99d0: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
99e0: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
99f0: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
9a00: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
9a10: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
9a20: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
9a30: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
9a40: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
9a50: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
9a60: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
9a70: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
9a80: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
9a90: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
9aa0: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
9ab0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
9ac0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
9ad0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
9ae0: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
9af0: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e  if a malloc() in
9b00: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73  side a call to s
9b10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9b20: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  xt() or.    ** s
9b30: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
9b40: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20  xt16() failed.  
9b50: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
9b60: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
9b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
9b80: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
9b90: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
9ba0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72  of output rows r
9bb0: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61  eaches nRow, tha
9bc0: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a  t means the.  **
9bd0: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e   listing has fin
9be0: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65  ished and sqlite
9bf0: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20  3_step() should 
9c00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9c10: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73  NE..  ** nRow is
9c20: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
9c30: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
9c40: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  n the main progr
9c50: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68  am, plus.  ** th
9c60: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d  e sum of the num
9c70: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61  ber of rows in a
9c80: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ll trigger subpr
9c90: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72  ograms encounter
9ca0: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20  ed.  ** so far. 
9cb0: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20   The nRow value 
9cc0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73  will increase as
9cd0: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62   new trigger sub
9ce0: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a  programs are.  *
9cf0: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62  * encountered, b
9d00: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76  ut p->pc will ev
9d10: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75  entually catch u
9d20: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a  p to nRow..  */.
9d30: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b    nRow = p->nOp;
9d40: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69  .  if( p->explai
9d50: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  n==1 ){.    /* T
9d60: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72  he first 8 memor
9d70: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64  y cells are used
9d80: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
9d90: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c  set.  So we will
9da0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65  .    ** commande
9db0: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20  er the 9th cell 
9dc0: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67  to use as storag
9dd0: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f  e for an array o
9de0: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a  f pointers.    *
9df0: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62  * to trigger sub
9e00: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56  programs.  The V
9e10: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65  DBE is guarantee
9e20: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61  d to have at lea
9e30: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  st 9.    ** cell
9e40: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  s.  */.    asser
9e50: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a  t( p->nMem>9 );.
9e60: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61      pSub = &p->a
9e70: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20  Mem[9];.    if( 
9e80: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f  pSub->flags&MEM_
9e90: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Blob ){.      /*
9ea0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61   On the first ca
9eb0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ll to sqlite3_st
9ec0: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20  ep(), pSub will 
9ed0: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74  hold a NULL.  It
9ee0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69   is.      ** ini
9ef0: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c  tialized to a BL
9f00: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42  OB by the P4_SUB
9f10: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69  PROGRAM processi
9f20: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a  ng logic below *
9f30: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70  /.      nSub = p
9f40: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64  Sub->n/sizeof(Vd
9f50: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75  be*);.      apSu
9f60: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20  b = (SubProgram 
9f70: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20  **)pSub->z;.    
9f80: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
9f90: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nSub; i++){.   
9fa0: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62     nRow += apSub
9fb0: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  [i]->nOp;.    }.
9fc0: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69    }..  do{.    i
9fd0: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77   = p->pc++;.  }w
9fe0: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20  hile( i<nRow && 
9ff0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26  p->explain==2 &&
a000: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64   p->aOp[i].opcod
a010: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b  e!=OP_Explain );
a020: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29  .  if( i>=nRow )
a030: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
a040: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20  LITE_OK;.    rc 
a050: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
a060: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75   }else if( db->u
a070: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
a080: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
a090: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b  QLITE_INTERRUPT;
a0a0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a0b0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
a0c0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d  te3SetString(&p-
a0d0: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25  >zErrMsg, db, "%
a0e0: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  s", sqlite3ErrSt
a0f0: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
a100: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
a110: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
a120: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
a130: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
a140: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
a150: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
a160: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
a170: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
a180: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
a190: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
a1a0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
a1b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a1c0: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
a1d0: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
a1e0: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
a1f0: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
a200: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
a210: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
a220: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
a230: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
a240: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
a250: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
a260: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
a270: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
a280: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
a290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2a0: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
a2b0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
a2c0: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
a2d0: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
a2e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a2f0: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
a300: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
a310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a320: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
a330: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
a340: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
a350: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
a360: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
a370: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
a380: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
a390: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
a3a0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
a3b0: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
a3c0: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
a3d0: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
a3e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
a3f0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
a400: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
a410: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
a420: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
a430: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
a440: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
a450: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
a460: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
a470: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
a480: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
a490: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
a4a0: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
a4b0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
a4c0: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
a4d0: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
a4e0: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
a4f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
a500: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
a510: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
a520: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
a530: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
a540: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
a550: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
a560: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
a570: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
a580: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
a590: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
a5a0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
a5b0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
a5c0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
a5d0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
a5e0: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
a5f0: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
a600: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
a610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
a620: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
a630: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
a640: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
a650: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
a660: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
a670: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
a680: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
a690: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
a6a0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
a6b0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
a6c0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
a6d0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
a6e0: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
a6f0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
a700: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
a710: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a720: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
a730: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
a740: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
a750: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a770: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
a780: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
a790: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
a7a0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
a7b0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7d0: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
a7e0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
a7f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
a800: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
a810: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
a840: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
a850: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
a860: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c  emGrow(pMem, 32,
a870: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20   0) ){          
a880: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
a890: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a8a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a8b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a8c0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
a8d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
a8e0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
a8f0: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
a900: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
a910: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
a920: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
a930: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a940: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
a950: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
a960: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
a970: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a980: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
a990: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
a9a0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
a9b0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
a9c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
a9d0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
a9e0: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
a9f0: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
aa00: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
aa10: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
aa20: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c  MemGrow(pMem, 4,
aa30: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   0) ){.        a
aa40: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
aa50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
aa60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aa70: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
aa80: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
aa90: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
aaa0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
aab0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
aac0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
aad0: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
aae0: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
aaf0: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
ab00: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
ab10: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
ab20: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
ab30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ab40: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
ab50: 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  S.      if( sqli
ab60: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
ab70: 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29 7b 0a  Mem, 500, 0) ){.
ab80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ab90: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
aba0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72  led );.        r
abb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
abc0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
abd0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
abe0: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
abf0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
ac00: 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74  = displayComment
ac10: 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d  (pOp, zP4, pMem-
ac20: 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20  >z, 500);.      
ac30: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
ac40: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20  TE_UTF8;.#else. 
ac50: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
ac60: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20   = MEM_Null;    
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac80: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f     /* Comment */
ac90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
aca0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e     p->nResColumn
acb0: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70   = 8 - 4*(p->exp
acc0: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e  lain-1);.    p->
acd0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d  pResultSet = &p-
ace0: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d  >aMem[1];.    p-
acf0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
ad00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
ad10: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _ROW;.  }.  retu
ad20: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ad30: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
ad40: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65  XPLAIN */..#ifde
ad50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
ad60: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53  *.** Print the S
ad70: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64  QL that was used
ad80: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56   to generate a V
ad90: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  DBE program..*/.
ada0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
adb0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70  PrintSql(Vdbe *p
adc0: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
add0: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d  *z = 0;.  if( p-
ade0: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d  >zSql ){.    z =
adf0: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73   p->zSql;.  }els
ae00: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20  e if( p->nOp>=1 
ae10: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62  ){.    const Vdb
ae20: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
ae30: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  Op[0];.    if( p
ae40: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
ae50: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
ae60: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  !=0 ){.      z =
ae70: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20   pOp->p4.z;.    
ae80: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
ae90: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b  Isspace(*z) ) z+
aea0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
aeb0: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53  f( z ) printf("S
aec0: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b  QL: [%s]\n", z);
aed0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
aee0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
aef0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
af00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
af10: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
af20: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52  ** Print an IOTR
af30: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77  ACE message show
af40: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e  ing SQL content.
af50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af60: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56  VdbeIOTraceSql(V
af70: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  dbe *p){.  int n
af80: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56  Op = p->nOp;.  V
af90: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
afa0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65  ( sqlite3IoTrace
afb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
afc0: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75  if( nOp<1 ) retu
afd0: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e  rn;.  pOp = &p->
afe0: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f  aOp[0];.  if( pO
aff0: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
b000: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
b010: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c  =0 ){.    int i,
b020: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31   j;.    char z[1
b030: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  000];.    sqlite
b040: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
b050: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70  f(z), z, "%s", p
b060: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66  Op->p4.z);.    f
b070: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49  or(i=0; sqlite3I
b080: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
b090: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30  +){}.    for(j=0
b0a0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ; z[i]; i++){.  
b0b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
b0c0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a  sspace(z[i]) ){.
b0d0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d          if( z[i-
b0e0: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20  1]!=' ' ){.     
b0f0: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20       z[j++] = ' 
b100: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ';.        }.   
b110: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b120: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
b130: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
b140: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
b150: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28   sqlite3IoTrace(
b160: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a  "SQL %s\n", z);.
b170: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
b180: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  !SQLITE_OMIT_TRA
b190: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  CE && SQLITE_ENA
b1a0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a  BLE_IOTRACE */..
b1b0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
b1c0: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65  pace from a fixe
b1d0: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e  d size buffer an
b1e0: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
b1f0: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70  er to.** that sp
b200: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ace.  If insuffi
b210: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61  cient space is a
b220: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e  vailable, return
b230: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
b240: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20   pBuf parameter 
b250: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
b260: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65  alue of a pointe
b270: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20  r which will.** 
b280: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20  receive the new 
b290: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73  memory.  pBuf is
b2a0: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20   normally NULL. 
b2b0: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a   If pBuf is not.
b2c0: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ** NULL, it mean
b2d0: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70  s that memory sp
b2e0: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ace has already 
b2f0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
b300: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20  nd that.** this 
b310: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
b320: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20  ot allocate any 
b330: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  new memory.  Whe
b340: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  n pBuf is not.**
b350: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74   NULL simply ret
b360: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20  urn pBuf.  Only 
b370: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d  allocate new mem
b380: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70  ory space when p
b390: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a  Buf.** is NULL..
b3a0: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74  **.** nByte is t
b3b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b3c0: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64  es of space need
b3d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f  ed..**.** *ppFro
b3e0: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69  m points to avai
b3f0: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20  lable space and 
b400: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74  pEnd points to t
b410: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
b420: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
b430: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73  .  When space is
b440: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46   allocated, *ppF
b450: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20  rom is advanced 
b460: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20  past.** the end 
b470: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
b480: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70   space..**.** *p
b490: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74  nByte is a count
b4a0: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  er of the number
b4b0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
b4c0: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69  ce that have fai
b4d0: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61  led.** to alloca
b4e0: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  te.  If there is
b4f0: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70   insufficient sp
b500: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74  ace in *ppFrom t
b510: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a  o satisfy the.**
b520: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69   request, then i
b530: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
b540: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   by the amount o
b550: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a  f the request..*
b560: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
b570: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69  llocSpace(.  voi
b580: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
b590: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72    /* Where retur
b5a0: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62  n pointer will b
b5b0: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e  e stored */.  in
b5c0: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20  t nByte,        
b5d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b5e0: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  bytes to allocat
b5f0: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72  e */.  u8 **ppFr
b600: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
b610: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20  N/OUT: Allocate 
b620: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a  from *ppFrom */.
b630: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20    u8 *pEnd,     
b640: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
b650: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74  r to 1 byte past
b660: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46   the end of *ppF
b670: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  rom buffer */.  
b680: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20  int *pnByte     
b690: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63       /* If alloc
b6a0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b6b0: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20  made, increment 
b6c0: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20  *pnByte */.){.  
b6d0: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
b6e0: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70  TE_ALIGNMENT(*pp
b6f0: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70  From) );.  if( p
b700: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75  Buf ) return pBu
b710: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  f;.  nByte = ROU
b720: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66  ND8(nByte);.  if
b730: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79  ( &(*ppFrom)[nBy
b740: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20  te] <= pEnd ){. 
b750: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
b760: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70  )*ppFrom;.    *p
b770: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a  pFrom += nByte;.
b780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e    }else{.    *pn
b790: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Byte += nByte;. 
b7a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66   }.  return pBuf
b7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e  ;.}../*.** Rewin
b7c0: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20  d the VDBE back 
b7d0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
b7e0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
b7f0: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69  for.** running i
b800: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
b810: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62  e3VdbeRewind(Vdb
b820: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e  e *p){.#if defin
b830: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
b840: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45   || defined(VDBE
b850: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20  _PROFILE).  int 
b860: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  i;.#endif.  asse
b870: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
b880: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
b890: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
b8a0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73  );..  /* There s
b8b0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73  hould be at leas
b8c0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20  t one opcode..  
b8d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
b8e0: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  nOp>0 );..  /* S
b8f0: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20  et the magic to 
b900: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73  VDBE_MAGIC_RUN s
b910: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
b920: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d  n later. */.  p-
b930: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
b940: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66  GIC_RUN;..#ifdef
b950: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
b960: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d  for(i=1; i<p->nM
b970: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  em; i++){.    as
b980: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d  sert( p->aMem[i]
b990: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20  .db==p->db );.  
b9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63  }.#endif.  p->pc
b9b0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d   = -1;.  p->rc =
b9c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d   SQLITE_OK;.  p-
b9d0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f  >errorAction = O
b9e0: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61  E_Abort;.  p->ma
b9f0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
ba00: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e  _RUN;.  p->nChan
ba10: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63  ge = 0;.  p->cac
ba20: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e  heCtr = 1;.  p->
ba30: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d  minWriteFileForm
ba40: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69  at = 255;.  p->i
ba50: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
ba60: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
ba70: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44  t = 0;.#ifdef VD
ba80: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72  BE_PROFILE.  for
ba90: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
baa0: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70  i++){.    p->aOp
bab0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  [i].cnt = 0;.   
bac0: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
bad0: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  s = 0;.  }.#endi
bae0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  f.}../*.** Prepa
baf0: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
bb00: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69  hine for executi
bb10: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  on for the first
bb20: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63   time after.** c
bb30: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74  reating the virt
bb40: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68  ual machine.  Th
bb50: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e  is involves thin
bb60: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c  gs such.** as al
bb70: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73  locating stack s
bb80: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  pace and initial
bb90: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
bba0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
bbb0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
bbc0: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
bbd0: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
bbe0: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
bbf0: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
bc00: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
bc10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bc20: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
bc30: 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20  d exact once on 
bc40: 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d  a each virtual m
bc50: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72  achine..** After
bc60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
bc70: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68   called the VM h
bc80: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65  as been "package
bc90: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a  d" and is ready.
bca0: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65  ** to run.  Afte
bcb0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
bcc0: 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72  s called, futher
bcd0: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
bce0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29  lite3VdbeAddOp()
bcf0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70   functions are p
bd00: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73  rohibited.  This
bd10: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e   routine disconn
bd20: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65  ects.** the Vdbe
bd30: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
bd40: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70  object that help
bd50: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73  ed generate it s
bd60: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68  o that the.** th
bd70: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61  e Vdbe becomes a
bd80: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e  n independent en
bd90: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72  tity and the Par
bda0: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  se object can be
bdb0: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
bdc0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
bdd0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29  ite3VdbeRewind()
bde0: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65   procedure to re
bdf0: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20  store a virtual 
be00: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20  machine back.** 
be10: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
be20: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61  tate after it ha
be30: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76  s been run..*/.v
be40: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
be50: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
be60: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
be70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
be80: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73  e VDBE */.  Pars
be90: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20  e *pParse       
bea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
beb0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bec0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
bed0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
bee0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
bef0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
bf00: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20  */.  int nVar;  
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bf30: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
bf40: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20  /* Number of VM 
bf70: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
bf80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
bf90: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
bfa0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bfb0: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  f cursors requir
bfc0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ed */.  int nArg
bfd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bfe0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bff0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   of arguments in
c000: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
c010: 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20    int nOnce;    
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50   /* Number of OP
c040: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
c050: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ns */.  int n;  
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c080: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
c090: 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20  zCsr;           
c0a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c0b0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
c0c0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
c0d0: 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20  .  u8 *zEnd;    
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c100: 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d  past allocated m
c110: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
c120: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
c130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
c140: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f   much extra memo
c150: 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ry is needed */.
c160: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
c170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c180: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
c190: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
c1a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
c1b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
c1c0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
c1d0: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
c1e0: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
c1f0: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
c200: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
c210: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
c220: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
c230: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
c240: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
c250: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
c260: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
c270: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d  axArg;.  nOnce =
c280: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a   pParse->nOnce;.
c290: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29    if( nOnce==0 )
c2a0: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45   nOnce = 1; /* E
c2b0: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f  nsure at least o
c2c0: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f  ne byte in p->aO
c2d0: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a  nceFlag[] */.  .
c2e0: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
c2f0: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
c300: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
c310: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
c320: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
c330: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
c340: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
c350: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
c360: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
c370: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
c380: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
c390: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
c3a0: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
c3b0: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
c3c0: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
c3d0: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
c3e0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
c3f0: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
c400: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
c410: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
c420: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
c430: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
c440: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
c450: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
c460: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
c470: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
c480: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
c490: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
c4a0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
c4b0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
c4c0: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
c4d0: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20   registers, SQL 
c4e0: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20  variables, VDBE 
c4f0: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a  cursors and .  *
c500: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * an array to ma
c510: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69  rshal SQL functi
c520: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e  on arguments in.
c530: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28  .  */.  zCsr = (
c540: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  u8*)&p->aOp[p->n
c550: 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op];            
c560: 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61  /* Memory avalia
c570: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
c580: 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28  on */.  zEnd = (
c590: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72  u8*)&p->aOp[pPar
c5a0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  se->nOpAlloc];  
c5b0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
c5c0: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
c5d0: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
c5e0: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
c5f0: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
c600: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
c610: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
c620: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
c630: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
c640: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
c650: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
c660: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
c670: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
c680: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
c690: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
c6a0: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
c6b0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
c6c0: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
c6d0: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
c6e0: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
c6f0: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
c700: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
c710: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
c720: 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a 20 20  ocated in two.  
c730: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74  ** passes.  On t
c740: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77  he first pass, w
c750: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75  e try to reuse u
c760: 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 20 74  nused space at t
c770: 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20  he .  ** end of 
c780: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
c790: 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  .  If we are una
c7a0: 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61  ble to satisfy a
c7b0: 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72  ll memory.  ** r
c7c0: 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72  equirements by r
c7d0: 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64  eusing the opcod
c7e0: 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68  e array tail, th
c7f0: 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  en the second.  
c800: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c  ** pass will fil
c810: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73  l in the rest us
c820: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f  ing a fresh allo
c830: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20  cation.  .  **. 
c840: 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73   ** This two-pas
c850: 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20  s approach that 
c860: 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d  reuses as much m
c870: 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
c880: 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  e from.  ** the 
c890: 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 20 61  leftover space a
c8a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
c8b0: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 63 61   opcode array ca
c8c0: 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a  n significantly.
c8d0: 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20    ** reduce the 
c8e0: 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
c8f0: 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 70 61   held by a prepa
c900: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  red statement.. 
c910: 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 6e   */.  do {.    n
c920: 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  Byte = 0;.    p-
c930: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
c940: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d  ce(p->aMem, nMem
c950: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a  *sizeof(Mem), &z
c960: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74  Csr, zEnd, &nByt
c970: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20  e);.    p->aVar 
c980: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
c990: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
c9a0: 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a  f(Mem), &zCsr, z
c9b0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
c9c0: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
c9d0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41 72 67  ocSpace(p->apArg
c9e0: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
c9f0: 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  m*), &zCsr, zEnd
ca00: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
ca10: 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f 63 53  ->azVar = allocS
ca20: 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c 20 6e  pace(p->azVar, n
ca30: 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  Var*sizeof(char*
ca40: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
ca50: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
ca60: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61  apCsr = allocSpa
ca70: 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  ce(p->apCsr, nCu
ca80: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
ca90: 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20 20 20  Cursor*),.      
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c      &zCsr, zEnd,
cac0: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
cad0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c  >aOnceFlag = all
cae0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65  ocSpace(p->aOnce
caf0: 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26 7a 43  Flag, nOnce, &zC
cb00: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
cb10: 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
cb20: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72   ){.      p->pFr
cb30: 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ee = sqlite3DbMa
cb40: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
cb50: 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  te);.    }.    z
cb60: 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a  Csr = p->pFree;.
cb70: 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72      zEnd = &zCsr
cb80: 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c  [nByte];.  }whil
cb90: 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d  e( nByte && !db-
cba0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cbb0: 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d  ..  p->nCursor =
cbc0: 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e   nCursor;.  p->n
cbd0: 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65  OnceFlag = nOnce
cbe0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20  ;.  if( p->aVar 
cbf0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d  ){.    p->nVar =
cc00: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20   (ynVar)nVar;.  
cc10: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61    for(n=0; n<nVa
cc20: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; n++){.      p
cc30: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20  ->aVar[n].flags 
cc40: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
cc50: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20    p->aVar[n].db 
cc60: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
cc70: 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29    if( p->azVar )
cc80: 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d  {.    p->nzVar =
cc90: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
cca0: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a      memcpy(p->az
ccb0: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  Var, pParse->azV
ccc0: 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a  ar, p->nzVar*siz
ccd0: 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29  eof(p->azVar[0])
cce0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
ccf0: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20  arse->azVar, 0, 
cd00: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69  pParse->nzVar*si
cd10: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56  zeof(pParse->azV
cd20: 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69  ar[0]));.  }.  i
cd30: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
cd40: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20    p->aMem--;    
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73    /* aMem[] goes
cd70: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f   from 1..nMem */
cd80: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e  .    p->nMem = n
cd90: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Mem;            
cda0: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f       /*       no
cdb0: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31  t from 0..nMem-1
cdc0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b   */.    for(n=1;
cdd0: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a   n<=nMem; n++){.
cde0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
cdf0: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  .flags = MEM_Und
ce00: 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d  efined;.      p-
ce10: 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62  >aMem[n].db = db
ce20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d  ;.    }.  }.  p-
ce30: 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73  >explain = pPars
ce40: 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71  e->explain;.  sq
ce50: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
ce60: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
ce70: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72  se a VDBE cursor
ce80: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c   and release all
ce90: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74   the resources t
cea0: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68  hat cursor .** h
ceb0: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a  appens to hold..
cec0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
ced0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64  dbeFreeCursor(Vd
cee0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f  be *p, VdbeCurso
cef0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70  r *pCx){.  if( p
cf00: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  Cx==0 ){.    ret
cf10: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
cf20: 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73  e3VdbeSorterClos
cf30: 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20  e(p->db, pCx);. 
cf40: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
cf50: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
cf60: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
cf70: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78  ;.    /* The pCx
cf80: 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62  ->pCursor will b
cf90: 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69  e close automati
cfa0: 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69  cally, if it exi
cfb0: 73 74 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74  sts, by.    ** t
cfc0: 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a  he call above. *
cfd0: 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  /.  }else if( pC
cfe0: 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  x->pCursor ){.  
cff0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
d000: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70  oseCursor(pCx->p
d010: 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66  Cursor);.  }.#if
d020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d030: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
d040: 69 66 28 20 70 43 78 2d 3e 70 56 74 61 62 43 75  if( pCx->pVtabCu
d050: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rsor ){.    sqli
d060: 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20  te3_vtab_cursor 
d070: 2a 70 56 74 61 62 43 75 72 73 6f 72 20 3d 20 70  *pVtabCursor = p
d080: 43 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 3b  Cx->pVtabCursor;
d090: 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
d0a0: 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75  e3_module *pModu
d0b0: 6c 65 20 3d 20 70 56 74 61 62 43 75 72 73 6f 72  le = pVtabCursor
d0c0: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
d0d0: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d  ;.    p->inVtabM
d0e0: 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20 20 20 70  ethod = 1;.    p
d0f0: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
d100: 56 74 61 62 43 75 72 73 6f 72 29 3b 0a 20 20 20  VtabCursor);.   
d110: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64   p->inVtabMethod
d120: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
d130: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
d140: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
d150: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
d160: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
d170: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
d180: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
d190: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
d1a0: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
d1b0: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
d1c0: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
d1d0: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
d1e0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
d1f0: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
d200: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
d210: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
d220: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
d230: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20  .  v->aOnceFlag 
d240: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46  = pFrame->aOnceF
d250: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46  lag;.  v->nOnceF
d260: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f  lag = pFrame->nO
d270: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f  nceFlag;.  v->aO
d280: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b  p = pFrame->aOp;
d290: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61  .  v->nOp = pFra
d2a0: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d  me->nOp;.  v->aM
d2b0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65  em = pFrame->aMe
d2c0: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70  m;.  v->nMem = p
d2d0: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76  Frame->nMem;.  v
d2e0: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65  ->apCsr = pFrame
d2f0: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43  ->apCsr;.  v->nC
d300: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e  ursor = pFrame->
d310: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62  nCursor;.  v->db
d320: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46  ->lastRowid = pF
d330: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b  rame->lastRowid;
d340: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20  .  v->nChange = 
d350: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b  pFrame->nChange;
d360: 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65  .  return pFrame
d370: 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ->pc;.}../*.** C
d380: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
d390: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c  ..**.** Also rel
d3a0: 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63  ease any dynamic
d3b0: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
d3c0: 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64  the VM in the Vd
d3d0: 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a  be.aMem memory .
d3e0: 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54  ** cell array. T
d3f0: 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
d400: 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   as the memory c
d410: 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f  ell array may co
d420: 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72  ntain.** pointer
d430: 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f  s to VdbeFrame o
d440: 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61  bjects, which ma
d450: 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69  y in turn contai
d460: 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  n pointers to.**
d470: 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a   open cursors..*
d480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
d490: 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64  oseAllCursors(Vd
d4a0: 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  be *p){.  if( p-
d4b0: 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  >pFrame ){.    V
d4c0: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65  dbeFrame *pFrame
d4d0: 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65  ;.    for(pFrame
d4e0: 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61  =p->pFrame; pFra
d4f0: 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72  me->pParent; pFr
d500: 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72  ame=pFrame->pPar
d510: 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ent);.    sqlite
d520: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72  3VdbeFrameRestor
d530: 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20  e(pFrame);.  }. 
d540: 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a   p->pFrame = 0;.
d550: 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b    p->nFrame = 0;
d560: 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72  ..  if( p->apCsr
d570: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
d580: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
d590: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a  >nCursor; i++){.
d5a0: 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72        VdbeCursor
d5b0: 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b   *pC = p->apCsr[
d5c0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  i];.      if( pC
d5d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
d5e0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d5f0: 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20  r(p, pC);.      
d600: 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20    p->apCsr[i] = 
d610: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
d620: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
d630: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
d640: 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d  eMemArray(&p->aM
d650: 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b  em[1], p->nMem);
d660: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d  .  }.  while( p-
d670: 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20  >pDelFrame ){.  
d680: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65    VdbeFrame *pDe
d690: 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65  l = p->pDelFrame
d6a0: 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61  ;.    p->pDelFra
d6b0: 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65  me = pDel->pPare
d6c0: 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  nt;.    sqlite3V
d6d0: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70  dbeFrameDelete(p
d6e0: 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Del);.  }..  /* 
d6f0: 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61  Delete any auxda
d700: 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d  ta allocations m
d710: 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f  ade by the VM */
d720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
d730: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d  leteAuxData(p, -
d740: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
d750: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
d760: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
d770: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
d780: 72 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a  r execution..**.
d790: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d7a0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
d7b0: 6c 79 20 63 6c 6f 73 65 20 61 6e 79 20 63 75 72  ly close any cur
d7c0: 73 6f 72 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64  sors, lists, and
d7d0: 2f 6f 72 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74  /or.** sorters t
d7e0: 68 61 74 20 77 65 72 65 20 6c 65 66 74 20 6f 70  hat were left op
d7f0: 65 6e 2e 20 20 49 74 20 61 6c 73 6f 20 64 65 6c  en.  It also del
d800: 65 74 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  etes the values 
d810: 6f 66 0a 2a 2a 20 76 61 72 69 61 62 6c 65 73 20  of.** variables 
d820: 69 6e 20 74 68 65 20 61 56 61 72 5b 5d 20 61 72  in the aVar[] ar
d830: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
d840: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
d850: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
d860: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
d870: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d880: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
d890: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
d8a0: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
d8b0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
d8c0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
d8d0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
d8e0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d8f0: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
d900: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
d910: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
d920: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
d930: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
d940: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
d950: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
d960: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
d970: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
d980: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
d990: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
d9a0: 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
d9b0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
d9c0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
d9d0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
d9e0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
d9f0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
da00: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
da10: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
da20: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
da30: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
da40: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
da50: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
da60: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
da70: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
da80: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
da90: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
daa0: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
dab0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
dac0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
dad0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
dae0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
daf0: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
db00: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
db10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
db20: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
db30: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
db40: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
db50: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
db60: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
db70: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
db80: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
db90: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
dba0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
dbb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
dbc0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
dbd0: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
dbe0: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
dbf0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
dc00: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
dc10: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
dc20: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
dc30: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
dc40: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
dc50: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
dc60: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
dc70: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
dc80: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
dc90: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
dca0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
dcb0: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
dcc0: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
dcd0: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
dce0: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
dcf0: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
dd00: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
dd10: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
dd20: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
dd30: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
dd40: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
dd50: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
dd60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
dd70: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
dd80: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
dd90: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
dda0: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
ddb0: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
ddc0: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
ddd0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
dde0: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
ddf0: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
de00: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
de10: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
de20: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
de30: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
de40: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
de50: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
de60: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
de70: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
de80: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
de90: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
dea0: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
deb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
dec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
ded0: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
dee0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
df10: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
df20: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
df30: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
df60: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
df70: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
df80: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
df90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
dfa0: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
dfb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
dfc0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
dfd0: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
dfe0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
dff0: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
e000: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
e010: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e020: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
e030: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
e040: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
e050: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
e060: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
e070: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
e080: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
e090: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
e0a0: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
e0b0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e0c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e0d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
e0e0: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
e0f0: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
e100: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
e110: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
e120: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
e130: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
e140: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
e150: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
e160: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
e170: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
e180: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
e190: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
e1a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
e1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
e1c0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
e1d0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
e1e0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
e1f0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
e200: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
e210: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
e220: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
e230: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
e240: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e250: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
e260: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
e270: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
e280: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
e290: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
e2a0: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
e2b0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
e2c0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
e2d0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
e2e0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
e2f0: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
e300: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
e310: 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
e320: 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
e330: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  saction */.  int
e340: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e350: 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d  .  int needXcomm
e360: 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  it = 0;..#ifdef 
e370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e380: 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69  UALTABLE.  /* Wi
e390: 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20  th this option, 
e3a0: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
e3b0: 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
e3c0: 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20  be simply .  ** 
e3d0: 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69  SQLITE_OK so p i
e3e0: 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a  s not used. .  *
e3f0: 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
e400: 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a  ETER(p);.#endif.
e410: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69  .  /* Before doi
e420: 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ng anything else
e430: 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63  , call the xSync
e440: 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  () callback for 
e450: 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c  any.  ** virtual
e460: 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77   module tables w
e470: 72 69 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74  ritten in this t
e480: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
e490: 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20   has to.  ** be 
e4a0: 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65  done before dete
e4b0: 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20  rmining whether 
e4c0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
e4d0: 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72   file is .  ** r
e4e0: 65 71 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78  equired, as an x
e4f0: 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
e500: 6d 61 79 20 61 64 64 20 61 6e 20 61 74 74 61 63  may add an attac
e510: 68 65 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a  hed database.  *
e520: 2a 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  * to the transac
e530: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
e540: 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e  = sqlite3VtabSyn
e550: 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20  c(db, p);..  /* 
e560: 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d  This loop determ
e570: 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 20  ines (a) if the 
e580: 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75  commit hook shou
e590: 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e  ld be invoked an
e5a0: 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d  d.  ** (b) how m
e5b0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 6c  any database fil
e5c0: 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69  es have open wri
e5d0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c  te transactions,
e5e0: 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75   not .  ** inclu
e5f0: 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61  ding the temp da
e600: 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 69  tabase. (b) is i
e610: 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65  mportant because
e620: 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20   if more than . 
e630: 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65   ** one database
e640: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65   file has an ope
e650: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
e660: 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f  ion, a master jo
e670: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
e680: 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  is required for 
e690: 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74  an atomic commit
e6a0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d  ..  */ .  for(i=
e6b0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
e6c0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
e6d0: 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20  ++){ .    Btree 
e6e0: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
e6f0: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73  ].pBt;.    if( s
e700: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
e710: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
e720: 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d     needXcommit =
e730: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21   1;.      if( i!
e740: 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20  =1 ) nTrans++;. 
e750: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e760: 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20  eEnter(pBt);.   
e770: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
e780: 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63  agerExclusiveLoc
e790: 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  k(sqlite3BtreePa
e7a0: 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20  ger(pBt));.     
e7b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
e7c0: 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ve(pBt);.    }. 
e7d0: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
e7e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
e7f0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
e800: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
e810: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61  any write-transa
e820: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69  ctions at all, i
e830: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74  nvoke the commit
e840: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e   hook */.  if( n
e850: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62  eedXcommit && db
e860: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
e870: 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62  k ){.    rc = db
e880: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
e890: 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67  k(db->pCommitArg
e8a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
e8b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e8c0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
e8d0: 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20  COMMITHOOK;.    
e8e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
e8f0: 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f  simple case - no
e900: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
e910: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
e920: 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20  t counting the. 
e930: 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73   ** TEMP databas
e940: 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63  e) has a transac
e950: 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54  tion active.   T
e960: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
e970: 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73  for the.  ** mas
e980: 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ter-journal..  *
e990: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65  *.  ** If the re
e9a0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71  turn value of sq
e9b0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
e9c0: 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72  ename() is a zer
e9d0: 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74  o length.  ** st
e9e0: 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74  ring, it means t
e9f0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
ea00: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20   is :memory: or 
ea10: 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e  a temp file.  In
ea20: 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65   .  ** that case
ea30: 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f   we do not suppo
ea40: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d  rt atomic multi-
ea50: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f  file commits, so
ea60: 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73   use the .  ** s
ea70: 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20  imple case then 
ea80: 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
ea90: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  0==sqlite3Strlen
eaa0: 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47  30(sqlite3BtreeG
eab0: 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
eac0: 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c  Db[0].pBt)).   |
ead0: 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b  | nTrans<=1.  ){
eae0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
eaf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
eb00: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
eb10: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
eb20: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
eb30: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
eb40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
eb50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
eb60: 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
eb70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
eb80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68   }..    /* Do th
eb90: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66  e commit only if
eba0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73   all databases s
ebb0: 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70  uccessfully comp
ebc0: 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20  lete phase 1. . 
ebd0: 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20     ** If one of 
ebe0: 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  the BtreeCommitP
ebf0: 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20  haseOne() calls 
ec00: 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69  fails, this indi
ec10: 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20  cates an.    ** 
ec20: 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64  IO error while d
ec30: 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
ec40: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
ec50: 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69  file. It is unli
ec60: 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74  kely,.    ** but
ec70: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49   could happen. I
ec80: 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e  n this case aban
ec90: 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61  don processing a
eca0: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
ecb0: 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ror..    */.    
ecc0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
ecd0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
ece0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
ecf0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
ed00: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
ed10: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
ed20: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ed30: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
ed40: 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a  aseTwo(pBt, 0);.
ed50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ed60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ed70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
ed80: 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64  ite3VtabCommit(d
ed90: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
eda0: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20   /* The complex 
edb0: 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20  case - There is 
edc0: 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69  a multi-file wri
edd0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  te-transaction a
ede0: 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73  ctive..  ** This
edf0: 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74   requires a mast
ee00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ee10: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72  to ensure the tr
ee20: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
ee30: 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d  * committed atom
ee40: 69 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  icly..  */.#ifnd
ee50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
ee60: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
ee70: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
ee80: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
ee90: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
eea0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
eeb0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
eec0: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
eed0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
eee0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
eef0: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
ef00: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
ef10: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
ef20: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
ef30: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
ef40: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
ef50: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
ef60: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
ef70: 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
ef80: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
ef90: 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
efa0: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
efb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
efc0: 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
efd0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
efe0: 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
eff0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
f000: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f010: 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
f020: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
f030: 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
f040: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
f050: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20  E_NOMEM;.    do 
f060: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
f070: 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
f080: 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
f090: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
f0a0: 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
f0b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
f0c0: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
f0d0: 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
f0e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f0f0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f100: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f110: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
f120: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f130: 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
f140: 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
f150: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f160: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
f170: 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
f180: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f190: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f1a0: 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
f1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
f1c0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
f1d0: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
f1e0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
f1f0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
f200: 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
f210: 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
f220: 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
f230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f240: 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
f250: 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
f260: 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
f270: 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
f280: 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
f290: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
f2a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
f2b0: 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
f2c0: 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
f2d0: 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
f2e0: 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
f2f0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
f300: 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
f310: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
f320: 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
f330: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
f340: 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
f350: 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
f360: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f370: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f380: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
f390: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
f3a0: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
f3b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f3c0: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
f3d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f3e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
f3f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f400: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
f410: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
f420: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
f430: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
f440: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f450: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
f460: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f470: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
f480: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
f490: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
f4a0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
f4b0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
f4c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f4d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f4e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f4f0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f500: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f510: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
f520: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
f530: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
f540: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
f550: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
f560: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
f570: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
f580: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
f590: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
f5a0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
f5b0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f5c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
f5d0: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
f5e0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
f5f0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
f600: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
f610: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
f620: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
f630: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
f640: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
f650: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
f660: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
f670: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f680: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f690: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
f6a0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
f6b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f6c0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
f6d0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
f6e0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
f6f0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
f700: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
f710: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
f720: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
f730: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f740: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
f750: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
f760: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
f770: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
f780: 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
f790: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f7a0: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
f7b0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
f7c0: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
f7d0: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
f7e0: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
f7f0: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
f800: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
f810: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
f820: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
f830: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
f840: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
f850: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
f860: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
f870: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f890: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
f8a0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
f8b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f8c0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
f8d0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
f8e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
f8f0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
f900: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
f910: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
f920: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f930: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
f940: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f950: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
f960: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
f970: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
f980: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
f990: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
f9a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
f9b0: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
f9c0: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
f9d0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
f9e0: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
f9f0: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
fa00: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
fa10: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
fa20: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
fa30: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
fa40: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
fa50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
fa60: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
fa70: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
fa80: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
fa90: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
faa0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fab0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fac0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fad0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
fae0: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
faf0: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
fb00: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fb10: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
fb20: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
fb30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
fb40: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
fb50: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
fb60: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
fb70: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
fb80: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
fb90: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fba0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
fbb0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
fbc0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fbd0: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
fbe0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
fbf0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fc00: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
fc10: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
fc20: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
fc30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fc40: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
fc50: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
fc60: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
fc70: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
fc80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fc90: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
fca0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fcb0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
fcc0: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
fcd0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
fce0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
fcf0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
fd00: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
fd10: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
fd20: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
fd30: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
fd40: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
fd50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fd60: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
fd70: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
fd80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
fd90: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
fda0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
fdb0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
fdc0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
fdd0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
fde0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fdf0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
fe00: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
fe10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
fe20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
fe30: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
fe40: 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
fe50: 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
fe60: 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
fe70: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
fe80: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
fe90: 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
fea0: 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
feb0: 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
fec0: 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
fed0: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
fee0: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
fef0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
ff00: 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20   zMaster, 1);.  
ff10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ff20: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
ff30: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
ff40: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ff50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ff60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
ff70: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
ff80: 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
ff90: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
ffa0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
ffb0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
ffc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
ffd0: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
ffe0: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
fff0: 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
10000 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
10010 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
10020 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
10030 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
10040 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
10050 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
10060 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
10070 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
10080 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10090 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
100a0 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
100b0 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
100c0 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
100d0 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
100e0 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
100f0 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
10100 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
10110 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
10120 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10130 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10140 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
10150 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10170 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10180 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10190 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
101a0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
101b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
101c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
101d0 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
101e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
101f0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
10200 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
10210 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10220 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
10230 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
10240 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
10250 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
10260 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
10270 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
10280 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
10290 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
102a0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
102b0 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
102c0 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
102d0 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
102e0 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
102f0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
10300 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
10310 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
10320 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
10330 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
10340 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
10350 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
10360 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
10370 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
10380 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
10390 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
103a0 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
103b0 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
103c0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
103d0 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
103e0 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
103f0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
10400 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
10410 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
10420 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
10430 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
10440 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
10450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10460 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
10470 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
10480 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
10490 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
104a0 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
104b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
104c0 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
104d0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
104e0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
104f0 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
10500 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
10510 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
10520 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
10530 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
10540 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
10550 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
10560 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
10570 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
10580 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10590 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
105a0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
105b0 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
105c0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
105d0 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
105e0 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
105f0 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
10600 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
10610 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
10620 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
10630 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
10640 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
10650 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
10660 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
10670 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
10680 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
10690 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
106a0 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
106b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
106c0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
106d0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
106e0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
106f0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
10700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
10710 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
10720 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
10730 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
10740 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
10750 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
10760 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
10770 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
10780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10790 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
107a0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
107b0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
107c0 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
107d0 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
107e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
107f0 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
10800 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
10810 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
10820 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
10830 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
10840 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
10850 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
10860 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
10870 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10880 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
10890 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
108a0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
108b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
108c0 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
108d0 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
108e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
108f0 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
10900 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
10910 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
10920 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
10930 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
10940 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
10950 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
10960 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
10970 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
10980 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
10990 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
109a0 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
109b0 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
109c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
109d0 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
109e0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
109f0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
10a00 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10a10 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
10a20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10a30 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10a40 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10a50 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
10a60 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
10a70 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10a80 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
10a90 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
10aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
10ab0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10ac0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
10ad0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
10ae0 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
10af0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
10b00 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
10b10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10b30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10b40 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
10b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10b60 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
10b70 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
10b80 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
10b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10ba0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
10bb0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10bc0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
10bd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
10be0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
10bf0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10c00 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
10c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10c20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10c30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10c40 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10c50 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
10c60 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
10c70 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
10c80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10c90 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
10cb0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
10cc0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
10cd0 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
10ce0 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
10cf0 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
10d00 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
10d10 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
10d20 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
10d30 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10d40 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
10d50 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
10d60 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10d70 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
10d80 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
10d90 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
10da0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
10db0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
10dc0 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
10dd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10df0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10e00 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
10e10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
10e20 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
10e30 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
10e40 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
10e50 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
10e60 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
10e70 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
10e80 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
10e90 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
10ea0 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
10eb0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
10ec0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
10ed0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10ee0 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
10ef0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
10f00 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
10f10 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
10f20 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
10f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10f40 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
10f50 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
10f60 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
10f70 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
10f80 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
10f90 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
10fa0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
10fb0 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
10fc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
10fd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10fe0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
10ff0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
11000 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
11010 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
11020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11030 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
11040 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
11050 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
11060 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
11070 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
11080 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
11090 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
110a0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
110b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
110c0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
110d0 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
110e0 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
110f0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
11100 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
11110 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  db, "FOREIGN KEY
11120 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
11130 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
11140 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11150 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11160 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11180 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
11190 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
111a0 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
111b0 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
111c0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
111d0 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
111e0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
111f0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
11200 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
11210 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
11220 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
11230 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
11240 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
11250 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
11260 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
11270 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
11280 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
11290 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
112a0 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
112b0 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
112c0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
112d0 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
112e0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
112f0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
11300 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
11310 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
11320 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
11330 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
11340 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
11350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11360 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
11370 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
11380 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
11390 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
113a0 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
113b0 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
113c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
113d0 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
113e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
11410 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
11420 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
11430 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11440 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
11450 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
11460 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
11470 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
11480 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
11490 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
114a0 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
114b0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
114c0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
114d0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
114e0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
114f0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
11500 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
11510 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
11520 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
11530 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11540 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
11550 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
11560 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
11570 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
11580 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
11590 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
115a0 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
115b0 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
115c0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
115d0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
115e0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
115f0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
11600 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11610 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
11620 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
11630 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
11640 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
11650 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
11660 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
11670 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11680 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11690 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
116a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
116b0 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
116c0 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
116d0 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
116e0 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
116f0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
11700 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
11710 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
11720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11730 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
11740 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
11750 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
11760 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
11770 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
11780 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
11790 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
117a0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
117b0 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
117c0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
117d0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
117e0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
117f0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
11800 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
11810 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
11820 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
11830 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
11840 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
11850 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
11860 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
11870 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
11880 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
11890 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
118a0 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
118b0 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
118c0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
118d0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
118e0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
118f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
11900 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
11910 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
11920 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
11930 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
11940 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11950 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
11960 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
11970 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
11980 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
11990 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
119a0 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
119b0 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
119c0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
119d0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
119e0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
119f0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
11a00 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
11a10 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
11a20 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
11a30 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
11a40 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
11a50 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
11a60 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
11a70 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
11a80 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
11a90 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
11aa0 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
11ab0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
11ac0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
11ad0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
11ae0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
11af0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
11b00 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
11b10 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
11b20 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
11b30 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
11b40 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
11b50 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
11b60 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
11b70 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
11b80 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
11b90 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
11ba0 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
11bb0 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
11bc0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
11bd0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
11be0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
11bf0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
11c00 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
11c10 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
11c20 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
11c30 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
11c40 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11c50 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
11c60 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
11c70 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
11c80 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
11c90 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
11ca0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
11cb0 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
11cc0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
11cd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
11ce0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
11cf0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11d00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11d10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11d20 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
11d30 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
11d40 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
11d50 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
11d60 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
11d70 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
11d80 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
11d90 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
11da0 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
11db0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11dc0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11dd0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11de0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
11df0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11e00 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
11e10 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
11e20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
11e30 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
11e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
11e50 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
11e60 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67  immediate foreig
11e70 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73  n key violations
11e80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
11e90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
11ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11eb0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b  beCheckFk(p, 0);
11ec0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
11ed0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
11ee0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
11ef0 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
11f00 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74  only active writ
11f10 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74  er .    ** VM, t
11f20 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72  hen we do either
11f30 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c   a commit or rol
11f40 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72  lback of the cur
11f50 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
11f60 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
11f70 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63   Note: This bloc
11f80 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f  k also runs if o
11f90 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  ne of the specia
11fa0 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64  l errors handled
11fb0 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68   .    ** above h
11fc0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20  as occurred. .  
11fd0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71    */.    if( !sq
11fe0 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28  lite3VtabInSync(
11ff0 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d  db) .     && db-
12000 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20  >autoCommit .   
12010 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72    && db->nVdbeWr
12020 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c  ite==(p->readOnl
12030 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20  y==0) .    ){.  
12040 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12050 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
12060 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
12070 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69  Fail && !isSpeci
12080 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20  alError) ){.    
12090 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
120a0 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31  VdbeCheckFk(p, 1
120b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
120c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
120d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45            if( NE
120e0 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29  VER(p->readOnly)
120f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12100 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
12110 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (p);.           
12120 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12130 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
12140 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
12150 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12160 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
12170 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20         }else{ . 
12180 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12190 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
121a0 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64   is true, the vd
121b0 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73  be program was s
121c0 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20  uccessful .     
121d0 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61       ** or hit a
121e0 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73  n 'OR FAIL' cons
121f0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65  traint and there
12200 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64   are no deferred
12210 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20   foreign.       
12220 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72     ** key constr
12230 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70  aints to hold up
12240 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12250 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63  . This means a c
12260 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20  ommit .         
12270 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e   ** is required.
12280 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
12290 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62   = vdbeCommit(db
122a0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , p);.        }.
122b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
122c0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
122d0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
122e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
122f0 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  dbeLeave(p);.   
12300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12310 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
12320 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21     }else if( rc!
12330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12340 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
12350 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
12360 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12370 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
12380 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12390 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
123a0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
123b0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
123c0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
123d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
123e0 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
123f0 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20  ITE_DeferFKs;.  
12400 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
12410 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
12420 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20  nges(db);.      
12430 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
12440 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12450 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
12460 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
12470 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
12480 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
12490 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
124a0 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
124b0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
124c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
124d0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
124e0 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
124f0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
12500 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12510 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12520 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
12530 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
12540 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
12550 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
12560 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
12570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
12580 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
12590 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
125a0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
125b0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
125c0 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
125d0 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
125e0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
125f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
12600 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
12610 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
12620 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
12630 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
12640 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12650 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
12660 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
12670 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12680 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
12690 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
126a0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
126b0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
126c0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
126d0 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
126e0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
126f0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
12700 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
12710 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
12720 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
12730 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
12740 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
12750 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
12760 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
12770 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
12780 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
12790 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
127a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
127b0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
127c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
127d0 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
127e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
127f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
12800 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
12810 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
12820 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
12830 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
12840 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
12850 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
12860 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
12870 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
12880 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
12890 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
128a0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
128b0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
128c0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
128d0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
128e0 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
128f0 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
12900 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
12910 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12920 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
12930 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
12940 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
12950 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
12960 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
12970 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
12980 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
12990 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
129a0 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
129b0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
129c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
129d0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
129e0 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
129f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12a10 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
12a20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12a30 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
12a40 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
12a50 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
12a60 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
12a70 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
12a80 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
12a90 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
12aa0 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
12ab0 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
12ac0 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
12ad0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
12ae0 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
12af0 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
12b00 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
12b10 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
12b20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
12b30 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
12b40 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
12b50 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
12b60 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
12b70 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
12b80 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
12b90 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
12ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
12bb0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
12bc0 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
12bd0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
12be0 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
12bf0 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
12c00 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
12c10 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12c20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
12c30 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
12c40 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
12c50 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
12c60 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
12c70 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
12c80 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
12c90 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
12ca0 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
12cb0 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
12cc0 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
12cd0 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
12ce0 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
12cf0 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
12d00 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
12d10 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
12d20 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
12d30 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
12d40 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
12d50 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
12d60 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
12d70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
12d80 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
12d90 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
12da0 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
12db0 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
12dc0 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
12dd0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
12de0 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
12df0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
12e00 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
12e10 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
12e20 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
12e30 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
12e40 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
12e50 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
12e60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
12e70 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
12e80 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
12e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
12eb0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
12ec0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
12ed0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
12ee0 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
12ef0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
12f00 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
12f10 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
12f20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
12f30 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
12f40 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
12f50 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
12f60 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
12f70 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
12f80 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
12f90 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
12fa0 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
12fb0 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
12fc0 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
12fd0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
12fe0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
12ff0 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
13000 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
13010 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
13020 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
13030 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
13040 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
13050 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
13060 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13070 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
13080 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
13090 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
130a0 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
130b0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
130c0 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
130d0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
130e0 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
130f0 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
13100 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
13110 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
13120 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
13130 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
13140 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
13150 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
13160 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
13170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
13180 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
13190 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
131a0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
131b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
131c0 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
131d0 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
131e0 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
131f0 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
13200 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
13210 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
13220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13230 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
13240 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
13250 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13260 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
13270 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
13280 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
13290 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
132a0 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
132b0 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
132c0 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
132d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
132e0 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
132f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
13300 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
13310 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13320 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
13330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
13340 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
13350 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
13360 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
13370 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
13380 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
13390 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
133a0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
133b0 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
133c0 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
133d0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
133e0 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
133f0 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
13400 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
13410 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
13420 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
13430 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
13440 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
13450 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
13460 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
13470 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
13480 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
13490 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
134a0 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
134b0 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
134c0 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
134d0 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
134e0 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
134f0 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
13500 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
13510 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
13520 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
13530 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
13540 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
13550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13560 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
13570 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
13580 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
13590 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
135a0 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
135b0 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
135c0 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
135d0 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
135e0 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
135f0 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
13600 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
13610 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
13620 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
13630 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
13640 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
13650 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
13660 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
13670 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
13680 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
13690 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
136a0 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
136b0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
136c0 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
136d0 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
136e0 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
136f0 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
13700 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
13710 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
13720 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
13730 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
13740 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
13750 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
13760 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
13770 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
13780 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
13790 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
137a0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
137b0 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
137c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
137d0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
137e0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
137f0 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
13800 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
13810 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
13820 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
13830 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
13840 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
13850 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
13860 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
13870 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
13880 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
13890 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
138a0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
138b0 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
138c0 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
138d0 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
138e0 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
138f0 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
13900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
13910 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
13920 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
13930 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
13940 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
13950 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
13960 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
13970 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
13980 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
13990 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
139a0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
139b0 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
139c0 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
139d0 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
139e0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
139f0 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
13a00 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
13a10 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
13a20 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
13a30 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
13a40 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
13a50 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
13a60 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
13a70 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
13a80 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
13a90 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
13aa0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
13ab0 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
13ac0 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
13ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ae0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
13af0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
13b00 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
13b10 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
13b20 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
13b30 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
13b40 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
13b50 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
13b60 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
13b70 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
13b80 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
13b90 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
13ba0 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
13bb0 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
13bc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13bd0 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
13be0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
13bf0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
13c00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13c10 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
13c20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
13c30 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
13c40 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
13c50 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
13c60 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
13c70 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
13c80 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
13c90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
13ca0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
13cb0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
13cc0 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
13cd0 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
13ce0 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
13cf0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
13d00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
13d10 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
13d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
13d30 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
13d40 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
13d50 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
13d60 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
13d70 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
13d80 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
13d90 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
13da0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
13db0 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
13dc0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
13dd0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
13de0 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
13df0 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
13e00 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
13e10 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
13e20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
13e30 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
13e40 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
13e50 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
13e60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13e70 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
13e80 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
13e90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
13ea0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
13eb0 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
13ec0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
13ed0 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
13ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
13ef0 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
13f00 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
13f10 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
13f20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
13f30 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
13f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13f50 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
13f60 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
13f70 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
13f80 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
13f90 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
13fa0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
13fb0 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
13fc0 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
13fd0 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
13fe0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
13ff0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
14000 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
14010 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
14020 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
14030 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
14040 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
14050 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
14060 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
14070 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
14080 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
14090 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
140a0 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
140b0 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
140c0 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
140d0 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
140e0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
140f0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
14100 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
14110 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
14120 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
14130 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
14140 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
14150 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
14160 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
14170 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
14180 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
14190 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
141a0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
141b0 72 61 6d 65 74 65 72 20 63 6f 72 72 73 70 6f 6e  rameter corrspon
141c0 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e  ds to bit 0 etc.
141d0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
141e0 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
141f0 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c  ata(Vdbe *pVdbe,
14200 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61   int iOp, int ma
14210 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a  sk){.  AuxData *
14220 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41  *pp = &pVdbe->pA
14230 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28  uxData;.  while(
14240 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
14250 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
14260 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
14270 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
14280 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
14290 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
142a0 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
142b0 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
142c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
142d0 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
142e0 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
142f0 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
14300 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
14310 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
14320 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
14330 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
14340 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
14350 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62  lite3DbFree(pVdb
14360 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  e->db, pAux);.  
14370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14380 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
14390 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
143a0 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
143b0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
143c0 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
143d0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
143e0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
143f0 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
14400 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
14410 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
14420 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
14430 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
14440 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
14450 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
14460 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
14470 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
14480 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
14490 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
144a0 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
144b0 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
144c0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
144d0 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
144e0 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
144f0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
14500 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
14510 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
14520 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
14530 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
14540 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
14550 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
14560 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
14570 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
14580 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
14590 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
145a0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
145b0 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
145c0 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
145d0 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
145e0 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
145f0 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
14600 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
14610 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
14620 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
14630 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
14640 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14650 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
14660 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
14670 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
14680 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
14690 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65  zVar[i]);.  vdbe
146a0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
146b0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
146c0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
146d0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
146e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
146f0 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
14700 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
14710 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
14720 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14730 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
14740 58 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65  XPLAIN).  sqlite
14750 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
14760 45 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69  Explain);.  sqli
14770 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14780 3e 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64  >pExplain);.#end
14790 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
147a0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
147b0 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
147c0 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
147d0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
147e0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
147f0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
14800 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
14810 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14820 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
14830 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
14840 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
14850 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
14860 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
14870 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
14880 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
14890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
148a0 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
148b0 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
148c0 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
148d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
148e0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
148f0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
14900 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
14910 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
14920 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
14930 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
14940 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
14950 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
14960 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
14970 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
14980 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
14990 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
149a0 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
149b0 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
149c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
149d0 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
149e0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
149f0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
14a00 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
14a10 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
14a20 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
14a30 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
14a40 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
14a50 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
14a60 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14a70 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
14a80 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
14a90 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14aa0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
14ab0 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 72  ->isTable );.  r
14ac0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14ad0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
14ae0 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
14af0 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
14b00 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
14b10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14b20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20   p->lastRowid = 
14b30 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 3b  p->movetoTarget;
14b40 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
14b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
14b60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 70 2d  RRUPT_BKPT;.  p-
14b70 3e 72 6f 77 69 64 49 73 56 61 6c 69 64 20 3d 20  >rowidIsValid = 
14b80 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
14b90 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
14ba0 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a  search_count++;.
14bb0 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65  #endif.  p->defe
14bc0 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a  rredMoveto = 0;.
14bd0 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
14be0 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
14bf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14c00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  OK;.}../*.** Som
14c10 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64  ething has moved
14c20 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20   cursor "p" out 
14c30 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65  of place.  Maybe
14c40 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a   the row it was.
14c50 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61  ** pointed to wa
14c60 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
14c70 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72  om under it.  Or
14c80 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65   maybe the btree
14c90 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63   was.** rebalanc
14ca0 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68  ed.  Whatever th
14cb0 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20  e cause, try to 
14cc0 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74  restore "p" to t
14cd0 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69  he place it.** i
14ce0 73 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  s suppose to be 
14cf0 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68  pointing.  If th
14d00 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65  e row was delete
14d10 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
14d20 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20   the.** cursor, 
14d30 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  set the cursor t
14d40 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c  o point to a NUL
14d50 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  L row..*/.static
14d60 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
14d70 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64  LINE handleMoved
14d80 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f  Cursor(VdbeCurso
14d90 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44  r *p){.  int isD
14da0 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b  ifferentRow, rc;
14db0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
14dc0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
14dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
14de0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
14df0 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a  (p->pCursor) );.
14e00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14e10 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
14e20 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 26 69 73  (p->pCursor, &is
14e30 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20  DifferentRow);. 
14e40 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
14e50 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
14e60 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74   if( isDifferent
14e70 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77  Row ) p->nullRow
14e80 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
14e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
14ea0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
14eb0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
14ec0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
14ed0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
14ee0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
14ef0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
14f00 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
14f10 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
14f20 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
14f30 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
14f40 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
14f50 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
14f60 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
14f70 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
14f80 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
14f90 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
14fa0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
14fb0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
14fc0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
14fd0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
14fe0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14ff0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
15000 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
15010 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
15020 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
15030 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
15040 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
15050 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
15060 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
15070 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
15080 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
15090 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
150a0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
150b0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
150c0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
150d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
150e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
150f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
15100 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
15110 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66  Cursor *p){.  if
15120 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
15130 65 74 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eto ){.    retur
15140 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  n handleDeferred
15150 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20  Moveto(p);.  }. 
15160 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
15170 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
15180 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  p->pCursor) ){. 
15190 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
151a0 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
151b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
151c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
151d0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
151e0 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20  unctions:.**.** 
151f0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
15200 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74  lType().** sqlit
15210 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15220 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
15230 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a  VdbeSerialLen().
15240 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
15250 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c  rialPut().** sql
15260 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
15270 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73  t().**.** encaps
15280 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  ulate the code t
15290 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76  hat serializes v
152a0 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67  alues for storag
152b0 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64  e in SQLite.** d
152c0 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65  ata and index re
152d0 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 69  cords. Each seri
152e0 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e  alized value con
152f0 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73  sists of a.** 's
15300 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20  erial-type' and 
15310 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20  a blob of data. 
15320 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20  The serial type 
15330 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73  is an 8-byte uns
15340 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72  igned.** integer
15350 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 61  , stored as a va
15360 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  rint..**.** In a
15370 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72  n SQLite index r
15380 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61  ecord, the seria
15390 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 64  l type is stored
153a0 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65   directly before
153b0 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20  .** the blob of 
153c0 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f 72  data that it cor
153d0 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20  responds to. In 
153e0 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20  a table record, 
153f0 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79  all serial.** ty
15400 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  pes are stored a
15410 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
15420 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74  he record, and t
15430 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61  he blobs of data
15440 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20   at.** the end. 
15450 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63  Hence these func
15460 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20  tions allow the 
15470 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65  caller to handle
15480 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74   the.** serial-t
15490 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f  ype and data blo
154a0 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a  b separately..**
154b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
154c0 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
154d0 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  s the various st
154e0 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f  orage classes fo
154f0 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20  r data:.**.**   
15500 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 20  serial type     
15510 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61     bytes of data
15520 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20        type.**   
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
15540 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
15550 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
15560 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20  -----.**      0 
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15590 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20   NULL.**      1 
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155b0 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
155c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
155d0 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 20  **      2       
155e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
155f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15600 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15610 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
15620 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20          3       
15630 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15640 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20  ger.**      4   
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 73    4            s
15670 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15680 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 20        5         
15690 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 20              6   
156a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
156b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
156c0 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6               
156d0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
156e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
156f0 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20  r.**      7     
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 45  8            IEE
15720 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20  E float.**      
15730 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  8               
15740 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
15750 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
15760 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20  ant 0.**      9 
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
15790 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
157a0 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31  t 1.**     10,11
157b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
157d0 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 61  eserved for expa
157e0 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31  nsion.**    N>=1
157f0 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20  2 and even      
15800 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20   (N-12)/2       
15810 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31   BLOB.**    N>=1
15820 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20  3 and odd       
15830 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20   (N-13)/2       
15840 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20   text.**.** The 
15850 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 65  8 and 9 types we
15860 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e  re added in 3.3.
15870 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34  0, file format 4
15880 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e  .  Prior version
15890 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77  s.** of SQLite w
158a0 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61  ill not understa
158b0 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20  nd those serial 
158c0 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  types..*/../*.**
158d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 69   Return the seri
158e0 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20  al-type for the 
158f0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
15900 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c  pMem..*/.u32 sql
15910 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
15920 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e  pe(Mem *pMem, in
15930 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a  t file_format){.
15940 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d    int flags = pM
15950 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32  em->flags;.  u32
15960 20 6e 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73   n;..  if( flags
15970 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
15980 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15990 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
159a0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
159b0 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
159c0 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
159d0 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
159e0 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
159f0 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
15a00 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
15a10 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
15a20 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
15a30 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
15a40 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28  ){.      if( i<(
15a50 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 65  -MAX_6BYTE) ) re
15a60 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a  turn 6;.      /*
15a70 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 70   Previous test p
15a80 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28  revents:  u = -(
15a90 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37  -922337203685477
15aa0 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75  5808) */.      u
15ab0 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65   = -i;.    }else
15ac0 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20  {.      u = i;. 
15ad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
15ae0 31 32 37 20 29 7b 0a 20 20 20 20 20 20 72 65 74  127 ){.      ret
15af0 75 72 6e 20 28 28 69 26 31 29 3d 3d 69 20 26 26  urn ((i&1)==i &&
15b00 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 29   file_format>=4)
15b10 20 3f 20 38 2b 28 75 33 32 29 75 20 3a 20 31 3b   ? 8+(u32)u : 1;
15b20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
15b30 3c 3d 33 32 37 36 37 20 29 20 72 65 74 75 72 6e  <=32767 ) return
15b40 20 32 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 38   2;.    if( u<=8
15b50 33 38 38 36 30 37 20 29 20 72 65 74 75 72 6e 20  388607 ) return 
15b60 33 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31  3;.    if( u<=21
15b70 34 37 34 38 33 36 34 37 20 29 20 72 65 74 75 72  47483647 ) retur
15b80 6e 20 34 3b 0a 20 20 20 20 69 66 28 20 75 3c 3d  n 4;.    if( u<=
15b90 4d 41 58 5f 36 42 59 54 45 20 29 20 72 65 74 75  MAX_6BYTE ) retu
15ba0 72 6e 20 35 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 5;.    return
15bb0 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
15bc0 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
15bd0 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20      return 7;.  
15be0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  }.  assert( pMem
15bf0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
15c00 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d  ed || flags&(MEM
15c10 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29  _Str|MEM_Blob) )
15c20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d  ;.  assert( pMem
15c30 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20  ->n>=0 );.  n = 
15c40 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  (u32)pMem->n;.  
15c50 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  if( flags & MEM_
15c60 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d  Zero ){.    n +=
15c70 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pMem->u.nZero;.
15c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 28 6e    }.  return ((n
15c90 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61  *2) + 12 + ((fla
15ca0 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29  gs&MEM_Str)!=0))
15cb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15cc0 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
15cd0 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
15ce0 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
15cf0 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
15d00 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
15d10 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
15d20 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
15d30 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
15d40 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20  al_type>=12 ){. 
15d50 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61     return (seria
15d60 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
15d70 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69  }else{.    stati
15d80 63 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65  c const u8 aSize
15d90 5b 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20  [] = { 0, 1, 2, 
15da0 33 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30  3, 4, 6, 8, 8, 0
15db0 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
15dc0 20 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65   return aSize[se
15dd0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
15de0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
15df0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
15e00 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
15e10 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
15e20 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
15e30 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
15e40 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
15e50 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
15e60 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
15e70 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
15e80 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
15e90 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
15ea0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
15eb0 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
15ec0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
15ed0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
15ee0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
15ef0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
15f00 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
15f10 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
15f20 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
15f30 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
15f40 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
15f50 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
15f60 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
15f70 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
15f80 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
15f90 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
15fa0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
15fb0 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
15fc0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
15fd0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
15fe0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
15ff0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
16000 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
16010 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
16020 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
16030 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
16040 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
16050 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
16060 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
16070 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
16080 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
16090 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
160a0 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
160b0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
160c0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
160d0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
160e0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
160f0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
16100 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
16110 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
16120 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
16130 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
16140 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
16150 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
16160 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
16170 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
16180 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
16190 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
161a0 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
161b0 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
161c0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
161d0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
161e0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
161f0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
16200 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
16210 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
16220 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
16230 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
16240 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
16250 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
16260 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
16270 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
16280 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
16290 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
162a0 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
162b0 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
162c0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
162d0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
162e0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
162f0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
16300 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
16310 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
16320 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
16330 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
16340 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
16350 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
16360 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
16370 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
16380 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
16390 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
163a0 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
163b0 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
163c0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
163d0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
163e0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
163f0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
16400 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
16410 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
16420 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
16430 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
16440 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
16450 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
16460 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
16470 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
16480 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
16490 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
164a0 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
164b0 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
164c0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
164d0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
164e0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
164f0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
16500 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
16510 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
16520 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
16530 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
16540 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16550 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
16560 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
16570 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
16580 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
16590 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
165a0 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
165b0 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
165c0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
165d0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
165e0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
165f0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
16600 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
16610 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
16620 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
16630 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16640 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
16650 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
16660 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
16670 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
16680 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
16690 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
166a0 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
166b0 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
166c0 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
166d0 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
166e0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
166f0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
16700 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
16710 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
16720 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
16730 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
16740 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
16750 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
16760 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
16770 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
16780 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
16790 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
167a0 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
167b0 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
167c0 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
167d0 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
167e0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
167f0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
16800 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
16810 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
16820 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
16830 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
16840 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
16850 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
16860 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
16870 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
16880 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
16890 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
168a0 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
168b0 28 70 4d 65 6d 2d 3e 72 29 20 29 3b 0a 20 20 20  (pMem->r) );.   
168c0 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
168d0 4d 65 6d 2d 3e 72 2c 20 73 69 7a 65 6f 66 28 76  Mem->r, sizeof(v
168e0 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69  ));.      swapMi
168f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76  xedEndianFloat(v
16900 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16910 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e      v = pMem->u.
16920 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  i;.    }.    len
16930 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64   = i = sqlite3Vd
16940 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
16950 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
16960 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
16970 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
16980 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
16990 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
169a0 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
169b0 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
169c0 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
169d0 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
169e0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
169f0 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
16a00 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
16a10 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
16a20 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
16a30 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
16a40 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
16a50 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
16a60 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
16a70 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
16a80 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
16a90 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70     memcpy(buf, p
16aa0 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20  Mem->z, len);.  
16ab0 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20    return len;.  
16ac0 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20  }..  /* NULL or 
16ad0 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31  constants 0 or 1
16ae0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   */.  return 0;.
16af0 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20  }../* Input "x" 
16b00 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  is a sequence of
16b10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63   unsigned charac
16b20 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73  ters that repres
16b30 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64  ent a.** big-end
16b40 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65  ian integer.  Re
16b50 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c  turn the equival
16b60 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67  ent native integ
16b70 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e  er.*/.#define ON
16b80 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20  E_BYTE_INT(x)   
16b90 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64   ((i8)(x)[0]).#d
16ba0 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49  efine TWO_BYTE_I
16bb0 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69  NT(x)    (256*(i
16bc0 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31  8)((x)[0])|(x)[1
16bd0 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45  ]).#define THREE
16be0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36  _BYTE_INT(x)  (6
16bf0 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  5536*(i8)((x)[0]
16c00 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78  )|((x)[1]<<8)|(x
16c10 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[2]).#define FO
16c20 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20  UR_BYTE_UINT(x) 
16c30 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c   (((u32)(x)[0]<<
16c40 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  24)|((x)[1]<<16)
16c50 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
16c60 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [3]).#define FOU
16c70 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31  R_BYTE_INT(x) (1
16c80 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29  6777216*(i8)((x)
16c90 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  [0])|((x)[1]<<16
16ca0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
16cb0 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  )[3])../*.** Des
16cc0 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74  erialize the dat
16cd0 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74  a blob pointed t
16ce0 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69  o by buf as seri
16cf0 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74  al type serial_t
16d00 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65  ype.** and store
16d10 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70   the result in p
16d20 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Mem.  Return the
16d30 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16d40 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
16d50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  s function is im
16d60 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f  plemented as two
16d70 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
16d80 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e  es for performan
16d90 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63  ce..** The few c
16da0 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72  ases that requir
16db0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  e local variable
16dc0 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74  s are broken out
16dd0 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65   into a separate
16de0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  .** routine so t
16df0 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65  hat in most case
16e00 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f  s the overhead o
16e10 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61  f moving the sta
16e20 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73  ck pointer.** is
16e30 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74   avoided..*/ .st
16e40 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f  atic u32 SQLITE_
16e50 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47  NOINLINE serialG
16e60 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
16e70 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
16e80 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
16e90 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
16ea0 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
16eb0 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
16ec0 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
16ed0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
16ee0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
16ef0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
16f00 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
16f10 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
16f20 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
16f30 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
16f40 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20  TE_UINT(buf);.  
16f50 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54  u32 y = FOUR_BYT
16f60 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20  E_UINT(buf+4);. 
16f70 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79   x = (x<<32) + y
16f80 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  ;.  if( serial_t
16f90 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 70 4d  ype==6 ){.    pM
16fa0 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a  em->u.i = *(i64*
16fb0 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  )&x;.    pMem->f
16fc0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
16fd0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
16fe0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d  em->u.i<0 );.  }
16ff0 65 6c 73 65 7b 0a 23 69 66 20 21 64 65 66 69 6e  else{.#if !defin
17000 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64  ed(NDEBUG) && !d
17010 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17020 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
17030 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  T).    /* Verify
17040 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61   that integers a
17050 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  nd floating poin
17060 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65  t values use the
17070 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74   same.    ** byt
17080 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68  e order.  Or, th
17090 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58  at if SQLITE_MIX
170a0 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f  ED_ENDIAN_64BIT_
170b0 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20  FLOAT is.    ** 
170c0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d  defined that 64-
170d0 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  bit floating poi
170e0 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79  nt values really
170f0 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a   are mixed.    *
17100 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f  * endian..    */
17110 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
17120 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34  t u64 t1 = ((u64
17130 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32  )0x3ff00000)<<32
17140 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
17150 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31  st double r1 = 1
17160 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d  .0;.    u64 t2 =
17170 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78   t1;.    swapMix
17180 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32  edEndianFloat(t2
17190 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
171a0 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f  izeof(r1)==sizeo
171b0 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28  f(t2) && memcmp(
171c0 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66  &r1, &t2, sizeof
171d0 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64  (r1))==0 );.#end
171e0 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  if.    assert( s
171f0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73  izeof(x)==8 && s
17200 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d  izeof(pMem->r)==
17210 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78  8 );.    swapMix
17220 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29  edEndianFloat(x)
17230 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d  ;.    memcpy(&pM
17240 65 6d 2d 3e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  em->r, &x, sizeo
17250 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
17260 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
17270 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f  IsNaN(pMem->r) ?
17280 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
17290 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
172a0 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
172b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
172c0 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
172d0 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
172e0 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
172f0 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
17300 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
17310 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
17320 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17330 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
17340 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
17370 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
17380 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
17390 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
173a0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
173b0 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
173c0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
173d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
173e0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
173f0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
17400 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
17410 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20  * NULL */.      
17420 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
17430 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72  M_Null;.      br
17440 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
17450 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79  ase 1: { /* 1-by
17460 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17470 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  r */.      pMem-
17480 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f  >u.i = ONE_BYTE_
17490 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
174a0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
174b0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
174c0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
174d0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
174e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
174f0 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
17500 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
17510 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
17520 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
17530 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17540 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17550 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
17560 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
17570 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
17580 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
17590 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
175a0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
175b0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
175c0 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
175d0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
175e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
175f0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
17600 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
17610 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
17620 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
17630 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
17640 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
17650 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
17660 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
17670 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
17680 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
17690 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
176a0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
176b0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
176c0 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
176d0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
176e0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
176f0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
17700 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
17710 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
17720 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
17730 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
17740 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17750 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17760 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17770 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17780 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17790 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
177a0 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
177b0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
177c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
177d0 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
177e0 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
177f0 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
17800 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
17810 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
17820 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
17830 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
17840 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
17850 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
17860 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
17870 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
17880 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
17890 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
178a0 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
178b0 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
178c0 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
178d0 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
178e0 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
178f0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
17900 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
17910 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17920 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
17930 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
17940 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
17950 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
17960 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
17970 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
17980 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
17990 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
179a0 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
179b0 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
179c0 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
179d0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
179e0 20 20 70 4d 65 6d 2d 3e 78 44 65 6c 20 3d 20 30    pMem->xDel = 0
179f0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
17a00 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69  ags = aFlag[seri
17a10 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20  al_type&1];.    
17a20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e    return pMem->n
17a30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17a40 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  turn 0;.}./*.** 
17a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
17a60 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
17a70 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
17a80 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65  e for an Unpacke
17a90 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
17aa0 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67  ture large enoug
17ab0 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74  h to be used wit
17ac0 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  h sqlite3VdbeRec
17ad0 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a  ordUnpack() if.*
17ae0 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
17af0 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
17b00 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72  r to KeyInfo str
17b10 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e  ucture pKeyInfo.
17b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65  .**.** The space
17b30 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63   is either alloc
17b40 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
17b50 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20  e3DbMallocRaw() 
17b60 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a  or from within.*
17b70 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20  * the unaligned 
17b80 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69  buffer passed vi
17b90 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64  a the second and
17ba0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73   third arguments
17bb0 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20   (presumably.** 
17bc0 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66  stack space). If
17bd0 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65   the former, the
17be0 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  n *ppFree is set
17bf0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68   to a pointer th
17c00 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
17c10 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
17c20 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
17c30 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72  sing sqlite3DbFr
17c40 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65  ee(). Or, if the
17c50 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   .** allocation 
17c60 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70  comes from the p
17c70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75  Space/szSpace bu
17c80 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73  ffer, *ppFree is
17c90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
17ca0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
17cb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f  ..**.** If an OO
17cc0 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  M error occurs, 
17cd0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
17ce0 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63  ..*/.UnpackedRec
17cf0 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65  ord *sqlite3Vdbe
17d00 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
17d10 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ord(.  KeyInfo *
17d20 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
17d30 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69         /* Descri
17d40 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63  ption of the rec
17d50 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  ord */.  char *p
17d60 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
17d70 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c           /* Unal
17d80 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69  igned space avai
17d90 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  lable */.  int s
17da0 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  zSpace,         
17db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
17dc0 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69  ze of pSpace[] i
17dd0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
17de0 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20  r **ppFree      
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e00 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75  OUT: Caller shou
17e10 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f 69  ld free this poi
17e20 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70  nter */.){.  Unp
17e30 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20  ackedRecord *p; 
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e50 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  Unpacked record 
17e60 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69  to return */.  i
17e70 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20  nt nOff;        
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17e90 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61  * Increment pSpa
17ea0 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c  ce by nOff to al
17eb0 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20  ign it */.  int 
17ec0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17ee0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
17ef0 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a  equired for *p *
17f00 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  /..  /* We want 
17f10 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f 69  to shift the poi
17f20 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20 73  nter pSpace up s
17f30 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20 38  uch that it is 8
17f40 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20  -byte aligned.. 
17f50 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65   ** Thus, we nee
17f60 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61  d to calculate a
17f70 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65   value, nOff, be
17f80 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74  tween 0 and 7, t
17f90 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74  o shift .  ** it
17fa0 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65 20   by.  If pSpace 
17fb0 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74  is already 8-byt
17fc0 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20  e aligned, nOff 
17fd0 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a  should be zero..
17fe0 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38    */.  nOff = (8
17ff0 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54   - (SQLITE_PTR_T
18000 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26 20  O_INT(pSpace) & 
18010 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65  7)) & 7;.  nByte
18020 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
18030 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
18040 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a  ) + sizeof(Mem)*
18050 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  (pKeyInfo->nFiel
18060 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  d+1);.  if( nByt
18070 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29  e>szSpace+nOff )
18080 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
18090 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69  kedRecord *)sqli
180a0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70  te3DbMallocRaw(p
180b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79  KeyInfo->db, nBy
180c0 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65  te);.    *ppFree
180d0 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20   = (char *)p;.  
180e0 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
180f0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
18100 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
18110 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e  ecord*)&pSpace[n
18120 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65  Off];.    *ppFre
18130 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d  e = 0;.  }..  p-
18140 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28  >aMem = (Mem*)&(
18150 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38  (char*)p)[ROUND8
18160 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
18170 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73  Record))];.  ass
18180 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
18190 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
181a0 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20    p->pKeyInfo = 
181b0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e  pKeyInfo;.  p->n
181c0 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f  Field = pKeyInfo
181d0 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20  ->nField + 1;.  
181e0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
181f0 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65  ** Given the nKe
18200 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20  y-byte encoding 
18210 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70  of a record in p
18220 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20  Key[], populate 
18230 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64  the .** Unpacked
18240 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
18250 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68   indicated by th
18260 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e  e fourth argumen
18270 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f  t with the.** co
18280 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65  ntents of the de
18290 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f  coded record..*/
182a0 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64   .void sqlite3Vd
182b0 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a  beRecordUnpack(.
182c0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
182d0 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f  nfo,     /* Info
182e0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
182f0 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20  e record format 
18300 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20  */.  int nKey,  
18310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18320 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72  ize of the binar
18330 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  y record */.  co
18340 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
18350 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61       /* The bina
18360 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55  ry record */.  U
18370 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
18380 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74        /* Populat
18390 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  e this structure
183a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
183b0 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  g. */.){.  const
183c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
183d0 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
183e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
183f0 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20  ey;.  int d; .  
18400 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20  u32 idx;        
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65  /* Offset in aKe
18430 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  y[] to read from
18440 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20   */.  u16 u;    
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
18470 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
18480 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  /.  u32 szHdr;. 
18490 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e   Mem *pMem = p->
184a0 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61  aMem;..  p->defa
184b0 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73  ult_rc = 0;.  as
184c0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
184d0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29  _ALIGNMENT(pMem)
184e0 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56   );.  idx = getV
184f0 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a  arint32(aKey, sz
18500 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64  Hdr);.  d = szHd
18510 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68  r;.  u = 0;.  wh
18520 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26  ile( idx<szHdr &
18530 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26  & u<p->nField &&
18540 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20   d<=nKey ){.    
18550 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b  u32 serial_type;
18560 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74  ..    idx += get
18570 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69  Varint32(&aKey[i
18580 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  dx], serial_type
18590 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  );.    pMem->enc
185a0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
185b0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d  ;.    pMem->db =
185c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
185d0 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67     /* pMem->flag
185e0 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65  s = 0; // sqlite
185f0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18600 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66   will set this f
18610 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65  or us */.    pMe
18620 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  m->zMalloc = 0;.
18630 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33      d += sqlite3
18640 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
18650 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74  Key[d], serial_t
18660 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20  ype, pMem);.    
18670 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b 2b 3b  pMem++;.    u++;
18680 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
18690 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
186a0 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
186b0 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
186c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
186d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
186e0 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
186f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
18700 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
18710 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
18720 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
18730 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
18740 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
18750 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
18760 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
18770 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
18780 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
18790 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
187a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
187b0 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
187c0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
187d0 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
187e0 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
187f0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
18800 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
18810 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
18820 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
18830 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
18840 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
18850 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
18860 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
18870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
18880 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18890 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
188a0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
188b0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
188c0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
188d0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
188e0 4b 65 79 32 20 20 2f 2a 20 52 69 67 68 74 20 6b  Key2  /* Right k
188f0 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ey */.){.  u32 d
18900 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
18910 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
18920 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61  y[] of next data
18930 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
18940 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
18950 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
18960 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68  aKey[] of next h
18970 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f  eader element */
18980 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20  .  u32 szHdr1;  
18990 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
189a0 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64  of bytes in head
189b0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  er */.  int i = 
189c0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  0;.  int rc = 0;
189d0 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
189e0 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
189f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
18a00 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
18a10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
18a20 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a  o;.  Mem mem1;..
18a30 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b    pKeyInfo = pPK
18a40 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ey2->pKeyInfo;. 
18a50 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
18a60 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
18a70 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
18a80 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
18a90 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
18aa0 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
18ab0 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
18ac0 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
18ad0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
18ae0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
18af0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
18b00 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
18b10 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
18b20 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
18b30 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
18b40 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
18b50 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
18b60 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
18b70 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
18b80 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
18b90 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
18ba0 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
18bb0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
18bc0 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
18bd0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
18be0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
18bf0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
18c00 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
18c10 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
18c20 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
18c30 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
18c40 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
18c50 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
18c60 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
18c70 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
18c80 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
18c90 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
18ca0 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
18cb0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
18cc0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
18cd0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
18ce0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
18cf0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
18d00 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
18d10 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
18d20 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
18d30 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
18d40 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
18d50 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
18d60 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
18d70 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
18d80 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
18d90 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
18da0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
18db0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
18dc0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
18dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
18de0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
18df0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
18e00 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
18e10 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
18e20 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
18e30 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
18e40 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
18e50 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
18e60 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
18e70 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
18e80 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
18e90 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
18ea0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
18eb0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
18ec0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
18ed0 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
18ee0 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
18ef0 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
18f00 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
18f10 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
18f20 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
18f30 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
18f40 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
18f50 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
18f60 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
18f70 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
18f80 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
18f90 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
18fa0 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
18fb0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
18fc0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
18fd0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
18fe0 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
18ff0 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
19000 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
19010 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
19020 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
19030 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19040 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
19050 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
19060 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
19070 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
19080 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
19090 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
190a0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
190b0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
190c0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
190d0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
190e0 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
190f0 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
19100 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
19110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19120 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
19130 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
19140 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
19150 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
19160 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
19170 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d   assert( mem1.zM
19180 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
19190 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
191a0 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  w */.      if( p
191b0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
191c0 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
191d0 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20    rc = -rc;  /* 
191e0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c  Invert the resul
191f0 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20  t for DESC sort 
19200 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  order. */.      
19210 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
19220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b  c;.    }.    i++
19230 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
19240 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b  <szHdr1 && i<pPK
19250 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a  ey2->nField );..
19260 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
19270 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
19280 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
19290 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
192a0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
192b0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
192c0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
192d0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
192e0 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
192f0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
19300 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
19310 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
19320 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61  &mem1)..  */.  a
19330 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c  ssert( mem1.zMal
19340 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
19350 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
19360 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
19370 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
19380 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
19390 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
193a0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
193b0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
193c0 75 72 6e 20 74 68 65 20 74 68 65 20 64 65 66 61  urn the the defa
193d0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
193e0 65 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  e.  */.  return 
193f0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
19400 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
19410 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20  .** Both *pMem1 
19420 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61  and *pMem2 conta
19430 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73  in string values
19440 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77  . Compare the tw
19450 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e  o values.** usin
19460 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  g the collation 
19470 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
19480 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e  As usual, return
19490 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65   a negative , ze
194a0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
194b0 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d  e value if *pMem
194c0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
194d0 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61  equal to or grea
194e0 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d  ter than .** *pM
194f0 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c  em2, respectivel
19500 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70  y. Similar in sp
19510 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a  irit to "rc = (*
19520 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32  pMem1) - (*pMem2
19530 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  );"..*/.static i
19540 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65  nt vdbeCompareMe
19550 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  mString(.  const
19560 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63   Mem *pMem1,.  c
19570 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
19580 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  .  const CollSeq
19590 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 20 69 66 28   *pColl.){.  if(
195a0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f   pMem1->enc==pCo
195b0 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f  ll->enc ){.    /
195c0 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72  * The strings ar
195d0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
195e0 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e   correct encodin
195f0 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20  g.  Call the.   
19600 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
19610 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c  function directl
19620 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
19630 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
19640 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e  l->pUser,pMem1->
19650 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32  n,pMem1->z,pMem2
19660 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20  ->n,pMem2->z);. 
19670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
19680 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f  rc;.    const vo
19690 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20  id *v1, *v2;.   
196a0 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20   int n1, n2;.   
196b0 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d   Mem c1;.    Mem
196c0 20 63 32 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28   c2;.    memset(
196d0 26 63 31 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  &c1, 0, sizeof(c
196e0 31 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  1));.    memset(
196f0 26 63 32 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63  &c2, 0, sizeof(c
19700 32 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  2));.    sqlite3
19710 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
19720 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
19730 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
19740 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
19750 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
19760 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
19770 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
19780 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
19790 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
197a0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
197b0 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20   n1 = v1==0 ? 0 
197c0 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d  : c1.n;.    v2 =
197d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
197e0 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
197f0 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
19800 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d  c);.    n2 = v2=
19810 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20  =0 ? 0 : c2.n;. 
19820 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
19830 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
19840 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32  , n1, v1, n2, v2
19850 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19860 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31  beMemRelease(&c1
19870 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19880 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32  beMemRelease(&c2
19890 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
198a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
198b0 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
198c0 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
198d0 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
198e0 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
198f0 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
19900 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
19910 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
19920 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
19930 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
19940 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
19950 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
19960 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
19970 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
19980 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
19990 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
199a0 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
199b0 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
199c0 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
199d0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
199e0 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
199f0 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
19a00 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
19a10 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
19a20 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
19a30 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
19a40 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
19a50 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
19a60 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
19a70 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
19a80 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
19a90 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
19aa0 74 20 72 63 3b 0a 20 20 69 6e 74 20 66 31 2c 20  t rc;.  int f1, 
19ab0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
19ac0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
19ad0 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
19ae0 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
19af0 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
19b00 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
19b10 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
19b20 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
19b30 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
19b40 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
19b50 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
19b60 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
19b70 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
19b80 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
19b90 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
19ba0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
19bb0 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
19bc0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
19bd0 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
19be0 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
19bf0 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
19c00 6c 75 65 20 69 73 20 61 20 6e 75 6d 62 65 72 20  lue is a number 
19c10 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
19c20 20 6e 6f 74 2c 20 74 68 65 20 6e 75 6d 62 65 72   not, the number
19c30 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49   is less..  ** I
19c40 66 20 62 6f 74 68 20 61 72 65 20 6e 75 6d 62 65  f both are numbe
19c50 72 73 2c 20 63 6f 6d 70 61 72 65 20 61 73 20 72  rs, compare as r
19c60 65 61 6c 73 20 69 66 20 6f 6e 65 20 69 73 20 61  eals if one is a
19c70 20 72 65 61 6c 2c 20 6f 72 20 61 73 20 69 6e 74   real, or as int
19c80 65 67 65 72 73 0a 20 20 2a 2a 20 69 66 20 62 6f  egers.  ** if bo
19c90 74 68 20 76 61 6c 75 65 73 20 61 72 65 20 69 6e  th values are in
19ca0 74 65 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  tegers..  */.  i
19cb0 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
19cc0 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
19cd0 65 61 6c 29 20 29 7b 0a 20 20 20 20 64 6f 75 62  eal) ){.    doub
19ce0 6c 65 20 72 31 2c 20 72 32 3b 0a 20 20 20 20 69  le r1, r2;.    i
19cf0 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
19d00 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
19d10 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
19d20 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i < pMem2->u.i )
19d30 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
19d40 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
19d50 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   > pMem2->u.i ) 
19d60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
19d70 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
19d80 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f      if( (f1&MEM_
19d90 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
19da0 20 20 72 31 20 3d 20 70 4d 65 6d 31 2d 3e 72 3b    r1 = pMem1->r;
19db0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
19dc0 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
19dd0 7b 0a 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f  {.      r1 = (do
19de0 75 62 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b  uble)pMem1->u.i;
19df0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19e00 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
19e10 7d 0a 20 20 20 20 69 66 28 20 28 66 32 26 4d 45  }.    if( (f2&ME
19e20 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
19e30 20 20 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e      r2 = pMem2->
19e40 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
19e50 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
19e60 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
19e70 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
19e80 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
19e90 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
19ea0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
19eb0 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
19ec0 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
19ed0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
19ee0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
19ef0 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
19f00 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
19f10 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
19f20 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
19f30 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
19f40 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
19f50 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
19f60 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
19f70 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
19f80 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
19f90 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
19fa0 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
19fb0 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
19fc0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
19fd0 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
19fe0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
19ff0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a000 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1a010 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1a020 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1a030 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1a040 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1a050 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1a060 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1a070 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1a080 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1a090 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1a0a0 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1a0b0 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1a0c0 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1a0d0 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1a0e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1a0f0 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1a100 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a110 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1a120 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1a130 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1a140 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1a150 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1a160 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1a170 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1a180 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1a190 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1a1a0 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1a1b0 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1a1c0 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 29 3b  , pMem2, pColl);
1a1d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
1a1e0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
1a1f0 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68  was passed as th
1a200 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69  e collate functi
1a210 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68  on, fall through
1a220 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62  .    ** to the b
1a230 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65  lob case and use
1a240 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20   memcmp().  */. 
1a250 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76   }. .  /* Both v
1a260 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c  alues must be bl
1a270 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73  obs.  Compare us
1a280 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  ing memcmp().  *
1a290 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
1a2a0 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d 65 6d 32 2d  pMem1->z, pMem2-
1a2b0 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e 6e 3e 70 4d  >z, (pMem1->n>pM
1a2c0 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d 32 2d 3e 6e  em2->n)?pMem2->n
1a2d0 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 20 20 69 66  :pMem1->n);.  if
1a2e0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
1a2f0 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e 20 2d 20 70  c = pMem1->n - p
1a300 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d 0a 20 20 72  Mem2->n;.  }.  r
1a310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1a320 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
1a330 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
1a340 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1a350 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20  s a serial-type 
1a360 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  that.** correspo
1a370 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  nds to an intege
1a380 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62  r - all values b
1a390 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69  etween 1 and 9 i
1a3a0 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63  nclusive .** exc
1a3b0 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e  ept 7. The secon
1a3c0 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  d points to a bu
1a3d0 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
1a3e0 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
1a3f0 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61  .** serialized a
1a400 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69  ccording to seri
1a410 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75  al_type. This fu
1a420 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69  nction deseriali
1a430 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  zes.** and retur
1a440 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f  ns the value..*/
1a450 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62 65  .static i64 vdbe
1a460 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28  RecordDecodeInt(
1a470 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
1a480 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29   const u8 *aKey)
1a490 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73  {.  u32 y;.  ass
1a4a0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1a4b0 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e  || (serial_type>
1a4c0 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =1 && serial_typ
1a4d0 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=9 && serial_t
1a4e0 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69  ype!=7) );.  swi
1a4f0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1a500 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a   ){.    case 0:.
1a510 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20      case 1:.    
1a520 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1a530 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1a540 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54    return ONE_BYT
1a550 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1a560 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74   case 2:.      t
1a570 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a580 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1a590 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49  eturn TWO_BYTE_I
1a5a0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1a5b0 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74  se 3:.      test
1a5c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1a5d0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1a5e0 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e  rn THREE_BYTE_IN
1a5f0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1a600 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  e 4: {.      tes
1a610 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1a620 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d  x80 );.      y =
1a630 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1a640 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74  aKey);.      ret
1a650 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29  urn (i64)*(int*)
1a660 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  &y;.    }.    ca
1a670 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 5: {.      te
1a680 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1a690 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1a6a0 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55  turn FOUR_BYTE_U
1a6b0 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28  INT(aKey+2) + ((
1a6c0 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1a6d0 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1a6e0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a6f0 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78  6: {.      u64 x
1a700 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1a710 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1a720 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1a730 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78  &0x80 );.      x
1a740 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55   = (x<<32) | FOU
1a750 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1a760 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +4);.      retur
1a770 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78  n (i64)*(i64*)&x
1a780 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1a790 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
1a7a0 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe - 8);.}../*.*
1a7b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1a7c0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f  compares the two
1a7d0 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69   table rows or i
1a7e0 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ndex records.** 
1a7f0 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b  specified by {nK
1a800 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20  ey1, pKey1} and 
1a810 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75  pPKey2.  It retu
1a820 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20  rns a negative, 
1a830 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1a840 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b  ive integer if k
1a850 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ey1 is less than
1a860 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a  , equal to or .*
1a870 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b  * greater than k
1a880 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31  ey2.  The {nKey1
1a890 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73  , pKey1} key mus
1a8a0 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63  t be a blob.** c
1a8b0 72 65 61 74 65 64 20 62 79 20 74 68 20 4f 50 5f  reated by th OP_
1a8c0 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
1a8d0 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20  e of the VDBE.  
1a8e0 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65  The pPKey2.** ke
1a8f0 79 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73  y must be a pars
1a900 65 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f  ed key such as o
1a910 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
1a920 73 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65  sqlite3VdbeParse
1a930 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  Record..**.** If
1a940 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20   argument bSkip 
1a950 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20  is non-zero, it 
1a960 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1a970 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  the caller has a
1a980 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d  lready.** determ
1a990 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1a9a0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1a9b0 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1a9c0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64  ..**.** Key1 and
1a9d0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76   Key2 do not hav
1a9e0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  e to contain the
1a9f0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
1aa00 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a  fields. If all .
1aa10 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ** fields that a
1aa20 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65  ppear in both ke
1aa30 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68  ys are equal, th
1aa40 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  en pPKey2->defau
1aa50 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74  lt_rc is .** ret
1aa60 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
1aa70 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1aa80 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65  ion is discovere
1aa90 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 69  d, set pPKey2->i
1aaa0 73 43 6f 72 72 75 70 74 20 74 6f 20 6e 6f 6e 2d  sCorrupt to non-
1aab0 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 72 65 74 75  zero.** and retu
1aac0 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 0..*/.int sql
1aad0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1aae0 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
1aaf0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1ab00 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1ab10 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1ab20 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ab30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1ab40 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1ab50 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1ab70 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1ab80 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1ab90 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1abc0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1abd0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1abe0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1ac10 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1ac20 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1ac30 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1ac50 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1ac60 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1ac70 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1aca0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1acb0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1acc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1acd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1ace0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1acf0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1ad00 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1ad10 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1ad20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1ad30 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1ad40 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1ad50 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1ad60 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ad70 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1ad80 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1ad90 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1ada0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1adb0 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1adc0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1add0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1ade0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1adf0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1ae00 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1ae10 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1ae20 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1ae30 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1ae40 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1ae50 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1ae60 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1ae70 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1ae80 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1ae90 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1aea0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1aeb0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1aec0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1aed0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1aee0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1aef0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1af00 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1af10 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1af20 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1af30 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1af40 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1af50 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1af60 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1af70 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1af80 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1af90 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75  ->isCorrupt = (u
1afa0 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1afb0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1afc0 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75  urn 0;  /* Corru
1afd0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1afe0 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20     i = 0;.  }.. 
1aff0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1b000 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1b010 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1b020 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1b030 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1b040 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1b050 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1b060 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1b070 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1b080 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1b090 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b0a0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1b0b0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1b0c0 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1b0d0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1b0e0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1b0f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1b100 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1b110 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1b120 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b130 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1b140 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1b150 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1b160 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1b170 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1b180 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1b190 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1b1a0 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1b1b0 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1b1c0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1b1d0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1b1e0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1b1f0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1b200 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1b210 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1b220 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1b230 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1b240 20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20     double rhs = 
1b250 28 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e  (double)pRhs->u.
1b260 69 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  i;.        sqlit
1b270 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b280 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1b290 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1b2a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
1b2b0 31 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  1.r<rhs ){.     
1b2c0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1b2d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1b2e0 6d 65 6d 31 2e 72 3e 72 68 73 20 29 7b 0a 20 20  mem1.r>rhs ){.  
1b2f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1b300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b320 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1b330 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1b340 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1b350 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1b360 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1b370 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1b380 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1b390 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b3a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b3b0 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1b3c0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1b3d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b3e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1b3f0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1b400 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1b410 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1b420 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1b430 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1b440 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1b450 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20  serial_type>=12 
1b460 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1b470 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1b480 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1b490 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1b4a0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1b4b0 73 65 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62  se{.        doub
1b4c0 6c 65 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 72  le rhs = pRhs->r
1b4d0 3b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  ;.        double
1b4e0 20 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 73 71   lhs;.        sq
1b4f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b500 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1b510 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1b520 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1b530 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1b540 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 20  {.          lhs 
1b550 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 20 20 20 20  = mem1.r;.      
1b560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1b570 20 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65     lhs = (double
1b580 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20  )mem1.u.i;.     
1b590 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1b5a0 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1b5b0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1b5c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1b5d0 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1b5e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1b5f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b600 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1b610 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1b620 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1b630 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1b640 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1b650 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1b660 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1b670 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1b680 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1b690 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1b6a0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1b6b0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1b6c0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1b6d0 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1b6e0 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1b6f0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1b700 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b710 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1b720 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1b730 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1b740 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1b750 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1b760 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1b770 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1b780 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1b790 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1b7a0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1b7b0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1b7c0 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1b7d0 20 20 20 70 50 4b 65 79 32 2d 3e 69 73 43 6f 72     pPKey2->isCor
1b7e0 72 75 70 74 20 3d 20 28 75 38 29 53 51 4c 49 54  rupt = (u8)SQLIT
1b7f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b800 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b810 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b820 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1b830 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1b840 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1b850 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1b860 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1b870 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1b880 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1b890 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1b8a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1b8b0 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1b8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1b8d0 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1b8e0 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1b8f0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1b900 72 65 4d 65 6d 53 74 72 69 6e 67 28 26 6d 65 6d  reMemString(&mem
1b910 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
1b920 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20  o->aColl[i]);.  
1b930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b940 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1b950 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1b960 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1b970 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1b980 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1b990 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1b9a0 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1b9b0 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1b9c0 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1b9d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b9e0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1b9f0 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1ba00 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1ba10 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1ba20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ba30 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1ba40 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ba50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1ba60 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1ba70 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ba80 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
1ba90 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1baa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1bab0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1bac0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
1bad0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1bae0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1baf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bb00 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
1bb10 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1bb20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1bb30 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
1bb40 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1bb50 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1bb60 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
1bb70 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1bb80 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 73 43       pPKey2->isC
1bb90 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53 51 4c  orrupt = (u8)SQL
1bba0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bbb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1bbc0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1bbd0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1bbe0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1bbf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1bc00 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1bc10 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1bc20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1bc30 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1bc40 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1bc50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1bc60 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1bc70 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1bc80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1bc90 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1bca0 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1bcb0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1bcc0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1bcd0 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1bce0 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1bcf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1bd00 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1bd10 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1bd20 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1bd30 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1bd40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1bd50 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1bd60 42 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  B.          || (
1bd70 72 63 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f  rc<0 && vdbeReco
1bd80 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1bd90 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1bda0 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20 20 20  ey2)<0).        
1bdb0 20 20 7c 7c 20 28 72 63 3e 30 20 26 26 20 76 64    || (rc>0 && vd
1bdc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1bdd0 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1bde0 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20 20  1, pPKey2)>0).  
1bdf0 20 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49          || pKeyI
1be00 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1be10 61 69 6c 65 64 0a 20 20 20 20 20 20 29 3b 0a 20  ailed.      );. 
1be20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d       assert( mem
1be30 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  1.zMalloc==0 ); 
1be40 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1be50 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72  below */.      r
1be60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1be70 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52  .    i++;.    pR
1be80 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20  hs++;.    d1 += 
1be90 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bea0 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1beb0 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20  type);.    idx1 
1bec0 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74  += sqlite3Varint
1bed0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1bee0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31  ;.  }while( idx1
1bef0 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72  <(unsigned)szHdr
1bf00 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1bf10 46 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e  Field && d1<=(un
1bf20 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1bf30 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20  .  /* No memory 
1bf40 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76  allocation is ev
1bf50 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e  er used on mem1.
1bf60 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69    Prove this usi
1bf70 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  ng.  ** the foll
1bf80 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
1bf90 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29   If the assert()
1bfa0 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63   fails, it indic
1bfb0 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f  ates a.  ** memo
1bfc0 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65  ry leak and a ne
1bfd0 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74  ed to call sqlit
1bfe0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1bff0 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61  (&mem1).  */.  a
1c000 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c  ssert( mem1.zMal
1c010 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c020 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c030 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
1c040 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
1c050 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1c060 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1c070 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1c080 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1c090 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1c0a0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1c0b0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1c0c0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1c0d0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  _DB .       || p
1c0e0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1c0f0 63 3d 3d 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  c==vdbeRecordCom
1c100 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1c110 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 20   pKey1, pPKey2) 
1c120 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49  .       || pKeyI
1c130 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1c140 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1c150 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
1c160 75 6c 74 5f 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ult_rc;.}../*.**
1c170 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1c180 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76  s an optimized v
1c190 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
1c1a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1c1b0 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61  re() .** that (a
1c1c0 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  ) the first fiel
1c1d0 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61  d of pPKey2 is a
1c1e0 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28  n integer, and (
1c1f0 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d  b) the .** size-
1c200 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1c210 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
1c220 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
1c230 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a  its in a single.
1c240 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  ** byte (i.e. is
1c250 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e   less than 128).
1c260 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1c270 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62  concerns about b
1c280 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c  uffer overreads,
1c290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c2a0 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e   only used.** on
1c2b0 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 74   schemas where t
1c2c0 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64  he maximum valid
1c2d0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
1c2e0 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73  63 bytes or less
1c2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c300 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c310 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79  eInt(.  int nKey
1c320 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1c330 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1c340 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  y */.  UnpackedR
1c350 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20  ecord *pPKey2,  
1c360 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1c370 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 64 20       /* Ignored 
1c3a0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
1c3b0 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73   *aKey = &((cons
1c3c0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63  t u8*)pKey1)[*(c
1c3d0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26  onst u8*)pKey1 &
1c3e0 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65   0x3F];.  int se
1c3f0 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f  rial_type = ((co
1c400 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31  nst u8*)pKey1)[1
1c410 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ];.  int res;.  
1c420 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a  u32 y;.  u64 x;.
1c430 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32    i64 v = pPKey2
1c440 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20  ->aMem[0].u.i;. 
1c450 20 69 36 34 20 6c 68 73 3b 0a 20 20 55 4e 55 53   i64 lhs;.  UNUS
1c460 45 44 5f 50 41 52 41 4d 45 54 45 52 28 62 53 6b  ED_PARAMETER(bSk
1c470 69 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ip);..  assert( 
1c480 62 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 61 73  bSkip==0 );.  as
1c490 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
1c4a0 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
1c4b0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
1c4c0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1c4d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
1c4e0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
1c4f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1c500 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
1c510 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1c520 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1c530 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1c540 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c550 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1c560 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c570 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1c580 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1c590 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1c5a0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1c5b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c5c0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1c5d0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1c5e0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1c5f0 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
1c600 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c610 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c620 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c630 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c640 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1c650 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c660 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
1c670 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1c680 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1c690 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1c6a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1c6b0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1c6c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c6d0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1c6e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1c6f0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1c700 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1c710 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1c720 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1c730 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1c740 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1c750 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1c760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1c770 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
1c780 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1c790 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
1c7a0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1c7b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1c7c0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1c7d0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1c7e0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
1c7f0 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
1c800 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1c810 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c820 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1c830 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1c840 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c850 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
1c860 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
1c870 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
1c880 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
1c890 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
1c8a0 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
1c8b0 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
1c8c0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
1c8d0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
1c8e0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
1c8f0 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
1c900 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
1c910 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
1c920 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
1c930 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
1c940 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
1c950 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
1c960 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
1c970 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
1c980 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
1c990 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
1c9a0 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
1c9b0 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
1c9c0 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
1c9d0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
1c9e0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
1c9f0 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
1ca00 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
1ca10 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
1ca20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1ca30 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ca40 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1ca50 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 0a 20  , pPKey2, 0);.. 
1ca60 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1ca70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1ca80 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1ca90 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1caa0 70 50 4b 65 79 32 2c 20 30 29 3b 0a 20 20 7d 0a  pPKey2, 0);.  }.
1cab0 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a  .  if( v>lhs ){.
1cac0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1cad0 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r1;.  }else if
1cae0 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v<lhs ){.    r
1caf0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
1cb00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b  .  }else if( pPK
1cb10 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1cb20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
1cb30 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
1cb40 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75  two keys are equ
1cb50 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  al. Compare the 
1cb60 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a  trailing .    **
1cb70 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20   fields.  */.   
1cb80 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
1cb90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1cba0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1cbb0 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73  Key2, 1);.  }els
1cbc0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  e{.    /* The fi
1cbd0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
1cbe0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
1cbf0 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61  qual and there a
1cc00 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20  re no trailing. 
1cc10 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65     ** fields. Re
1cc20 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1cc30 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20  ault_rc in this 
1cc40 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73  case. */.    res
1cc50 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1cc60 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73  lt_rc;.  }..  as
1cc70 73 65 72 74 28 20 28 72 65 73 3d 3d 30 20 26 26  sert( (res==0 &&
1cc80 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1cc90 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1cca0 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3d 3d 30  Key1, pPKey2)==0
1ccb0 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73  ).       || (res
1ccc0 3c 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64  <0 && vdbeRecord
1ccd0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1cce0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1ccf0 32 29 3c 30 29 0a 20 20 20 20 20 20 20 7c 7c 20  2)<0).       || 
1cd00 28 72 65 73 3e 30 20 26 26 20 76 64 62 65 52 65  (res>0 && vdbeRe
1cd10 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
1cd20 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1cd30 50 4b 65 79 32 29 3e 30 29 0a 20 20 20 20 20 20  PKey2)>0).      
1cd40 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20   || CORRUPT_DB. 
1cd50 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1cd60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1cd70 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1cd80 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1cd90 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1cda0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1cdb0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1cdc0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1cdd0 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
1cde0 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
1cdf0 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
1ce00 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
1ce10 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
1ce20 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
1ce30 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1ce40 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
1ce50 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1ce60 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1ce70 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1ce80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ce90 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1cea0 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
1ceb0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1cec0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1ced0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1cee0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1cef0 2c 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74  ,       /* Right
1cf00 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1cf10 6b 69 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75  kip.){.  const u
1cf20 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
1cf30 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
1cf40 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
1cf50 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 55 4e 55    int res;.  UNU
1cf60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 62 53  SED_PARAMETER(bS
1cf70 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  kip);..  assert(
1cf80 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a 20 20 67   bSkip==0 );.  g
1cf90 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1cfa0 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
1cfb0 65 29 3b 0a 0a 20 20 69 66 28 20 73 65 72 69 61  e);..  if( seria
1cfc0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1cfd0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1cfe0 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
1cff0 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
1d000 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
1d010 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
1d020 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1d030 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
1d040 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
1d050 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
1d060 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
1d070 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d080 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
1d090 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
1d0a0 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
1d0b0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
1d0c0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
1d0d0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
1d0e0 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
1d0f0 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
1d100 2d 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75  ->isCorrupt = (u
1d110 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1d120 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1d130 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
1d140 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1d150 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
1d160 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d170 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
1d180 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
1d190 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
1d1a0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
1d1b0 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
1d1c0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
1d1d0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
1d1e0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
1d1f0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1d200 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d210 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1d220 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
1d230 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1d240 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
1d250 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1d260 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 1);.        }e
1d270 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1d280 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
1d290 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20  ault_rc;.       
1d2a0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1d2b0 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
1d2c0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
1d2d0 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
1d2e0 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
1d2f0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1d300 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1d310 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
1d320 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
1d330 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
1d340 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d350 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
1d360 0a 0a 20 20 61 73 73 65 72 74 28 20 28 72 65 73  ..  assert( (res
1d370 3d 3d 30 20 26 26 20 76 64 62 65 52 65 63 6f 72  ==0 && vdbeRecor
1d380 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1d390 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1d3a0 79 32 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 7c  y2)==0).       |
1d3b0 7c 20 28 72 65 73 3c 30 20 26 26 20 76 64 62 65  | (res<0 && vdbe
1d3c0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1d3d0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
1d3e0 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20   pPKey2)<0).    
1d3f0 20 20 20 7c 7c 20 28 72 65 73 3e 30 20 26 26 20     || (res>0 && 
1d400 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d410 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d420 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a  ey1, pPKey2)>0).
1d430 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1d440 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
1d450 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1d460 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1d470 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
1d480 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
1d490 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1d4a0 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
1d4b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1d4c0 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
1d4d0 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
1d4e0 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
1d4f0 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
1d500 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
1d510 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
1d520 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
1d530 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
1d540 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
1d550 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
1d560 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1d570 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
1d580 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1d590 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
1d5a0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1d5b0 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
1d5c0 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
1d5d0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
1d5e0 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
1d5f0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
1d600 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
1d610 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
1d620 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
1d630 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
1d640 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
1d650 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
1d660 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
1d670 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
1d680 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
1d690 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
1d6a0 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
1d6b0 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
1d6c0 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
1d6d0 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
1d6e0 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
1d6f0 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
1d700 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
1d710 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
1d720 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
1d730 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
1d740 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
1d750 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1d760 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
1d770 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
1d780 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
1d790 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
1d7a0 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
1d7b0 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
1d7c0 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
1d7d0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
1d7e0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
1d7f0 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
1d800 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
1d810 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
1d820 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
1d830 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
1d840 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
1d850 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
1d860 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
1d870 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
1d880 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
1d890 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
1d8a0 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
1d8b0 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
1d8c0 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
1d8d0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
1d8e0 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
1d8f0 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
1d900 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
1d910 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1d920 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
1d930 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
1d940 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
1d950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d960 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
1d970 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
1d980 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
1d990 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
1d9a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1d9b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1d9c0 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
1d9d0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
1d9e0 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
1d9f0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
1da00 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
1da10 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1da20 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
1da30 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
1da40 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
1da50 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
1da60 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
1da70 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
1da80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
1da90 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1daa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
1dab0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1dac0 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
1dad0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
1dae0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1daf0 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
1db00 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
1db10 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
1db20 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
1db30 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1db40 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
1db50 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
1db60 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
1db70 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
1db80 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
1db90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1dba0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
1dbb0 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
1dbc0 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
1dbd0 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
1dbe0 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
1dbf0 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
1dc00 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
1dc10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1dc20 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
1dc30 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
1dc40 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
1dc50 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
1dc60 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
1dc70 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
1dc80 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
1dc90 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
1dca0 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
1dcb0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
1dcc0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1dcd0 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
1dce0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1dcf0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
1dd00 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
1dd10 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
1dd20 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1dd30 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
1dd40 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
1dd50 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
1dd60 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  m, v;..  UNUSED_
1dd70 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a  PARAMETER(db);..
1dd80 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
1dd90 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
1dda0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
1ddb0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
1ddc0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
1ddd0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
1dde0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
1ddf0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
1de00 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
1de10 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
1de20 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
1de30 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1de40 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
1de50 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
1de60 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
1de70 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
1de80 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
1de90 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
1dea0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
1deb0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
1dec0 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
1ded0 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
1dee0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
1def0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
1df00 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1df10 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43  _OK );     /* pC
1df20 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ur is always val
1df30 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61  id so KeySize ca
1df40 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61  nnot fail */.  a
1df50 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79  ssert( (nCellKey
1df60 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33   & SQLITE_MAX_U3
1df70 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65  2)==(u64)nCellKe
1df80 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20  y );..  /* Read 
1df90 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  in the complete 
1dfa0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69  content of the i
1dfb0 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ndex entry */.  
1dfc0 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69  memset(&m, 0, si
1dfd0 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d  zeof(m));.  rc =
1dfe0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1dff0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1e000 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1e010 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1e020 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1e030 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1e040 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1e050 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1e060 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1e070 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1e080 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1e090 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1e0a0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1e0b0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1e0c0 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1e0d0 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1e0e0 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1e0f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1e100 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1e110 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1e120 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1e130 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1e140 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1e150 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1e160 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1e170 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1e180 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1e190 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1e1a0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1e1b0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1e1c0 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1e1d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1e1e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e1f0 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1e200 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e210 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1e220 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e230 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1e240 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1e250 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1e260 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1e270 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1e280 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1e290 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1e2a0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1e2b0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1e2c0 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1e2d0 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1e2e0 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1e2f0 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1e300 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1e310 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
1e320 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
1e330 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1e340 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
1e350 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
1e360 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e370 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
1e380 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
1e390 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1e3a0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1e3b0 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
1e3c0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
1e3d0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1e3e0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
1e3f0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1e400 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
1e410 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
1e420 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
1e430 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
1e440 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1e450 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1e460 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1e470 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1e480 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1e490 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1e4a0 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
1e4b0 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
1e4c0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
1e4d0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1e4e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
1e4f0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
1e500 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
1e510 63 61 73 65 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21  case( m.zMalloc!
1e520 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
1e530 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1e540 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e550 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
1e570 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
1e580 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
1e590 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
1e5a0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
1e5b0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
1e5c0 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
1e5d0 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
1e5e0 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
1e5f0 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
1e600 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1e610 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
1e620 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1e630 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
1e640 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
1e650 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1e660 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
1e670 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
1e680 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
1e690 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
1e6a0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
1e6b0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
1e6c0 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
1e6d0 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
1e6e0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
1e6f0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
1e700 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
1e710 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
1e720 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
1e730 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
1e740 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
1e750 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
1e760 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
1e770 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
1e780 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
1e790 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
1e7a0 79 43 6f 6d 70 61 72 65 28 0a 20 20 56 64 62 65  yCompare(.  Vdbe
1e7b0 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20  Cursor *pC,     
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7d0 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f  The cursor to co
1e7e0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f  mpare against */
1e7f0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1e800 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20  d *pUnpacked,   
1e810 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1e820 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a  version of key *
1e830 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20  /.  int *res    
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1e860 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73  e comparison res
1e870 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ult here */.){. 
1e880 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
1e890 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  0;.  int rc;.  B
1e8a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20  tCursor *pCur = 
1e8b0 70 43 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d  pC->pCursor;.  M
1e8c0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  em m;..  assert(
1e8d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1e8e0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
1e8f0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
1e900 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
1e910 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
1e920 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
1e930 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1e940 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
1e950 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
1e960 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
1e970 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
1e980 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
1e990 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
1e9a0 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
1e9b0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
1e9c0 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
1e9d0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
1e9e0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
1e9f0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
1ea00 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
1ea10 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
1ea20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
1ea30 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
1ea40 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1ea50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ea60 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65  T_BKPT;.  }.  me
1ea70 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65  mset(&m, 0, size
1ea80 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73  of(m));.  rc = s
1ea90 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
1eaa0 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73  mBtree(pC->pCurs
1eab0 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c  or, 0, (u32)nCel
1eac0 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20  lKey, 1, &m);.  
1ead0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1eae0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a  turn rc;.  }.  *
1eaf0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62  res = sqlite3Vdb
1eb00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d  eRecordCompare(m
1eb10 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b  .n, m.z, pUnpack
1eb20 65 64 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  ed, 0);.  sqlite
1eb30 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1eb40 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1eb50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1eb60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1eb70 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
1eb80 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
1eb90 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
1eba0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
1ebb0 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
1ebc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1ebd0 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
1ebe0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
1ebf0 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
1ec00 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
1ec10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ec20 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
1ec30 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
1ec40 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
1ec50 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
1ec60 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
1ec70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
1ec80 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
1ec90 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
1eca0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1ecb0 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
1ecc0 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
1ecd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ece0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
1ecf0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
1ed00 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
1ed10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
1ed20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
1ed30 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
1ed40 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1ed50 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1ed60 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
1ed70 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
1ed80 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
1ed90 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
1eda0 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
1edb0 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
1edc0 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
1edd0 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
1ede0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
1edf0 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
1ee00 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
1ee10 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
1ee20 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
1ee30 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
1ee40 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
1ee50 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
1ee60 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
1ee70 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
1ee80 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
1ee90 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
1eea0 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
1eeb0 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
1eec0 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
1eed0 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
1eee0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
1eef0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
1ef00 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
1ef10 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
1ef20 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1ef30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1ef40 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1ef50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ef60 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
1ef70 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
1ef80 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
1ef90 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
1efa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1efb0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1efc0 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
1efd0 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
1efe0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
1eff0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
1f000 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
1f010 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
1f020 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
1f030 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
1f040 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
1f050 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
1f060 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
1f070 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
1f080 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
1f090 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
1f0a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1f0b0 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
1f0c0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
1f0d0 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
1f0e0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1f0f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
1f100 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
1f110 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
1f120 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
1f130 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
1f140 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
1f150 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
1f160 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
1f170 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
1f180 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
1f190 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
1f1a0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
1f1b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f1c0 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
1f1d0 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
1f1e0 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
1f1f0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
1f200 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1f210 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
1f220 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
1f230 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
1f240 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
1f250 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
1f260 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
1f270 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
1f280 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f290 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
1f2a0 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
1f2b0 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
1f2c0 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
1f2d0 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
1f2e0 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
1f2f0 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
1f300 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
1f310 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
1f320 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
1f330 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
1f340 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
1f350 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
1f360 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
1f370 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
1f380 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1f390 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
1f3a0 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
1f3b0 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
1f3c0 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
1f3d0 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
1f3e0 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
1f3f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f400 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
1f410 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
1f420 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1f430 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
1f440 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
1f450 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
1f460 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
1f470 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
1f480 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
1f490 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
1f4a0 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
1f4b0 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
1f4c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
1f4d0 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
1f4e0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
1f4f0 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
1f500 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
1f510 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
1f520 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
1f530 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1f540 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
1f550 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
1f560 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1f570 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
1f580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1f590 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
1f5a0 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
1f5b0 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
1f5c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f5d0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.