/ Hex Artifact Content
Login

Artifact 325dcf1b944e6d339a5c5210b7b8c5724a8496fb:


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 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d  arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69  e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62  ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69  e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72  d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   ap;.  sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74  ErrMsg);.  va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74  ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61  ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70  beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72   int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65  epareV2){.  asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d  rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56  =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  2==0 );.  if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20  NABLE_SQLLOG).  
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32  if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  f.  assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70   n);.  p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72  areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  epareV2;.}../*.*
06d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c  * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c  har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70  (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70  Stmt){.  Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74   = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70  ;.  return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
07f0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64  .  assert( pA->d
0800: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74  b==pB->db );.  t
0810: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20  mp = *pA;.  *pA 
0820: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74  = *pB;.  *pB = t
0830: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d  mp;.  pTmp = pA-
0840: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e  >pNext;.  pA->pN
0850: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b  ext = pB->pNext;
0860: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70  .  pB->pNext = p
0870: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41  Tmp;.  pTmp = pA
0880: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70  ->pPrev;.  pA->p
0890: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76  Prev = pB->pPrev
08a0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20  ;.  pB->pPrev = 
08b0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70  pTmp;.  zTmp = p
08c0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a  A->zSql;.  pA->z
08d0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a  Sql = pB->zSql;.
08e0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d    pB->zSql = zTm
08f0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61  p;.  pB->isPrepa
0900: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65  reV2 = pA->isPre
0910: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pareV2;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65   Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68  .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73  at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c  t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69  arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e  ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65   nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74  an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70  o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f  )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72  resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74  LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f  his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41  p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20  lloc remain .** 
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20  unchanged (this 
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f  is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61  pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20  llocated can be 
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65  .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66  with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73   the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70  tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69  Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f  nt nOp){.  VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  p *pNew;.  Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54  ..  /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69  TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73  me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20  igned to force. 
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e   ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68  t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72  ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20  e opportunities 
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61  for .  ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20  ted OOM faults. 
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67  LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20  enerally used.  
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51  g only.  With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68  C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20  e op array.  ** 
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20  by the minimum* 
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20  amount required 
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72  until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72  eaches 512.  Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  mal.  ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49  on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f  STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74  uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  .  ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64  e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20  d 1KB of space, 
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20  ller. */.#ifdef 
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74  LOC_STRESS.  int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41   nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e  lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e  OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65  OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d  lse.  int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20   (p->nOpAlloc ? 
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f  (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45  f(Op)));.  UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29  D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
0e00: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73  rt( nOp<=(1024/s
0e10: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20  izeof(Op)) );.  
0e20: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70  assert( nNew>=(p
0e30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20  ->nOpAlloc+nOp) 
0e40: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
0e50: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e  te3DbRealloc(p->
0e60: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77  db, v->aOp, nNew
0e70: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20  *sizeof(Op));.  
0e80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
0e90: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73  p->szOpAlloc = s
0ea0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
0eb0: 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b  ze(p->db, pNew);
0ec0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63  .    p->nOpAlloc
0ed0: 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f   = p->szOpAlloc/
0ee0: 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20  sizeof(Op);.    
0ef0: 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20  v->aOp = pNew;. 
0f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65   }.  return (pNe
0f10: 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20  w ? SQLITE_OK : 
0f20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
0f30: 54 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  T);.}..#ifdef SQ
0f40: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
0f50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
0f60: 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20  st a convenient 
0f70: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
0f80: 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77  reakpoint that w
0f90: 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65  ill.** fire afte
0fa0: 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73  r each opcode is
0fb0: 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69   inserted and di
0fc0: 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a  splayed using.**
0fd0: 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64   "PRAGMA vdbe_ad
0fe0: 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f  doptrace=on"..*/
0ff0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
1000: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1010: 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
1020: 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  ic int n = 0;.  
1030: 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n++;.}.#endif../
1040: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69  *.** Add a new i
1050: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68  nstruction to th
1060: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75  e list of instru
1070: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69  ctions current i
1080: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20  n the.** VDBE.  
1090: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
10a0: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e  ss of the new in
10b0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
10c0: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a   Parameters:.**.
10d0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20  **    p         
10e0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
10f0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20   the VDBE.**.** 
1100: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20     op           
1110: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f     The opcode fo
1120: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69  r this instructi
1130: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20  on.**.**    p1, 
1140: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72  p2, p3      Oper
1150: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  ands.**.** Use t
1160: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1170: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e  solveLabel() fun
1180: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20  ction to fix an 
1190: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74  address and.** t
11a0: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  he sqlite3VdbeCh
11b0: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f  angeP4() functio
11c0: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  n to change the 
11d0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a  value of the P4.
11e0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73  ** operand..*/.s
11f0: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
1200: 4e 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70  NLINE int growOp
1210: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
1220: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
1230: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73  2, int p3){.  as
1240: 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d  sert( p->pParse-
1250: 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f  >nOpAlloc<=p->nO
1260: 70 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f  p );.  if( growO
1270: 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72  pArray(p, 1) ) r
1280: 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72  eturn 1;.  asser
1290: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
12a0: 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b  pAlloc>p->nOp );
12b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
12d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
12e0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
12f0: 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c  eAddOp3(Vdbe *p,
1300: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
1310: 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29   int p2, int p3)
1320: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
1330: 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d  eOp *pOp;..  i =
1340: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72   p->nOp;.  asser
1350: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
1360: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
1370: 20 20 61 73 73 65 72 74 28 20 6f 70 3e 3d 30 20    assert( op>=0 
1380: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20  && op<0xff );.  
1390: 69 66 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e  if( p->pParse->n
13a0: 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20  OpAlloc<=i ){.  
13b0: 20 20 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33    return growOp3
13c0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
13d0: 70 33 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  p3);.  }.  p->nO
13e0: 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  p++;.  pOp = &p-
13f0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e  >aOp[i];.  pOp->
1400: 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b  opcode = (u8)op;
1410: 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a  .  pOp->p5 = 0;.
1420: 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a    pOp->p1 = p1;.
1430: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a    pOp->p2 = p2;.
1440: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a    pOp->p3 = p3;.
1450: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
1460: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d  .  pOp->p4type =
1470: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66   P4_NOTUSED;.#if
1480: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1490: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
14a0: 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  TS.  pOp->zComme
14b0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
14c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
14d0: 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  UG.  if( p->db->
14e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
14f0: 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
1500: 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b  .    int jj, kk;
1510: 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72  .    Parse *pPar
1520: 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a  se = p->pParse;.
1530: 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b      for(jj=kk=0;
1540: 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c   jj<SQLITE_N_COL
1550: 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20  CACHE; jj++){.  
1560: 20 20 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43      struct yColC
1570: 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65  ache *x = pParse
1580: 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a  ->aColCache + jj
1590: 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69  ;.      if( x->i
15a0: 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43  Level>pParse->iC
15b0: 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e  acheLevel || x->
15c0: 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  iReg==0 ) contin
15d0: 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66  ue;.      printf
15e0: 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d  (" r[%d]={%d:%d}
15f0: 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69  ", x->iReg, x->i
1600: 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d  Table, x->iColum
1610: 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a  n);.      kk++;.
1620: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b      }.    if( kk
1630: 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b   ) printf("\n");
1640: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1650: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70  PrintOp(0, i, &p
1660: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74  ->aOp[i]);.    t
1670: 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70  est_addop_breakp
1680: 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  oint();.  }.#end
1690: 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  if.#ifdef VDBE_P
16a0: 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79  ROFILE.  pOp->cy
16b0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  cles = 0;.  pOp-
16c0: 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  >cnt = 0;.#endif
16d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56  .#ifdef SQLITE_V
16e0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70  DBE_COVERAGE.  p
16f0: 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30  Op->iSrcLine = 0
1700: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1710: 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  n i;.}.int sqlit
1720: 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 64 62  e3VdbeAddOp0(Vdb
1730: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  e *p, int op){. 
1740: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1750: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
1760: 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74   0, 0, 0);.}.int
1770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1780: 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p1(Vdbe *p, int 
1790: 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72  op, int p1){.  r
17a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
17b0: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70  eAddOp3(p, op, p
17c0: 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  1, 0, 0);.}.int 
17d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e0: 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  2(Vdbe *p, int o
17f0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
1800: 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  2){.  return sql
1810: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1820: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29  , op, p1, p2, 0)
1830: 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
1840: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63   code for an unc
1850: 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20  onditional jump 
1860: 74 6f 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  to instruction i
1870: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Dest.*/.int sqli
1880: 74 65 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65  te3VdbeGoto(Vdbe
1890: 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b   *p, int iDest){
18a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
18b0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f  3VdbeAddOp3(p, O
18c0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74  P_Goto, 0, iDest
18d0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
18e0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75  rate code to cau
18f0: 73 65 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53  se the string zS
1900: 74 72 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20  tr to be loaded 
1910: 69 6e 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72  into.** register
1920: 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71   iDest.*/.int sq
1930: 6c 69 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72  lite3VdbeLoadStr
1940: 69 6e 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ing(Vdbe *p, int
1950: 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68   iDest, const ch
1960: 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74  ar *zStr){.  ret
1970: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1980: 64 64 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69  ddOp4(p, OP_Stri
1990: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  ng8, 0, iDest, 0
19a0: 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f  , zStr, 0);.}../
19b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
19c0: 64 65 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69  de that initiali
19d0: 7a 65 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67  zes multiple reg
19e0: 69 73 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  isters to string
19f0: 20 6f 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63   or integer.** c
1a00: 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72  onstants.  The r
1a10: 65 67 69 73 74 65 72 73 20 62 65 67 69 6e 20 77  egisters begin w
1a20: 69 74 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e  ith iDest and in
1a30: 63 72 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69  crease consecuti
1a40: 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67  vely..** One reg
1a50: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
1a60: 69 7a 65 64 20 66 6f 72 20 65 61 63 68 20 63 68  ized for each ch
1a70: 61 72 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70  aracgter in zTyp
1a80: 65 73 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a  es[].  For each.
1a90: 2a 2a 20 22 73 22 20 63 68 61 72 61 63 74 65 72  ** "s" character
1aa0: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1ab0: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 61 20  e register is a 
1ac0: 73 74 72 69 6e 67 20 69 66 20 74 68 65 20 61 72  string if the ar
1ad0: 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74  gument is.** not
1ae0: 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c   NULL, or OP_Nul
1af0: 6c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  l if the value i
1b00: 73 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  s a null pointer
1b10: 2e 20 20 46 6f 72 20 65 61 63 68 20 22 69 22 20  .  For each "i" 
1b20: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
1b30: 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65  zTypes[], the re
1b40: 67 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61  gister is initia
1b50: 6c 69 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  lized to an inte
1b60: 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ger..*/.void sql
1b70: 69 74 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61  ite3VdbeMultiLoa
1b80: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  d(Vdbe *p, int i
1b90: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Dest, const char
1ba0: 20 2a 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a   *zTypes, ...){.
1bb0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1bc0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b  int i;.  char c;
1bd0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1be0: 7a 54 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69  zTypes);.  for(i
1bf0: 3d 30 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b  =0; (c = zTypes[
1c00: 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
1c10: 20 20 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a    if( c=='s' ){.
1c20: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1c30: 20 2a 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   *z = va_arg(ap,
1c40: 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20   const char*);. 
1c50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c60: 41 64 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f  AddOp4(p, z==0 ?
1c70: 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74   OP_Null : OP_St
1c80: 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b  ring8, 0, iDest+
1c90: 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20  +, 0, z, 0);.   
1ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1cb0: 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a  sert( c=='i' );.
1cc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1cd0: 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e  eAddOp2(p, OP_In
1ce0: 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70  teger, va_arg(ap
1cf0: 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29  , int), iDest++)
1d00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
1d10: 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a  _end(ap);.}../*.
1d20: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65  ** Add an opcode
1d30: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74   that includes t
1d40: 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61  he p4 value as a
1d50: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74   pointer..*/.int
1d60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d70: 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  p4(.  Vdbe *p,  
1d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
1d90: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
1da0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
1db0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
1dc0: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
1dd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
1de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1df0: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
1e00: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
1e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
1e20: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
1e30: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
1e40: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
1e50: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  nd */.  const ch
1e60: 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54  ar *zP4,    /* T
1e70: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f  he P4 operand */
1e80: 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20  .  int p4type   
1e90: 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65         /* P4 ope
1ea0: 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rand type */.){.
1eb0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
1ec0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70  ite3VdbeAddOp3(p
1ed0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
1ee0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1ef0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72  ChangeP4(p, addr
1f00: 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a  , zP4, p4type);.
1f10: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d    return addr;.}
1f20: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
1f30: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
1f40: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
1f50: 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34   with a P4_INT64
1f60: 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74   or.** P4_REAL t
1f70: 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ype..*/.int sqli
1f80: 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 75 70  te3VdbeAddOp4Dup
1f90: 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  8(.  Vdbe *p,   
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1fb0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1fc0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1fd0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1fe0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
1ff0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
2000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2010: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
2020: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
2030: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
2040: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2050: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2060: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2070: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  d */.  const u8 
2080: 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68  *zP4,      /* Th
2090: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
20a0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
20b0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
20c0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
20d0: 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20   char *p4copy = 
20e0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
20f0: 61 77 4e 4e 28 73 71 6c 69 74 65 33 56 64 62 65  awNN(sqlite3Vdbe
2100: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(p), 8);.  if(
2110: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79   p4copy ) memcpy
2120: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29  (p4copy, zP4, 8)
2130: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2140: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
2150: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20  op, p1, p2, p3, 
2160: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b  p4copy, p4type);
2170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2180: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20   OP_ParseSchema 
2190: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
21a0: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20  utine is broken 
21b0: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  out from.** sqli
21c0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20  te3VdbeAddOp4() 
21d0: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74  since it needs t
21e0: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20  o also needs to 
21f0: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a  mark all btrees.
2200: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ** as having bee
2210: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  n used..**.** Th
2220: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20  e zWhere string 
2230: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2240: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2250: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
2260: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2270: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68  ill take ownersh
2280: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ip of the alloca
2290: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ted memory..*/.v
22a0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
22b0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
22c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  Vdbe *p, int iDb
22d0: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b  , char *zWhere){
22e0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69  .  int j;.  sqli
22f0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
2300: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2310: 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65   iDb, 0, 0, zWhe
2320: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
2330: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
2340: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
2350: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
2360: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
2370: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
2380: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
2390: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
23a0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
23b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
23c0: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
23d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
23e0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
23f0: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2400: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2410: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2420: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2430: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2440: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2450: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2470: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2480: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
2490: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
24a0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
24b0: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
24c0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
24d0: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
24e0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
24f0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2500: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
2510: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
2520: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
2530: 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45 5f  p, addr, SQLITE_
2540: 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20  INT_TO_PTR(p4), 
2550: 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65 74  P4_INT32);.  ret
2560: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20  urn addr;.}../* 
2570: 49 6e 73 65 72 74 20 74 68 65 20 65 6e 64 20 6f  Insert the end o
2580: 66 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a  f a co-routine.*
2590: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
25a0: 62 65 45 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56  beEndCoroutine(V
25b0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 72 65 67 59  dbe *v, int regY
25c0: 69 65 6c 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  ield){.  sqlite3
25d0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
25e0: 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72  _EndCoroutine, r
25f0: 65 67 59 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20  egYield);..  /* 
2600: 43 6c 65 61 72 20 74 68 65 20 74 65 6d 70 6f 72  Clear the tempor
2610: 61 72 79 20 72 65 67 69 73 74 65 72 20 63 61 63  ary register cac
2620: 68 65 2c 20 74 68 65 72 65 62 79 20 65 6e 73 75  he, thereby ensu
2630: 72 69 6e 67 20 74 68 61 74 20 65 61 63 68 0a 20  ring that each. 
2640: 20 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68   ** co-routine h
2650: 61 73 20 69 74 73 20 6f 77 6e 20 69 6e 64 65 70  as its own indep
2660: 65 6e 64 65 6e 74 20 73 65 74 20 6f 66 20 72 65  endent set of re
2670: 67 69 73 74 65 72 73 2c 20 62 65 63 61 75 73 65  gisters, because
2680: 20 63 6f 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a   co-routines.  *
2690: 2a 20 6d 69 67 68 74 20 65 78 70 65 63 74 20 74  * might expect t
26a0: 68 65 69 72 20 72 65 67 69 73 74 65 72 73 20 74  heir registers t
26b0: 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 20 61  o be preserved a
26c0: 63 72 6f 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c  cross an OP_Yiel
26d0: 64 2c 20 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74  d, and.  ** that
26e0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 70 72 6f   could cause pro
26f0: 62 6c 65 6d 73 20 69 66 20 74 77 6f 20 6f 72 20  blems if two or 
2700: 6d 6f 72 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73  more co-routines
2710: 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 73   are using the s
2720: 61 6d 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61  ame.  ** tempora
2730: 72 79 20 72 65 67 69 73 74 65 72 2e 0a 20 20 2a  ry register..  *
2740: 2f 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e  /.  v->pParse->n
2750: 54 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 76  TempReg = 0;.  v
2760: 2d 3e 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65  ->pParse->nRange
2770: 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Reg = 0;.}../*.*
2780: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 73  * Create a new s
2790: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f  ymbolic label fo
27a0: 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  r an instruction
27b0: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f   that has yet to
27c0: 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54   be.** coded.  T
27d0: 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  he symbolic labe
27e0: 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  l is really just
27f0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62   a negative numb
2800: 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65  er.  The.** labe
2810: 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73  l can be used as
2820: 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f 66   the P2 value of
2830: 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20   an operation.  
2840: 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74  Later, when.** t
2850: 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 6f  he label is reso
2860: 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 66  lved to a specif
2870: 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 20  ic address, the 
2880: 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a  VDBE will scan.*
2890: 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f 70  * through its op
28a0: 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  eration list and
28b0: 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75   change all valu
28c0: 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 6d  es of P2 which m
28d0: 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65  atch.** the labe
28e0: 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c  l into the resol
28f0: 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ved address..**.
2900: 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f 77  ** The VDBE know
2910: 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c 75  s that a P2 valu
2920: 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 63  e is a label bec
2930: 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 0a  ause labels are.
2940: 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 69  ** always negati
2950: 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 73  ve and P2 values
2960: 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f 20   are suppose to 
2970: 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e  be non-negative.
2980: 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 67  .** Hence, a neg
2990: 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 69  ative P2 value i
29a0: 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 68  s a label that h
29b0: 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 73  as yet to be res
29c0: 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  olved..**.** Zer
29d0: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
29e0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
29f0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2a00: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56  3VdbeMakeLabel(V
2a10: 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73 65  dbe *v){.  Parse
2a20: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2a30: 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c  .  int i = p->nL
2a40: 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74  abel++;.  assert
2a50: 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( v->magic==VDBE
2a60: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
2a70: 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29 29   if( (i & (i-1))
2a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  ==0 ){.    p->aL
2a90: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44 62  abel = sqlite3Db
2aa0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d  ReallocOrFree(p-
2ab0: 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20  >db, p->aLabel, 
2ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29 2a          (i*2+1)*
2af0: 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c  sizeof(p->aLabel
2b00: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
2b10: 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20   p->aLabel ){.  
2b20: 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d    p->aLabel[i] =
2b30: 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
2b40: 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a  n ADDR(i);.}../*
2b50: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65  .** Resolve labe
2b60: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20  l "x" to be the 
2b70: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
2b80: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
2b90: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65  to.** be inserte
2ba0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65  d.  The paramete
2bb0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20  r "x" must have 
2bc0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72  been obtained fr
2bd0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61  om.** a prior ca
2be0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
2bf0: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f  eMakeLabel()..*/
2c00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
2c10: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64  eResolveLabel(Vd
2c20: 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20  be *v, int x){. 
2c30: 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70   Parse *p = v->p
2c40: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d  Parse;.  int j =
2c50: 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73 73 65   ADDR(x);.  asse
2c60: 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( v->magic==VD
2c70: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
2c80: 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e  .  assert( j<p->
2c90: 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLabel );.  asse
2ca0: 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66  rt( j>=0 );.  if
2cb0: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
2cc0: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20     p->aLabel[j] 
2cd0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20  = v->nOp;.  }.  
2ce0: 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 2d  p->iFixedOp = v-
2cf0: 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  >nOp - 1;.}../*.
2d00: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45  ** Mark the VDBE
2d10: 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e   as one that can
2d20: 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65   only be run one
2d30: 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
2d40: 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c  qlite3VdbeRunOnl
2d50: 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a  yOnce(Vdbe *p){.
2d60: 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65    p->runOnlyOnce
2d70: 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = 1;.}..#ifdef 
2d80: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20  SQLITE_DEBUG /* 
2d90: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
2da0: 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f  Abort() logic */
2db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2dc0: 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66  owing type and f
2dd0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64  unction are used
2de0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2df0: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a  ugh all opcodes.
2e00: 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69  ** in a Vdbe mai
2e10: 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61  n program and ea
2e20: 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72  ch of the sub-pr
2e30: 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73  ograms (triggers
2e40: 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76  ) it may .** inv
2e50: 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20  oke directly or 
2e60: 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73  indirectly. It s
2e70: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73  hould be used as
2e80: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2e90: 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20    Op *pOp;.**   
2ea0: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
2eb0: 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74  ;.**.**   memset
2ec0: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
2ed0: 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20  of(sIter));.**  
2ee0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20   sIter.v = v;   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73           // v is
2f10: 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a   of type Vdbe* .
2f20: 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70  **   while( (pOp
2f30: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2f40: 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20  Iter)) ){.**    
2f50: 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67   // Do something
2f60: 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d   with pOp.**   }
2f70: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46  .**   sqlite3DbF
2f80: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
2f90: 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a  .apSub);.** .*/.
2fa0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
2fb0: 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70  dbeOpIter VdbeOp
2fc0: 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62  Iter;.struct Vdb
2fd0: 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65  eOpIter {.  Vdbe
2fe0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
2ff0: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74         /* Vdbe t
3000: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
3010: 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66  h the opcodes of
3020: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
3030: 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20   **apSub;       
3040: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
3050: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
3060: 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  t nSub;         
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3080: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3090: 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20   apSub */.  int 
30a0: 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  iAddr;          
30b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
30c0: 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75  s of next instru
30d0: 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ction to return 
30e0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20  */.  int iSub;  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67  /* 0 = main prog
3110: 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73  ram, 1 = first s
3120: 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20  ub-program etc. 
3130: 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20  */.};.static Op 
3140: 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65  *opIterNext(Vdbe
3150: 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64  OpIter *p){.  Vd
3160: 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20  be *v = p->v;.  
3170: 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  Op *pRet = 0;.  
3180: 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e  Op *aOp;.  int n
3190: 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53  Op;..  if( p->iS
31a0: 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a  ub<=p->nSub ){..
31b0: 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d      if( p->iSub=
31c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20  =0 ){.      aOp 
31d0: 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  = v->aOp;.      
31e0: 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  nOp = v->nOp;.  
31f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
3200: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
3210: 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20  >iSub-1]->aOp;. 
3220: 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70       nOp = p->ap
3230: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
3240: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  nOp;.    }.    a
3250: 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c  ssert( p->iAddr<
3260: 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74  nOp );..    pRet
3270: 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72   = &aOp[p->iAddr
3280: 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b  ];.    p->iAddr+
3290: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41  +;.    if( p->iA
32a0: 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20  ddr==nOp ){.    
32b0: 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20    p->iSub++;.   
32c0: 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b     p->iAddr = 0;
32d0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
32e0: 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d  ( pRet->p4type==
32f0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
3300: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
3310: 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73   = (p->nSub+1)*s
3320: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
3330: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
3340: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3350: 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b  j<p->nSub; j++){
3360: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
3370: 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e  apSub[j]==pRet->
3380: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
3390: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
33a0: 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75     if( j==p->nSu
33b0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
33c0: 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44  apSub = sqlite3D
33d0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76  bReallocOrFree(v
33e0: 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20  ->db, p->apSub, 
33f0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
3400: 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b  if( !p->apSub ){
3410: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20  .          pRet 
3420: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
3430: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
3440: 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b  >apSub[p->nSub++
3450: 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72  ] = pRet->p4.pPr
3460: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d  ogram;.        }
3470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3480: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
3490: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  t;.}../*.** Chec
34a0: 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  k if the program
34b0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
34c0: 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  M associated wit
34d0: 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20  h pParse may.** 
34e0: 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65  throw an ABORT e
34f0: 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e  xception (causin
3500: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  g the statement,
3510: 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20   but not entire 
3520: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74  transaction.** t
3530: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
3540: 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  ). This conditio
3550: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
3560: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72   main program or
3570: 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67   any.** sub-prog
3580: 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e  rams contains an
3590: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
35a0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f  ng:.**.**   *  O
35b0: 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53  P_Halt with P1=S
35c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
35d0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
35e0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  ..**   *  OP_Hal
35f0: 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d  tIfNull with P1=
3600: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
3610: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
3620: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65  t..**   *  OP_De
3630: 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50  stroy.**   *  OP
3640: 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20  _VUpdate.**   * 
3650: 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20   OP_VRename.**  
3660: 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72   *  OP_FkCounter
3670: 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d   with P2==0 (imm
3680: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
3690: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a  ey constraint).*
36a0: 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65  *   *  OP_Create
36b0: 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69  Table and OP_Ini
36c0: 74 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20  tCoroutine (for 
36d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53 20  CREATE TABLE AS 
36e0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
36f0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
3700: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
3710: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
3720: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
3730: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
3740: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
3750: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
3760: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
3770: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
3780: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
3790: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
37a0: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
37b0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
37c0: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
37d0: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
37e0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
37f0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
3800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
3810: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
3820: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
3830: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
3840: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3850: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3860: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
3870: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
3880: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e  sAbort = 0;.  in
3890: 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d  t hasFkCounter =
38a0: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65   0;.  int hasCre
38b0: 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ateTable = 0;.  
38c0: 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  int hasInitCorou
38d0: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  tine = 0;.  Op *
38e0: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
38f0: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
3900: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
3910: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
3920: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
3930: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
3940: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
3950: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
3960: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
3970: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
3980: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
3990: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
39a0: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
39b0: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20  =OP_VRename .   
39c0: 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f    || ((opcode==O
39d0: 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65  P_Halt || opcode
39e0: 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29  ==OP_HaltIfNull)
39f0: 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70   .      && ((pOp
3a00: 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->p1&0xff)==SQLI
3a10: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
3a20: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
3a30: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
3a40: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
3a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3a60: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64   }.    if( opcod
3a70: 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  e==OP_CreateTabl
3a80: 65 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62  e ) hasCreateTab
3a90: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  le = 1;.    if( 
3aa0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43  opcode==OP_InitC
3ab0: 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e  oroutine ) hasIn
3ac0: 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  itCoroutine = 1;
3ad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3ae0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3af0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3b00: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
3b10: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
3b20: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
3b30: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
3b40: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
3b50: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
3b60: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
3b70: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
3b80: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3b90: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
3ba0: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
3bb0: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
3bc0: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
3bd0: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
3be0: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
3bf0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
3c00: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
3c10: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
3c20: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
3c30: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
3c40: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3c50: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3c60: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3c70: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3c80: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3c90: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3ca0: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3cb0: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3cc0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3cd0: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3ce0: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
3cf0: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ter.            
3d00: 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54    || (hasCreateT
3d10: 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43  able && hasInitC
3d20: 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23  oroutine) );.}.#
3d30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3d40: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
3d50: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3d60: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
3d70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3d80: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
3d90: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
3da0: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
3db0: 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a  ed.  It loops.**
3dc0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
3dd0: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78   opcodes and fix
3de0: 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69  es up some detai
3df0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f  ls..**.** (1) Fo
3e00: 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74  r each jump inst
3e10: 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e  ruction with a n
3e20: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
3e30: 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20   (a label).**   
3e40: 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32    resolve the P2
3e50: 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74   value to an act
3e60: 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ual address..**.
3e70: 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74  ** (2) Compute t
3e80: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
3e90: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75  r of arguments u
3ea0: 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66  sed by any SQL f
3eb0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61  unction.**     a
3ec0: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61  nd store that va
3ed0: 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63  lue in *pMaxFunc
3ee0: 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20  Args..**.** (3) 
3ef0: 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e  Update the Vdbe.
3f00: 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62  readOnly and Vdb
3f10: 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67  e.bIsReader flag
3f20: 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a  s to accurately.
3f30: 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20  **     indicate 
3f40: 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  what the prepare
3f50: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75  d statement actu
3f60: 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a  ally does..**.**
3f70: 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20   (4) Initialize 
3f80: 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20  the p4.xAdvance 
3f90: 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64  pointer on opcod
3fa0: 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a  es that use it..
3fb0: 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69  **.** (5) Reclai
3fc0: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  m the memory all
3fd0: 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69  ocated for stori
3fe0: 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74  ng labels..*/.st
3ff0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
4000: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
4010: 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63  p, int *pMaxFunc
4020: 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Args){.  int i;.
4030: 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d    int nMaxArgs =
4040: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a   *pMaxFuncArgs;.
4050: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72    Op *pOp;.  Par
4060: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e  se *pParse = p->
4070: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61  pParse;.  int *a
4080: 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Label = pParse->
4090: 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61  aLabel;.  p->rea
40a0: 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e  dOnly = 1;.  p->
40b0: 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  bIsReader = 0;. 
40c0: 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c   for(pOp=p->aOp,
40d0: 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d   i=p->nOp-1; i>=
40e0: 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a  0; i--, pOp++){.
40f0: 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20      u8 opcode = 
4100: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20  pOp->opcode;..  
4110: 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75    /* NOTE: Be su
4120: 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f  re to update mko
4130: 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20  pcodeh.tcl when 
4140: 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69  adding or removi
4150: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20  ng.    ** cases 
4160: 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68  from this switch
4170: 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28  ! */.    switch(
4180: 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20   opcode ){.     
4190: 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63   case OP_Transac
41a0: 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  tion: {.        
41b0: 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29  if( pOp->p2!=0 )
41c0: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30   p->readOnly = 0
41d0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c  ;.        /* fal
41e0: 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20  l thru */.      
41f0: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
4200: 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20  AutoCommit:.    
4210: 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f    case OP_Savepo
4220: 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  int: {.        p
4230: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
4240: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4250: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
4260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
4270: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68        case OP_Ch
4280: 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66  eckpoint:.#endif
4290: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
42a0: 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73  acuum:.      cas
42b0: 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65  e OP_JournalMode
42c0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72  : {.        p->r
42d0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20  eadOnly = 0;.   
42e0: 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65       p->bIsReade
42f0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62  r = 1;.        b
4300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
4310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4320: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
4330: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70       case OP_VUp
4340: 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  date: {.        
4350: 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78  if( pOp->p2>nMax
4360: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20  Args ) nMaxArgs 
4370: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4390: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  }.      case OP_
43a0: 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20  VFilter: {.     
43b0: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
43c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
43d0: 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20   - i >= 3 );.   
43e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70       assert( pOp
43f0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  [-1].opcode==OP_
4400: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20  Integer );.     
4410: 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70     n = pOp[-1].p
4420: 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  1;.        if( n
4430: 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78  >nMaxArgs ) nMax
4440: 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Args = n;.      
4450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4460: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61  .#endif.      ca
4470: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
4480: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66    case OP_NextIf
4490: 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  Open:.      case
44a0: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20   OP_SorterNext: 
44b0: 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  {.        pOp->p
44c0: 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c  4.xAdvance = sql
44d0: 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20  ite3BtreeNext;. 
44e0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79         pOp->p4ty
44f0: 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b  pe = P4_ADVANCE;
4500: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
4520: 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20  se OP_Prev:.    
4530: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
4540: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
4550: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
4560: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
4570: 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20  revious;.       
4580: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
4590: 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20  4_ADVANCE;.     
45a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
45b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70  }.    }..    pOp
45c0: 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69  ->opflags = sqli
45d0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
45e0: 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69  y[opcode];.    i
45f0: 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73  f( (pOp->opflags
4600: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d   & OPFLG_JUMP)!=
4610: 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29  0 && pOp->p2<0 )
4620: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
4630: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50  ADDR(pOp->p2)<pP
4640: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a  arse->nLabel );.
4650: 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
4660: 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d  aLabel[ADDR(pOp-
4670: 3e 70 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  >p2)];.    }.  }
4680: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4690: 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e  (p->db, pParse->
46a0: 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73  aLabel);.  pPars
46b0: 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->aLabel = 0;. 
46c0: 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20   pParse->nLabel 
46d0: 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63  = 0;.  *pMaxFunc
46e0: 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b  Args = nMaxArgs;
46f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49  .  assert( p->bI
4700: 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62  sReader!=0 || Db
4710: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62  MaskAllZero(p->b
4720: 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a  treeMask) );.}..
4730: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4740: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
4750: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
4760: 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e   to be inserted.
4770: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
4780: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56  dbeCurrentAddr(V
4790: 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dbe *p){.  asser
47a0: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
47b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
47c0: 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b    return p->nOp;
47d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79  .}../*.** Verify
47e0: 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e   that at least N
47f0: 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72   opcode slots ar
4800: 65 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  e available in p
4810: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69   without.** havi
4820: 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72  ng to malloc for
4830: 20 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63   more space (exc
4840: 65 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ept when compile
4850: 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  d using.** SQLIT
4860: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
4870: 54 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e  TRESS).  This in
4880: 74 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20  terface is used 
4890: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a  during testing.*
48a0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
48b0: 20 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74   certain calls t
48c0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  o sqlite3VdbeAdd
48d0: 4f 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76  OpList() can nev
48e0: 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74  er.** fail due t
48f0: 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e  o a OOM fault an
4900: 64 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65  d hence that the
4910: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
4920: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
4930: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c  eAddOpList() wil
4940: 6c 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d  l always be non-
4950: 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  NULL..*/.#if def
4960: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
4970: 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  G) && !defined(S
4980: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4990: 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20  OC_STRESS).void 
49a0: 73 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66  sqlite3VdbeVerif
49b0: 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65  yNoMallocRequire
49c0: 64 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e  d(Vdbe *p, int N
49d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
49e0: 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50  nOp + N <= p->pP
49f0: 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29  arse->nOpAlloc )
4a00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
4a10: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4a20: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
4a30: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
4a40: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
4a50: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
4a60: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
4a70: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
4a80: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
4a90: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
4aa0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
4ab0: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
4ac0: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
4ad0: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
4ae0: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
4af0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
4b00: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
4b10: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
4b20: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
4b30: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
4b40: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
4b50: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
4b60: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
4b70: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
4b80: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
4b90: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
4ba0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
4bb0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
4bc0: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
4bd0: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
4be0: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
4bf0: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
4c00: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
4c10: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
4c20: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
4c30: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
4c40: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
4c50: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
4c60: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
4c70: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
4c80: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
4c90: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
4ca0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
4cb0: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
4cc0: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
4cd0: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
4ce0: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
4cf0: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
4d00: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
4d10: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
4d20: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
4d30: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
4d40: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
4d50: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
4d60: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
4d70: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
4d80: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61  stack.  Return a
4d90: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
4da0: 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69  he first operati
4db0: 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  on inserted..**.
4dc0: 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61  ** Non-zero P2 a
4dd0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70  rguments to jump
4de0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72   instructions ar
4df0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
4e00: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74  adjusted.** so t
4e10: 68 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72  hat the jump tar
4e20: 67 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20  get is relative 
4e30: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
4e40: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
4e50: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69  .*/.VdbeOp *sqli
4e60: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4e70: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e90: 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20   /* Add opcodes 
4ea0: 74 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20  to the prepared 
4eb0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
4ec0: 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20  nt nOp,         
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4ee0: 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73  umber of opcodes
4ef0: 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62   to add */.  Vdb
4f00: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61  eOpList const *a
4f10: 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Op,       /* The
4f20: 20 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61   opcodes to be a
4f30: 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  dded */.  int iL
4f40: 69 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20  ineno           
4f50: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
4f60: 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65  -file line numbe
4f70: 72 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64  r of first opcod
4f80: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
4f90: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c  .  VdbeOp *pOut,
4fa0: 20 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65   *pFirst;.  asse
4fb0: 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61  rt( nOp>0 );.  a
4fc0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4fd0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
4fe0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
4ff0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72   + nOp > p->pPar
5000: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20  se->nOpAlloc && 
5010: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e  growOpArray(p, n
5020: 4f 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Op) ){.    retur
5030: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73  n 0;.  }.  pFirs
5040: 74 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  t = pOut = &p->a
5050: 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f  Op[p->nOp];.  fo
5060: 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b  r(i=0; i<nOp; i+
5070: 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b  +, aOp++, pOut++
5080: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63  ){.    pOut->opc
5090: 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64  ode = aOp->opcod
50a0: 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20  e;.    pOut->p1 
50b0: 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70  = aOp->p1;.    p
50c0: 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70  Out->p2 = aOp->p
50d0: 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  2;.    assert( a
50e0: 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20  Op->p2>=0 );.   
50f0: 20 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63   if( (sqlite3Opc
5100: 6f 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d  odeProperty[aOp-
5110: 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47  >opcode] & OPFLG
5120: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70  _JUMP)!=0 && aOp
5130: 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20  ->p2>0 ){.      
5140: 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e  pOut->p2 += p->n
5150: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f  Op;.    }.    pO
5160: 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33  ut->p3 = aOp->p3
5170: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79  ;.    pOut->p4ty
5180: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
5190: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20  .    pOut->p4.p 
51a0: 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  = 0;.    pOut->p
51b0: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  5 = 0;.#ifdef SQ
51c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
51d0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20  AIN_COMMENTS.   
51e0: 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20   pOut->zComment 
51f0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
5200: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
5210: 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74  OVERAGE.    pOut
5220: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69  ->iSrcLine = iLi
5230: 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20  neno+i;.#else.  
5240: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
5250: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
5260: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
5270: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  if( p->db->flags
5280: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64   & SQLITE_VdbeAd
5290: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20  dopTrace ){.    
52a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
52b0: 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70  ntOp(0, i+p->nOp
52c0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e  , &p->aOp[i+p->n
52d0: 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Op]);.    }.#end
52e0: 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20  if.  }.  p->nOp 
52f0: 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e  += nOp;.  return
5300: 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20   pFirst;.}..#if 
5310: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
5320: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
5330: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
5340: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
5350: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
5360: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
5370: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
5380: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
5390: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
53a0: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
53b0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
53c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
53d0: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
53e0: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
53f0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
5400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5410: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
5420: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
5430: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
5440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5450: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
5460: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
5470: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
54a0: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
54b0: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
54c0: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
54d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
54e0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
54f0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
5500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5510: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
5520: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
5530: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
5540: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
5550: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
5560: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
5570: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
5580: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
5590: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
55a0: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
55b0: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
55c0: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
55d0: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
55e0: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
55f0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
5600: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
5610: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
5620: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
5630: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
5640: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
5650: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
5660: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
5670: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
5680: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
5690: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
56a0: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
56b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
56c0: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
56d0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
56e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
56f0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
5700: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
5710: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
5720: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
5730: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
5740: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5750: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
5760: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5770: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
5780: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5790: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
57a0: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
57b0: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
57c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
57d0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
57e0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
57f0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5800: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
5810: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5820: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
5830: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5840: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5850: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5860: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
5870: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5880: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
5890: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
58a0: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
58b0: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
58c0: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
58d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
58e0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
58f0: 70 2c 20 75 38 20 70 35 29 7b 0a 20 20 69 66 28  p, u8 p5){.  if(
5900: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
5910: 61 69 6c 65 64 20 29 20 70 2d 3e 61 4f 70 5b 70  ailed ) p->aOp[p
5920: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35  ->nOp-1].p5 = p5
5930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
5940: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64  e the P2 operand
5950: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   of instruction 
5960: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20  addr so that it 
5970: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
5980: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
5990: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
59a0: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f   to be coded..*/
59b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
59c0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a  eJumpHere(Vdbe *
59d0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
59e0: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
59f0: 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  dOp = p->nOp - 1
5a00: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
5a10: 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c  hangeP2(p, addr,
5a20: 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a   p->nOp);.}.../*
5a30: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74  .** If the input
5a40: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75   FuncDef structu
5a50: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c  re is ephemeral,
5a60: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20   then free it.  
5a70: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65  If.** the FuncDe
5a80: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61  f is not epherma
5a90: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69  l, then do nothi
5aa0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
5ab0: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  id freeEphemeral
5ac0: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  Function(sqlite3
5ad0: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70   *db, FuncDef *p
5ae0: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41  Def){.  if( ALWA
5af0: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65  YS(pDef) && (pDe
5b00: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
5b10: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d  QLITE_FUNC_EPHEM
5b20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
5b30: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
5b40: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ef);.  }.}..stat
5b50: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65  ic void vdbeFree
5b60: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  OpArray(sqlite3 
5b70: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a  *, Op *, int);..
5b80: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50  /*.** Delete a P
5b90: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73  4 value if neces
5ba0: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sary..*/.static 
5bb0: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69  void freeP4(sqli
5bc0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74  te3 *db, int p4t
5bd0: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a  ype, void *p4){.
5be0: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20    if( p4 ){.    
5bf0: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20  assert( db );.  
5c00: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65    switch( p4type
5c10: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50   ){.      case P
5c20: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20  4_FUNCCTX: {.   
5c30: 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72       freeEphemer
5c40: 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28  alFunction(db, (
5c50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c60: 2a 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20  *)p4)->pFunc);. 
5c70: 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74         /* Fall t
5c80: 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20  hrough into the 
5c90: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
5ca0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5cb0: 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63  P4_REAL:.      c
5cc0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
5cd0: 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41      case P4_DYNA
5ce0: 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20  MIC:.      case 
5cf0: 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20  P4_INTARRAY: {. 
5d00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
5d10: 46 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20  Free(db, p4);.  
5d20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5d30: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5d40: 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20  P4_KEYINFO: {.  
5d50: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
5d60: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
5d70: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
5d80: 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34  ref((KeyInfo*)p4
5d90: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5da0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
5db0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
5dc0: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
5dd0: 20 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20    case P4_EXPR: 
5de0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5df0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
5e00: 28 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20  (Expr*)p4);.    
5e10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5e20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
5e30: 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a  case P4_MPRINTF:
5e40: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5e50: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5e60: 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  =0 ) sqlite3_fre
5e70: 65 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  e(p4);.        b
5e80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5e90: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
5ea0: 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66  DEF: {.        f
5eb0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5ec0: 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65  tion(db, (FuncDe
5ed0: 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  f*)p4);.        
5ee0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
5ef0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d       case P4_MEM
5f00: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
5f10: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
5f20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5f30: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
5f40: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
5f50: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  *)p4);.        }
5f60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5f70: 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70  Mem *p = (Mem*)p
5f80: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  4;.          if(
5f90: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
5fa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5fb0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5fc0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
5fd0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
5fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5ff0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
6000: 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41       case P4_VTA
6010: 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  B : {.        if
6020: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6030: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  ed==0 ) sqlite3V
6040: 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c  tabUnlock((VTabl
6050: 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20  e *)p4);.       
6060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6070: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
6080: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
6090: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
60a0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
60b0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
60c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
60d0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
60e0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
60f0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
6100: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
6110: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
6120: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
6130: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
6140: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
6150: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
6160: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
6170: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
6180: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
6190: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
61a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
61b0: 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65 65  p->p4type ) free
61c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
61d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
61e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
61f0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
6200: 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69  MENTS.      sqli
6210: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
6220: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
6230: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
6240: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
6250: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
6260: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
6270: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
6280: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6290: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
62a0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
62b0: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
62c0: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
62d0: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
62e0: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
62f0: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
6300: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
6310: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
6320: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
6330: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
6340: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
6350: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
6360: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
6370: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
6380: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
6390: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
63a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
63b0: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
63c0: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e  to OP_Noop.*/.in
63d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  t sqlite3VdbeCha
63e0: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
63f0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6400: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6410: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
6420: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
6430: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  0;.  assert( add
6440: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6450: 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp );.  pOp = &
6460: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6470: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
6480: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6490: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
64a0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
64b0: 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  D;.  pOp->p4.z =
64c0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64   0;.  pOp->opcod
64d0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72  e = OP_Noop;.  r
64e0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
64f0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70  * If the last op
6500: 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64  code is "op" and
6510: 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d   it is not a jum
6520: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a  p destination,.*
6530: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74  * then remove it
6540: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
6550: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e  f and only if an
6560: 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f   opcode was remo
6570: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
6580: 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69  te3VdbeDeletePri
6590: 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  orOpcode(Vdbe *p
65a0: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20  , u8 op){.  if( 
65b0: 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70  (p->nOp-1)>(p->p
65c0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29  Parse->iFixedOp)
65d0: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
65e0: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
65f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
6600: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6610: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
6620: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
6630: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
6640: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
6650: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
6660: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
6670: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
6680: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
6690: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
66a0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
66b0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
66c0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
66d0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
66e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
66f0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
6700: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
6710: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
6720: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
6730: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
6740: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
6750: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
6760: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
6770: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
6780: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
6790: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
67a0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
67b0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
67c0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
67d0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
67e0: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
67f0: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
6800: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
6810: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
6820: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
6830: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
6840: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
6850: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
6860: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
6870: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
6880: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
6890: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
68a0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
68b0: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
68c0: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
68d0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
68e0: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
68f0: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
6900: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
6910: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
6920: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
6930: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
6940: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
6960: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62  ITE_NOINLINE vdb
6970: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20  eChangeP4Full(. 
6980: 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a   Vdbe *p,.  Op *
6990: 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pOp,.  const cha
69a0: 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a  r *zP4,.  int n.
69b0: 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  ){.  if( pOp->p4
69c0: 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65  type ){.    free
69d0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
69e0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
69f0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6a00: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  pe = 0;.    pOp-
6a10: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  >p4.p = 0;.  }. 
6a20: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
6a30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6a40: 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70  eP4(p, (int)(pOp
6a50: 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c   - p->aOp), zP4,
6a60: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
6a70: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
6a80: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
6a90: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6aa0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
6ab0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
6ac0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
6ad0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
6ae0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  AMIC;.  }.}.void
6af0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6b00: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
6b10: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
6b20: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
6b30: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
6b40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
6b50: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
6b60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
6b70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6b80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6b90: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
6ba0: 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op!=0 || db->mal
6bb0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
6bc0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
6bd0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
6be0: 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65  !=P4_VTAB ) free
6bf0: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
6c00: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
6c10: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6c20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6c30: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6c40: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
6c50: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6c60: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6c70: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
6c80: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
6c90: 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20  ;.  if( n>=0 || 
6ca0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
6cb0: 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46     vdbeChangeP4F
6cc0: 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c  ull(p, pOp, zP4,
6cd0: 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   n);.    return;
6ce0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34  .  }.  if( n==P4
6cf0: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
6d00: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
6d10: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
6d20: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
6d30: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
6d40: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
6d50: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
6d60: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
6d70: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
6d80: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
6d90: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
6da0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
6db0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
6dc0: 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  zP4!=0 ){.    as
6dd0: 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20  sert( n<0 );.   
6de0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
6df0: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
6e00: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
6e10: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69  ed char)n;.    i
6e20: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20  f( n==P4_VTAB ) 
6e30: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
6e40: 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20  (VTable*)zP4);. 
6e50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
6e60: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
6e70: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
6e80: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
6e90: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
6ea0: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
6eb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
6ec0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
6ed0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
6ee0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
6ef0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
6f00: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
6f10: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
6f20: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
6f50: 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
6f60: 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
6f70: 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20   pIdx),.        
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
6f90: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
6fa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6fb0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6fc0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
6fd0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
6fe0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
6ff0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
7000: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
7010: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
7020: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
7030: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
7040: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
7050: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
7060: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
7070: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
7080: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
7090: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
70a0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
70b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
70c0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
70d0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
70e0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
70f0: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
7100: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
7110: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
7120: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
7130: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
7140: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
7150: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7160: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7170: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
7180: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
7190: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
71a0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
71b0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
71c0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
71d0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
71e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
71f0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
7200: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
7210: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
7220: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
7230: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7240: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
7250: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
7260: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
7270: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
7280: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
7290: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
72a0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
72b0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
72c0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
72d0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
72e0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
72f0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
7300: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
7310: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7320: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
7330: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
7340: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
7350: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
7360: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
7370: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
7380: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
7390: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
73a0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
73b0: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
73c0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
73d0: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
73e0: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
73f0: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
7400: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
7410: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
7420: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
7430: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
7440: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7450: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
7460: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
7470: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
7480: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
7490: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
74a0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
74b0: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
74c0: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
74d0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
74e0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
74f0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
7500: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
7510: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
7520: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
7530: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
7540: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
7550: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
7560: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
7570: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
7580: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
7590: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
75a0: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
75b0: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
75c0: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
75d0: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
75e0: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
75f0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
7600: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
7610: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
7620: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
7630: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
7640: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
7650: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
7660: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
7670: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
7680: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
7690: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
76a0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
76b0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
76c0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
76d0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
76e0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
76f0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
7700: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
7710: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
7720: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
7730: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
7740: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
7750: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
7760: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
7770: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
7780: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
7790: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
77a0: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
77b0: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
77c0: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
77d0: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
77e0: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
77f0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
7800: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
7810: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
7820: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
7830: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
7840: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
7850: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
7860: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
7870: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
7880: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
7890: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
78a0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
78b0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
78c0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
78d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
78e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
78f0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
7900: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7910: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
7920: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
7930: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
7940: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
7950: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
7960: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
7970: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
7980: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
7990: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
79a0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
79b0: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
79c0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
79d0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
79e0: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
79f0: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
7a00: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
7a10: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
7a20: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
7a30: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
7a40: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
7a50: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
7a60: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
7a70: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
7a80: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
7a90: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
7aa0: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
7ab0: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
7ac0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
7ad0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
7ae0: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
7af0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
7b00: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
7b10: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
7b20: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
7b30: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
7b40: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
7b50: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
7b60: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
7b70: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
7b80: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
7b90: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
7ba0: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
7bb0: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
7bc0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
7bd0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
7be0: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
7bf0: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
7c00: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
7c10: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
7c20: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
7c30: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
7c40: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
7c50: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
7c60: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
7c70: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
7c80: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
7c90: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
7ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
7cb0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
7cc0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
7cd0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
7ce0: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
7cf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7d00: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
7d10: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
7d20: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
7d30: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
7d40: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
7d50: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
7d60: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
7d70: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
7d80: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
7d90: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
7da0: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
7db0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
7dc0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
7dd0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
7de0: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  zOpName = sq
7df0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
7e00: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20  pOp->opcode);.  
7e10: 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  nOpName = sqlite
7e20: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d  3Strlen30(zOpNam
7e30: 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d  e);.  if( zOpNam
7e40: 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a  e[nOpName+1] ){.
7e50: 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20      int seenCom 
7e60: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  = 0;.    char c;
7e70: 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d  .    zSynopsis =
7e80: 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e   zOpName += nOpN
7e90: 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72  ame + 1;.    for
7ea0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
7eb0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
7ec0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
7ed0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
7ee0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
7ef0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
7f00: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
7f10: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
7f20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
7f30: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
7f40: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
7f50: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
7f60: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
7f70: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
7f80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7f90: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
7fa0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
7fb0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
7fc0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
7fd0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7fe0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
7ff0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
8000: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8010: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
8020: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8030: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8040: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
8050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8060: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
8070: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
8080: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8090: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
80a0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
80b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
80c0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
80d0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
80e0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
80f0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
8100: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8110: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8120: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
8140: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
8150: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
8160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8170: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
8180: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8190: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
81a0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
81b0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
81c0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
81d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
81e0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
81f0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
8200: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
8210: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
8220: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
8230: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
8240: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8250: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
8260: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
8270: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8280: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
8290: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
82a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
82b0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
82c0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
82d0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
82e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
82f0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8300: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
8310: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
8320: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
8330: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
8340: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
8350: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
8360: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
8370: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
8380: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
8390: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
83a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
83b0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
83c0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
83d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
83e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
83f0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
8400: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
8410: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
8420: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
8430: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
8440: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
8450: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8460: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
8470: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
8480: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
8490: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
84a0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
84b0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
84c0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
84d0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
84e0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
84f0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
8500: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
8510: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
8520: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8530: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8540: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
8550: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8560: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
8570: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
8580: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c  XPrintf(p, "%Q",
8590: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
85a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
85b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
85c0: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
85d0: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64  e3XPrintf(p, "%d
85e0: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
85f0: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
8600: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
8610: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
8620: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c  3XPrintf(p, "NUL
8630: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
8640: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8650: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
8660: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8670: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
8680: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
8690: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
86a0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
86b0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
86c0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
86d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
86e0: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77  3XPrintf(p, "row
86f0: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
8700: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8710: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25  e3XPrintf(p, "c%
8720: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
8730: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
8740: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8750: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8760: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
8770: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
8780: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
8790: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
87a0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
87b0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
87c0: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
87d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
87e0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
87f0: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
8800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8810: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
8820: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
8830: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8840: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
8850: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
8860: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8870: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
8880: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
8890: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
88a0: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
88b0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
88c0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
88d0: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
88e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
88f0: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
8900: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
8910: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8920: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
8930: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
8940: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8950: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
8960: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
8970: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
8980: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
8990: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
89a0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
89b0: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
89c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
89d0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
89e0: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
89f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8a00: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
8a10: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
8a20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8a30: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
8a40: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
8a50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
8a60: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
8a70: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
8a80: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
8a90: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
8aa0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
8ab0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
8ac0: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
8ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8ae0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
8af0: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
8b00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8b10: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
8b20: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
8b30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8b40: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
8b50: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
8b60: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
8b70: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
8b80: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8b90: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
8ba0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
8bb0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8bc0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
8bd0: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
8be0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
8bf0: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
8c00: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
8c10: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20  ", "expr");.    
8c20: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
8c30: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73  if( zOp ){.    s
8c40: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8c50: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
8c60: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
8c70: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
8c80: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
8c90: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
8ca0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
8cb0: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  Append(p, ",", 1
8cc0: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
8cd0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
8ce0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
8cf0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
8d00: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22  cumAppend(p, ")"
8d10: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
8d20: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
8d30: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
8d40: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
8d50: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
8d60: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
8d70: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
8d80: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
8d90: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
8da0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
8db0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
8dc0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
8dd0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
8de0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
8df0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
8e00: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
8e10: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
8e20: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
8e30: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
8e40: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
8e50: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
8e60: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
8e70: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
8e80: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
8e90: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
8ea0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
8eb0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
8ec0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
8ed0: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
8ee0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
8ef0: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
8f00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
8f10: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
8f20: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
8f30: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
8f40: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
8f50: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
8f60: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
8f70: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
8f80: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
8f90: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
8fa0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
8fb0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
8fc0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
8fd0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
8fe0: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
8ff0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f    if( strcmp(zCo
9000: 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30  ll, "BINARY")==0
9010: 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a   ) zColl = "B";.
9020: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9030: 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 73 25  Printf(&x, ",%s%
9040: 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  s", pKeyInfo->aS
9050: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d  ortOrder[j] ? "-
9060: 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a  " : "", zColl);.
9070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9080: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
9090: 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b  end(&x, ")", 1);
90a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
90b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
90c0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
90d0: 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50  HINTS.    case P
90e0: 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20  4_EXPR: {.      
90f0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78  displayP4Expr(&x
9100: 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29  , pOp->p4.pExpr)
9110: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9120: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9130: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
9140: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
9150: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
9160: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
9170: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9180: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
9190: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
91a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
91b0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
91c0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
91d0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
91e0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
91f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9200: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
9210: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
9220: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
9230: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
9240: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9250: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
9260: 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  TX: {.      Func
9270: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
9280: 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b  >p4.pCtx->pFunc;
9290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
92a0: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64  rintf(&x, "%s(%d
92b0: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
92c0: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
92d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
92e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
92f0: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
9300: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9310: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  f(&x, "%lld", *p
9320: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
9330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9340: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9350: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
9360: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9370: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
9380: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9390: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
93a0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
93b0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
93c0: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
93d0: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
93e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
93f0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
9400: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
9410: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
9420: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
9430: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
9440: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9450: 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20  = pMem->z;.     
9460: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
9470: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
9480: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9490: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
94a0: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
94b0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
94c0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
94d0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
94e0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
94f0: 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ntf(&x, "%.16g",
9500: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
9510: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9520: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
9530: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ull ){.        z
9540: 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20  P4 = "NULL";.   
9550: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9560: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
9570: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
9580: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
9590: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
95a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
95b0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
95c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
95d0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
95e0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
95f0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
9600: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
9610: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
9620: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9630: 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22  tf(&x, "vtab:%p"
9640: 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  , pVtab);.      
9650: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9660: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9670: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
9680: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
9690: 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34  nt *ai = pOp->p4
96a0: 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  .ai;.      int n
96b0: 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54   = ai[0];   /* T
96c0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
96d0: 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20   of an INTARRAY 
96e0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20  is always the.  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66       ** count of
9710: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
9720: 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f  lements to follo
9730: 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  w */.      for(i
9740: 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =1; i<n; i++){. 
9750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9760: 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 64 22 2c  rintf(&x, ",%d",
9770: 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d   ai[i]);.      }
9780: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
9790: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c  = '[';.      sql
97a0: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
97b0: 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a  nd(&x, "]", 1);.
97c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
97d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
97e0: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
97f0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9800: 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29  f(&x, "program")
9810: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9820: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9830: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
9840: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
9850: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9860: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
9870: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f  {.      zP4 = pO
9880: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69  p->p4.z;.      i
9890: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20  f( zP4==0 ){.   
98a0: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70       zP4 = zTemp
98b0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  ;.        zTemp[
98c0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  0] = 0;.      }.
98d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
98e0: 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
98f0: 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28  h(&x);.  assert(
9900: 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74   zP4!=0 );.  ret
9910: 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69  urn zP4;.}.#endi
9920: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
9930: 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44  Y_P4 */../*.** D
9940: 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64  eclare to the Vd
9950: 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65  be that the BTre
9960: 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e  e object at db->
9970: 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a  aDb[i] is used..
9980: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72  **.** The prepar
9990: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65  ed statements ne
99a0: 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64  ed to know in ad
99b0: 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65  vance the comple
99c0: 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74  te set of.** att
99d0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
99e0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65  that will be use
99f0: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65  .  A mask of the
9a00: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  se databases.** 
9a10: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e  is maintained in
9a20: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20   p->btreeMask.  
9a30: 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20  The p->lockMask 
9a40: 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62  value is the sub
9a50: 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72  set of.** p->btr
9a60: 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61  eeMask of databa
9a70: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ses that will re
9a80: 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f  quire a lock..*/
9a90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9aa0: 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20  eUsesBtree(Vdbe 
9ab0: 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73  *p, int i){.  as
9ac0: 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
9ad0: 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c  p->db->nDb && i<
9ae0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d  (int)sizeof(yDbM
9af0: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65  ask)*8 );.  asse
9b00: 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f  rt( i<(int)sizeo
9b10: 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a  f(p->btreeMask)*
9b20: 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  8 );.  DbMaskSet
9b30: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69  (p->btreeMask, i
9b40: 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26  );.  if( i!=1 &&
9b50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
9b60: 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62  rable(p->db->aDb
9b70: 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20  [i].pBt) ){.    
9b80: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63  DbMaskSet(p->loc
9b90: 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d  kMask, i);.  }.}
9ba0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9bb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
9bc0: 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49  D_CACHE)./*.** I
9bd0: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
9be0: 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  iled to support 
9bf0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9c00: 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65  e and to be thre
9c10: 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20  adsafe,.** this 
9c20: 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20  routine obtains 
9c30: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
9c40: 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42  ated with each B
9c50: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
9c60: 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65  e.** that may be
9c70: 20 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65   accessed by the
9c80: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e   VM passed as an
9c90: 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f   argument. In do
9ca0: 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a  ing so it also.*
9cb0: 2a 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61  * sets the BtSha
9cc0: 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66  red.db member of
9cd0: 20 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53   each of the BtS
9ce0: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73  hared structures
9cf0: 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68  , ensuring.** th
9d00: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62  at the correct b
9d10: 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
9d20: 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  back is invoked 
9d30: 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a  if required..**.
9d40: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
9d50: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62  not threadsafe b
9d60: 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  ut does support 
9d70: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9d80: 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74  e, then.** sqlit
9d90: 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69  e3BtreeEnter() i
9da0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  s invoked to set
9db0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
9dc0: 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66   variables.** of
9dd0: 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64   all of BtShared
9de0: 20 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65   structures acce
9df0: 73 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64  ssible via the d
9e00: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a  atabase handle .
9e10: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
9e20: 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a  th the VM..**.**
9e30: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9e40: 74 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64  t threadsafe and
9e50: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
9e60: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
9e70: 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e  ode, this.** fun
9e80: 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
9e90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62  ..**.** The p->b
9ea0: 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69  treeMask field i
9eb0: 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61  s a bitmask of a
9ec0: 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74  ll btrees that t
9ed0: 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20  he prepared .** 
9ee0: 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c  statement p will
9ef0: 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20   ever use.  Let 
9f00: 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  N be the number 
9f10: 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74  of bits in p->bt
9f20: 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  reeMask.** corre
9f30: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65  sponding to btre
9f40: 65 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72  es that use shar
9f50: 65 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20  ed cache.  Then 
9f60: 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a  the runtime of.*
9f70: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9f80: 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e  s N*N.  But as N
9f90: 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20   is rarely more 
9fa0: 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f  than 1, this sho
9fb0: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20  uld not.** be a 
9fc0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
9fd0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
9fe0: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  r(Vdbe *p){.  in
9ff0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
a000: 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20  db;.  Db *aDb;. 
a010: 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20   int nDb;.  if( 
a020: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
a030: 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74  >lockMask) ) ret
a040: 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d  urn;  /* The com
a050: 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62  mon case */.  db
a060: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
a070: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
a080: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
a090: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
a0a0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
a0b0: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
a0c0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
a0d0: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
a0e0: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
a0f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
a100: 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  r(aDb[i].pBt);. 
a110: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
a120: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
a130: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
a140: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
a150: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
a160: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c  ./*.** Unlock al
a170: 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20  l of the btrees 
a180: 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65  previously locke
a190: 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73  d by a call to s
a1a0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
a1b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  )..*/.static SQL
a1c0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
a1d0: 64 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65  d vdbeLeave(Vdbe
a1e0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a1f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
a200: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
a210: 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  Db;.  db = p->db
a220: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
a230: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
a240: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
a250: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
a260: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
a270: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
a280: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
a290: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
a2a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
a2b0: 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d  treeLeave(aDb[i]
a2c0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
a2d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
a2e0: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
a2f0: 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  ){.  if( DbMaskA
a300: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
a310: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
a320: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
a330: 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65  e */.  vdbeLeave
a340: 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  (p);.}.#endif..#
a350: 69 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  if defined(VDBE_
a360: 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69  PROFILE) || defi
a370: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
a380: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  )./*.** Print a 
a390: 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20  single opcode.  
a3a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
a3b0: 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  used for debuggi
a3c0: 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64  ng only..*/.void
a3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
a3e0: 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  tOp(FILE *pOut, 
a3f0: 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29  int pc, Op *pOp)
a400: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20  {.  char *zP4;. 
a410: 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a   char zPtr[50];.
a420: 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d    char zCom[100]
a430: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
a440: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20   char *zFormat1 
a450: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64  = "%4d %-13s %4d
a460: 20 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25   %4d %4d %-13s %
a470: 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28  .2X %s\n";.  if(
a480: 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20   pOut==0 ) pOut 
a490: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20  = stdout;.  zP4 
a4a0: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
a4b0: 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50   zPtr, sizeof(zP
a4c0: 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  tr));.#ifdef SQL
a4d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
a4e0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69  IN_COMMENTS.  di
a4f0: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
a500: 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a  , zP4, zCom, siz
a510: 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73  eof(zCom));.#els
a520: 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b  e.  zCom[0] = 0;
a530: 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a  .#endif.  /* NB:
a540: 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63    The sqlite3Opc
a550: 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69  odeName() functi
a560: 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
a570: 64 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65  d by code create
a580: 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b  d.  ** by the mk
a590: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20  opcodeh.awk and 
a5a0: 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63  mkopcodec.awk sc
a5b0: 72 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72  ripts which extr
a5c0: 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66  act the.  ** inf
a5d0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
a5e0: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
a5f0: 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74  text */.  fprint
a600: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31  f(pOut, zFormat1
a610: 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c  , pc, .      sql
a620: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
a630: 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70  Op->opcode), pOp
a640: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70  ->p1, pOp->p2, p
a650: 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70  Op->p3, zP4, pOp
a660: 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d  ->p5,.      zCom
a670: 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  .  );.  fflush(p
a680: 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  Out);.}.#endif..
a690: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e  /*.** Release an
a6a0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20   array of N Mem 
a6b0: 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  elements.*/.stat
a6c0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d  ic void releaseM
a6d0: 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20  emArray(Mem *p, 
a6e0: 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20  int N){.  if( p 
a6f0: 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20  && N ){.    Mem 
a700: 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20  *pEnd = &p[N];. 
a710: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
a720: 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
a730: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
a740: 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20   ){.      do{.  
a750: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d        if( p->szM
a760: 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44  alloc ) sqlite3D
a770: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61  bFree(db, p->zMa
a780: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68  lloc);.      }wh
a790: 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20  ile( (++p)<pEnd 
a7a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
a7b0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
a7c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70       assert( (&p
a7d0: 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b  [1])==pEnd || p[
a7e0: 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29  0].db==p[1].db )
a7f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a800: 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
a810: 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29  MemInvariants(p)
a820: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   );..      /* Th
a830: 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c  is block is real
a840: 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65  ly an inlined ve
a850: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33  rsion of sqlite3
a860: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29  VdbeMemRelease()
a870: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74  .      ** that t
a880: 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f  akes advantage o
a890: 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  f the fact that 
a8a0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
a8b0: 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20  value is .      
a8c0: 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20  ** being set to 
a8d0: 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61  NULL after relea
a8e0: 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63  sing any dynamic
a8f0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20   resources..    
a900: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
a910: 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  e justification 
a920: 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20  for duplicating 
a930: 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63  code is that acc
a940: 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20  ording to .     
a950: 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74   ** callgrind, t
a960: 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72  his causes a cer
a970: 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74  tain test case t
a980: 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e  o hit the CPU 4.
a990: 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63  7 .      ** perc
a9a0: 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69  ent less (x86 li
a9b0: 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e  nux, gcc version
a9c0: 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61   4.1.2, -O6) tha
a9d0: 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73  n if .      ** s
a9e0: 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65  qlite3MemRelease
a9f0: 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66  () were called f
aa00: 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d  rom here. With -
aa10: 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20  O2, this jumps. 
aa20: 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70       ** to 6.6 p
aa30: 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74  ercent. The test
aa40: 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69   case is inserti
aa50: 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74  ng 1000 rows int
aa60: 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20  o a table .     
aa70: 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65   ** with no inde
aa80: 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67  xes using a sing
aa90: 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45  le prepared INSE
aaa0: 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69  RT statement, bi
aab0: 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61  nd() .      ** a
aac0: 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65  nd reset(). Inse
aad0: 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20  rts are grouped 
aae0: 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69  into a transacti
aaf0: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
ab00: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ab10: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20  flags & MEM_Agg 
ab20: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
ab30: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
ab40: 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74  M_Dyn );.      t
ab50: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
ab60: 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b  s & MEM_Frame );
ab70: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
ab80: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
ab90: 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20  RowSet );.      
aba0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45  if( p->flags&(ME
abb0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45  M_Agg|MEM_Dyn|ME
abc0: 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53  M_Frame|MEM_RowS
abd0: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  et) ){.        s
abe0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
abf0: 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d  ease(p);.      }
ac00: 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61  else if( p->szMa
ac10: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
ac20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ac30: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  , p->zMalloc);. 
ac40: 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c         p->szMall
ac50: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  oc = 0;.      }.
ac60: 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20  .      p->flags 
ac70: 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b  = MEM_Undefined;
ac80: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b  .    }while( (++
ac90: 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d  p)<pEnd );.  }.}
aca0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
acb0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
acc0: 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e  t and its conten
acd0: 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62  ts. VdbeFrame ob
ace0: 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  jects are.** all
acf0: 6f 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  ocated by the OP
ad00: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
ad10: 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  in sqlite3VdbeEx
ad20: 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ec()..*/.void sq
ad30: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65  lite3VdbeFrameDe
ad40: 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a  lete(VdbeFrame *
ad50: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d  p){.  int i;.  M
ad60: 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46  em *aMem = VdbeF
ad70: 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64  rameMem(p);.  Vd
ad80: 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72  beCursor **apCsr
ad90: 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a   = (VdbeCursor *
ada0: 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c  *)&aMem[p->nChil
adb0: 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  dMem];.  for(i=0
adc0: 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72  ; i<p->nChildCsr
add0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
ade0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
adf0: 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d  r(p->v, apCsr[i]
ae00: 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
ae10: 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70  MemArray(aMem, p
ae20: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20  ->nChildMem);.  
ae30: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
ae40: 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64  eAuxData(p->v->d
ae50: 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c  b, &p->pAuxData,
ae60: 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74   -1, 0);.  sqlit
ae70: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
ae80: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
ae90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
aea0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
aeb0: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
aec0: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
aed0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
aee0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
aef0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
af00: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
af10: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
af20: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
af30: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
af40: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
af50: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
af60: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
af70: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
af80: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
af90: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
afa0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
afb0: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
afc0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
afd0: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
afe0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
aff0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
b000: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
b010: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
b020: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
b030: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
b040: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
b050: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
b060: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
b070: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
b080: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
b090: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
b0a0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
b0b0: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
b0c0: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
b0d0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b0e0: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
b0f0: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
b100: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
b110: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b130: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
b140: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
b170: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
b180: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
b190: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b1c0: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
b1d0: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
b1e0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
b1f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b200: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
b210: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
b220: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
b230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b240: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
b250: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
b260: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
b270: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b290: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
b2a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b2b0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b2e0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
b2f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
b320: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
b330: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
b340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b350: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
b360: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
b370: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
b380: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
b390: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b3a0: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
b3b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b3c0: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
b3d0: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
b3e0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
b3f0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
b400: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
b410: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
b420: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
b430: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
b440: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
b450: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
b460: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
b470: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
b480: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
b490: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
b4a0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
b4b0: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
b4c0: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
b4d0: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
b4e0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b4f0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
b500: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  ==SQLITE_NOMEM_B
b510: 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  KPT ){.    /* Th
b520: 69 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20  is happens if a 
b530: 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20  malloc() inside 
b540: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
b550: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20  3_column_text() 
b560: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
b570: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b580: 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20  ) failed.  */.  
b590: 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c    sqlite3OomFaul
b5a0: 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  t(db);.    retur
b5b0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
b5c0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74    }..  /* When t
b5d0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
b5e0: 70 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73  put rows reaches
b5f0: 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e   nRow, that mean
b600: 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69  s the.  ** listi
b610: 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20  ng has finished 
b620: 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70  and sqlite3_step
b630: 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e  () should return
b640: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20   SQLITE_DONE..  
b650: 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73  ** nRow is the s
b660: 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  um of the number
b670: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
b680: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c  main program, pl
b690: 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20  us.  ** the sum 
b6a0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b6b0: 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69   rows in all tri
b6c0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b6d0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a   encountered.  *
b6e0: 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e  * so far.  The n
b6f0: 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69  Row value will i
b700: 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74  ncrease as new t
b710: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b720: 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f  ms are.  ** enco
b730: 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e  untered, but p->
b740: 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c  pc will eventual
b750: 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e  ly catch up to n
b760: 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77  Row..  */.  nRow
b770: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28   = p->nOp;.  if(
b780: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
b790: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
b7a0: 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  st 8 memory cell
b7b0: 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74  s are used for t
b7c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
b7d0: 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a  So we will.    *
b7e0: 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65  * commandeer the
b7f0: 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65   9th cell to use
b800: 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20   as storage for 
b810: 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
b820: 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ters.    ** to t
b830: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
b840: 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73  ms.  The VDBE is
b850: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68   guaranteed to h
b860: 61 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20  ave at least 9. 
b870: 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f     ** cells.  */
b880: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
b890: 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53  nMem>9 );.    pS
b8a0: 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d  ub = &p->aMem[9]
b8b0: 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  ;.    if( pSub->
b8c0: 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29  flags&MEM_Blob )
b8d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68  {.      /* On th
b8e0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
b8f0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20  sqlite3_step(), 
b900: 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61  pSub will hold a
b910: 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20   NULL.  It is.  
b920: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
b930: 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20  ed to a BLOB by 
b940: 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41  the P4_SUBPROGRA
b950: 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67  M processing log
b960: 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  ic below */.    
b970: 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e    nSub = pSub->n
b980: 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a  /sizeof(Vdbe*);.
b990: 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53        apSub = (S
b9a0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75  ubProgram **)pSu
b9b0: 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b->z;.    }.    
b9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b  for(i=0; i<nSub;
b9d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f   i++){.      nRo
b9e0: 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e  w += apSub[i]->n
b9f0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Op;.    }.  }.. 
ba00: 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e   do{.    i = p->
ba10: 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  pc++;.  }while( 
ba20: 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70  i<nRow && p->exp
ba30: 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f  lain==2 && p->aO
ba40: 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f  p[i].opcode!=OP_
ba50: 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28  Explain );.  if(
ba60: 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20   i>=nRow ){.    
ba70: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
ba80: 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
ba90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
baa0: 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e   if( db->u1.isIn
bab0: 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20  terrupted ){.   
bac0: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
bad0: 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72  INTERRUPT;.    r
bae0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
baf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
bb00: 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65  eError(p, sqlite
bb10: 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b  3ErrStr(p->rc));
bb20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
bb30: 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20  ar *zP4;.    Op 
bb40: 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c  *pOp;.    if( i<
bb50: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20  p->nOp ){.      
bb60: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69  /* The output li
bb70: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61  ne number is sma
bb80: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77  ll enough that w
bb90: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74  e are still in t
bba0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e  he.      ** main
bbb0: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20   program. */.   
bbc0: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70     pOp = &p->aOp
bbd0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [i];.    }else{.
bbe0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
bbf0: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e  currently listin
bc00: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20  g subprograms.  
bc10: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68  Figure out which
bc20: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a   one and.      *
bc30: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70  * pick up the ap
bc40: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65  propriate opcode
bc50: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  . */.      int j
bc60: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e  ;.      i -= p->
bc70: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  nOp;.      for(j
bc80: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d  =0; i>=apSub[j]-
bc90: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nOp; j++){.    
bca0: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a      i -= apSub[j
bcb0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a  ]->nOp;.      }.
bcc0: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53        pOp = &apS
bcd0: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20  ub[j]->aOp[i];. 
bce0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
bcf0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
bd00: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
bd10: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
bd20: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20   pMem->u.i = i; 
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd50: 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  * Program counte
bd60: 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b  r */.      pMem+
bd70: 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d  +;.  .      pMem
bd80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
bd90: 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d  atic|MEM_Str|MEM
bda0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
bdb0: 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71  m->z = (char*)sq
bdc0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
bdd0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a  pOp->opcode); /*
bde0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20   Opcode */.     
bdf0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
be00: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
be10: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
be20: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
be30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
be40: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
be50: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20        pMem++;.. 
be60: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20       /* When an 
be70: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
be80: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28  e is encounter (
be90: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20  the only opcode 
bea0: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a  that has.      *
beb0: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41  * a P4_SUBPROGRA
bec0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70  M argument), exp
bed0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
bee0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62  the array of sub
bef0: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a  programs.      *
bf00: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65  * kept in p->aMe
bf10: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74  m[9].z to hold t
bf20: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d  he new program -
bf30: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73   assuming this s
bf40: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20  ubprogram.      
bf50: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  ** has not alrea
bf60: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20  dy been seen..  
bf70: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
bf80: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34   pOp->p4type==P4
bf90: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20  _SUBPROGRAM ){. 
bfa0: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
bfb0: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65   = (nSub+1)*size
bfc0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
bfd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
bfe0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
bff0: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20   j<nSub; j++){. 
c000: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53           if( apS
c010: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70  ub[j]==pOp->p4.p
c020: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
c030: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c040: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26     if( j==nSub &
c050: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c  & SQLITE_OK==sql
c060: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28  ite3VdbeMemGrow(
c070: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75  pSub, nByte, nSu
c080: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
c090: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
c0a0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
c0b0: 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  z;.          apS
c0c0: 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70  ub[nSub++] = pOp
c0d0: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20  ->p4.pProgram;. 
c0e0: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66           pSub->f
c0f0: 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62  lags |= MEM_Blob
c100: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62  ;.          pSub
c110: 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f  ->n = nSub*sizeo
c120: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
c130: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c140: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65  }.    }..    pMe
c150: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c160: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
c170: 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20  i = pOp->p1;    
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20        /* P1 */. 
c1a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c1b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c1c0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
c1d0: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20  >u.i = pOp->p2; 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a           /* P2 *
c200: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
c210: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c220: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d   MEM_Int;.    pM
c230: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70  em->u.i = pOp->p
c240: 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3;              
c250: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c260: 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  3 */.    pMem++;
c270: 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ..    if( sqlite
c280: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
c290: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30  Resize(pMem, 100
c2a0: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ) ){ /* P4 */.  
c2b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c2c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c2d0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c2e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
c2f0: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
c300: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
c310: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20  M_Term;.    zP4 
c320: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
c330: 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e   pMem->z, pMem->
c340: 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  szMalloc);.    i
c350: 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20  f( zP4!=pMem->z 
c360: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c370: 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d  VdbeMemSetStr(pM
c380: 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c  em, zP4, -1, SQL
c390: 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20  ITE_UTF8, 0);.  
c3a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
c3b0: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
c3c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
c3d0: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
c3e0: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
c3f0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
c400: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
c410: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a    }.    pMem++;.
c420: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
c430: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
c440: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c450: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
c460: 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20  (pMem, 4) ){.   
c470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c480: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c490: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
c4a0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
c4b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c4c0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c4d0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c4e0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32       pMem->n = 2
c4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
c500: 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d  snprintf(3, pMem
c510: 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70  ->z, "%.2x", pOp
c520: 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a  ->p5);   /* P5 *
c530: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  /.      pMem->en
c540: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c550: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
c560: 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
c570: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
c580: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66  OMMENTS.      if
c590: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
c5a0: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
c5b0: 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20  Mem, 500) ){.   
c5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
c5d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c5e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
c5f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
c600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
c610: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c620: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
c630: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64       pMem->n = d
c640: 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f  isplayComment(pO
c650: 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c  p, zP4, pMem->z,
c660: 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65   500);.      pMe
c670: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
c680: 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20  UTF8;.#else.    
c690: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c6a0: 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20  MEM_Null;       
c6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6c0: 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65  /* Comment */.#e
c6d0: 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
c6e0: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20  p->nResColumn = 
c6f0: 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69  8 - 4*(p->explai
c700: 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65  n-1);.    p->pRe
c710: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d  sultSet = &p->aM
c720: 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63  em[1];.    p->rc
c730: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c740: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f    rc = SQLITE_RO
c750: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  W;.  }.  return 
c760: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
c770: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
c780: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  AIN */..#ifdef S
c790: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
c7a0: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20  * Print the SQL 
c7b0: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f  that was used to
c7c0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45   generate a VDBE
c7d0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69   program..*/.voi
c7e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69  d sqlite3VdbePri
c7f0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ntSql(Vdbe *p){.
c800: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
c810: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53  = 0;.  if( p->zS
c820: 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d  ql ){.    z = p-
c830: 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69  >zSql;.  }else i
c840: 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a  f( p->nOp>=1 ){.
c850: 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70      const VdbeOp
c860: 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b   *pOp = &p->aOp[
c870: 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  0];.    if( pOp-
c880: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
c890: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
c8a0: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f   ){.      z = pO
c8b0: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77  p->p4.z;.      w
c8c0: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
c8d0: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a  pace(*z) ) z++;.
c8e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c8f0: 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a  z ) printf("SQL:
c900: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a   [%s]\n", z);.}.
c910: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
c920: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
c930: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
c940: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
c950: 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20  _IOTRACE)./*.** 
c960: 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45  Print an IOTRACE
c970: 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67   message showing
c980: 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   SQL content..*/
c990: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c9a0: 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65  eIOTraceSql(Vdbe
c9b0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20   *p){.  int nOp 
c9c0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65  = p->nOp;.  Vdbe
c9d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73  Op *pOp;.  if( s
c9e0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30  qlite3IoTrace==0
c9f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
ca00: 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b   nOp<1 ) return;
ca10: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  .  pOp = &p->aOp
ca20: 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e  [0];.  if( pOp->
ca30: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
ca40: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
ca50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
ca60: 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30  .    char z[1000
ca70: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
ca80: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
ca90: 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d  ), z, "%s", pOp-
caa0: 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28  >p4.z);.    for(
cab0: 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70  i=0; sqlite3Issp
cac0: 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b  ace(z[i]); i++){
cad0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  }.    for(j=0; z
cae0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
caf0: 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70   if( sqlite3Issp
cb00: 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20  ace(z[i]) ){.   
cb10: 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21       if( z[i-1]!
cb20: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
cb30: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a    z[j++] = ' ';.
cb40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
cb60: 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20  [j++] = z[i];.  
cb70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
cb80: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  z[j] = 0;.    sq
cb90: 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51  lite3IoTrace("SQ
cba0: 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d  L %s\n", z);.  }
cbb0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
cbc0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20  LITE_OMIT_TRACE 
cbd0: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
cbe0: 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20  _IOTRACE */../* 
cbf0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
cc00: 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72  his object descr
cc10: 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  ibes bulk memory
cc20: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
cc30: 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70  se.** by subcomp
cc40: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70  onents of a prep
cc50: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
cc60: 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61   Space is alloca
cc70: 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20  ted out.** of a 
cc80: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62  ReusableSpace ob
cc90: 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f  ject by the allo
cca0: 63 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  cSpace() routine
ccb0: 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63   below..*/.struc
ccc0: 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  t ReusableSpace 
ccd0: 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20  {.  u8 *pSpace; 
cce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69           /* Avai
ccf0: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  lable memory */.
cd00: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
cd10: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
cd20: 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d  of available mem
cd30: 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  ory */.  int nNe
cd40: 65 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  eded;         /*
cd50: 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61   Total bytes tha
cd60: 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  t could not be a
cd70: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a  llocated */.};..
cd80: 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61  /* Try to alloca
cd90: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
cda0: 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
cdb0: 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72   bulk memory for
cdc0: 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68   pBuf.** from th
cdd0: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  e ReusableSpace 
cde0: 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20  object.  Return 
cdf0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
ce00: 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65   allocated.** me
ce10: 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e  mory on success.
ce20: 20 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e    If insufficien
ce30: 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  t memory is avai
ce40: 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20  lable in the.** 
ce50: 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62  ReusableSpace ob
ce60: 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74  ject, increase t
ce70: 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  he ReusableSpace
ce80: 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75  .nNeeded.** valu
ce90: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
cea0: 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72  needed and retur
ceb0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
cec0: 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69   pBuf is not ini
ced0: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61  tially NULL, tha
cee0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
cef0: 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65   memory has alre
cf00: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  ady.** been allo
cf10: 63 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  cated by a prior
cf20: 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
cf30: 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72  utine, so just r
cf40: 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20  eturn a copy.** 
cf50: 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76  of pBuf and leav
cf60: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  e ReusableSpace 
cf70: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
cf80: 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20   This allocator 
cf90: 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72  is employed to r
cfa0: 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20  epurpose unused 
cfb0: 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64  slots at the end
cfc0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64   of the.** opcod
cfd0: 65 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61  e array of prepa
cfe0: 72 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74  red state for ot
cff0: 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73  her memory needs
d000: 20 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64   of the prepared
d010: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  .** statement..*
d020: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61  /.static void *a
d030: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72  llocSpace(.  str
d040: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
d050: 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d  e *p,  /* Bulk m
d060: 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20  emory available 
d070: 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  for allocation *
d080: 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72   Pointer to a pr
d0b0: 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a  ior allocation *
d0c0: 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20  /.  int nByte   
d0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d0e0: 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   Bytes of memory
d0f0: 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20   needed */.){.  
d100: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
d110: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e  TE_ALIGNMENT(p->
d120: 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28  pSpace) );.  if(
d130: 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pBuf==0 ){.    
d140: 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e  nByte = ROUND8(n
d150: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Byte);.    if( n
d160: 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65  Byte <= p->nFree
d170: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72   ){.      p->nFr
d180: 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ee -= nByte;.   
d190: 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53     pBuf = &p->pS
d1a0: 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a  pace[p->nFree];.
d1b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d1c0: 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e   p->nNeeded += n
d1d0: 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Byte;.    }.  }.
d1e0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
d1f0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
d200: 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  Buf) );.  return
d210: 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pBuf;.}../*.** 
d220: 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20  Rewind the VDBE 
d230: 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69  back to the begi
d240: 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61  nning in prepara
d250: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e  tion for.** runn
d260: 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ing it..*/.void 
d270: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d280: 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20  d(Vdbe *p){.#if 
d290: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
d2a0: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
d2b0: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20  (VDBE_PROFILE). 
d2c0: 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20   int i;.#endif. 
d2d0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
d2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
d2f0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
d300: 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  INIT );..  /* Th
d310: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74  ere should be at
d320: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64   least one opcod
d330: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
d340: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20  ( p->nOp>0 );.. 
d350: 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69   /* Set the magi
d360: 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f  c to VDBE_MAGIC_
d370: 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  RUN sooner rathe
d380: 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f  r than later. */
d390: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
d3a0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23  BE_MAGIC_RUN;..#
d3b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
d3c0: 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  UG.  for(i=1; i<
d3d0: 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20  p->nMem; i++){. 
d3e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d     assert( p->aM
d3f0: 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20  em[i].db==p->db 
d400: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
d410: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d  p->pc = -1;.  p-
d420: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
d430: 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  .  p->errorActio
d440: 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
d450: 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
d460: 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20    p->cacheCtr = 
d470: 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65  1;.  p->minWrite
d480: 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35  FileFormat = 255
d490: 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  ;.  p->iStatemen
d4a0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43  t = 0;.  p->nFkC
d4b0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23  onstraint = 0;.#
d4c0: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
d4d0: 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  LE.  for(i=0; i<
d4e0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
d4f0: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20    p->aOp[i].cnt 
d500: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  = 0;.    p->aOp[
d510: 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20  i].cycles = 0;. 
d520: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
d530: 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72  ** Prepare a vir
d540: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72  tual machine for
d550: 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74   execution for t
d560: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66  he first time af
d570: 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20  ter.** creating 
d580: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
d590: 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c  ine.  This invol
d5a0: 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a  ves things such.
d5b0: 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67  ** as allocating
d5c0: 20 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69   registers and i
d5d0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
d5e0: 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e  program counter.
d5f0: 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44  .** After the VD
d600: 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65  BE has be preppe
d610: 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65  d, it can be exe
d620: 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20  cuted by one or 
d630: 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f  more.** calls to
d640: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
d650: 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ().  .**.** This
d660: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65   function may be
d670: 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20   called exactly 
d680: 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72  once on each vir
d690: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
d6a0: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d6b0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
d6c0: 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70  e VM has been "p
d6d0: 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20  ackaged" and is 
d6e0: 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e  ready.** to run.
d6f0: 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75    After this rou
d700: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
d710: 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f  further calls to
d720: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
d730: 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e  AddOp() function
d740: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
d750: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d760: 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74  disconnects.** t
d770: 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65  he Vdbe from the
d780: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68   Parse object th
d790: 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61  at helped genera
d7a0: 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  te it so that th
d7b0: 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65  e.** the Vdbe be
d7c0: 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e  comes an indepen
d7d0: 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20  dent entity and 
d7e0: 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74  the Parse object
d7f0: 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72   can be.** destr
d800: 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  oyed..**.** Use 
d810: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
d820: 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72  ewind() procedur
d830: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76  e to restore a v
d840: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
d850: 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e  ack.** to its in
d860: 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65  itial state afte
d870: 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75  r it has been ru
d880: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
d890: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
d8a0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
d8d0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d900: 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  text */.){.  sql
d910: 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
d920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d930: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
d940: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
d950: 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20  nVar;           
d960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d970: 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65  mber of paramete
d980: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d  rs */.  int nMem
d990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d9a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d9b0: 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65   of VM memory re
d9c0: 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  gisters */.  int
d9d0: 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20   nCursor;       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d9f0: 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
da00: 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
da10: 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
da30: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
da40: 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72  ents in subprogr
da50: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e  ams */.  int nOn
da60: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
da70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
da80: 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73  r of OP_Once ins
da90: 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  tructions */.  i
daa0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dac0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
dad0: 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62  .  struct Reusab
dae0: 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20  leSpace x;      
daf0: 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75    /* Reusable bu
db00: 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20  lk memory */..  
db10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
db20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
db30: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
db40: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
db50: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
db60: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
db70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
db80: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
db90: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
dba0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
dbb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
dbc0: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
dbd0: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
dbe0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
dbf0: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
dc00: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
dc10: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
dc20: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
dc30: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
dc40: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
dc50: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
dc60: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
dc70: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
dc80: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
dc90: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
dca0: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
dcb0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
dcc0: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
dcd0: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
dce0: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
dcf0: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
dd00: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
dd10: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
dd20: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
dd30: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
dd40: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
dd50: 6f 72 79 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62  ory for.  ** Vdb
dd60: 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72  eCursor/BtCursor
dd70: 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65   structures. The
dd80: 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20   blob of memory 
dd90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
dda0: 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69  .  ** cursor 0 i
ddb0: 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
ddc0: 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65  ry cell nMem. Me
ddd0: 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d  mory cell (nMem-
dde0: 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  1).  ** stores t
ddf0: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
de00: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
de10: 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e  h cursor 1, etc.
de20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61  .  **.  ** See a
de30: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72  lso: allocateCur
de40: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d  sor()..  */.  nM
de50: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a  em += nCursor;..
de60: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
de70: 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c  how much reusabl
de80: 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  e memory is avai
de90: 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64  lable at the end
dea0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63   of the.  ** opc
deb0: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
dec0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69   extra memory wi
ded0: 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ll be reallocate
dee0: 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d  d for other elem
def0: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
df00: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
df10: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  ent..  */.  n = 
df20: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
df30: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
df40: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
df50: 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72   of opcode memor
df60: 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53  y used */.  x.pS
df70: 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d  pace = &((u8*)p-
df80: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
df90: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
dfa0: 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  d opcode memory 
dfb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  */.  assert( EIG
dfc0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
dfd0: 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20  T(x.pSpace) );. 
dfe0: 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44   x.nFree = ROUND
dff0: 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a  DOWN8(pParse->sz
e000: 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f  OpAlloc - n);  /
e010: 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65  * Bytes of unuse
e020: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  d memory */.  as
e030: 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30  sert( x.nFree>=0
e040: 20 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72 65   );.  if( x.nFre
e050: 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  e>0 ){.    memse
e060: 74 28 78 2e 70 53 70 61 63 65 2c 20 30 2c 20 78  t(x.pSpace, 0, x
e070: 2e 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73  .nFree);.    ass
e080: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
e090: 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
e0a0: 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
e0b0: 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50  .  }..  resolveP
e0c0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
e0d0: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
e0e0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
e0f0: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
e100: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
e110: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
e120: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
e130: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
e140: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
e150: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
e160: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
e170: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
e180: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
e190: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
e1a0: 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74  ated in one or t
e1b0: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
e1c0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
e1d0: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
e1e0: 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72  use unused memor
e1f0: 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  y at the .  ** e
e200: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
e210: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
e220: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
e230: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
e240: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
e250: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
e260: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
e270: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
e280: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
e290: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
e2a0: 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61  emainder using a
e2b0: 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c   fresh memory al
e2c0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
e2d0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
e2e0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
e2f0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
e300: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
e310: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
e320: 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72  e leftover memor
e330: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
e340: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
e350: 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e  .  This can sign
e360: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
e370: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
e380: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
e390: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
e3a0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
e3b0: 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64  do {.    x.nNeed
e3c0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  ed = 0;.    p->a
e3d0: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
e3e0: 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  (&x, p->aMem, nM
e3f0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  em*sizeof(Mem));
e400: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
e410: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
e420: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
e430: 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d  of(Mem));.    p-
e440: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
e450: 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67  ace(&x, p->apArg
e460: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
e470: 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  m*));.    p->apC
e480: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
e490: 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43  &x, p->apCsr, nC
e4a0: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
e4b0: 65 43 75 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20  eCursor*));.    
e4c0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
e4d0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
e4e0: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
e4f0: 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
e500: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
e510: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e  ANSTATUS.    p->
e520: 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70  anExec = allocSp
e530: 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65  ace(&x, p->anExe
e540: 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  c, p->nOp*sizeof
e550: 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
e560: 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64     if( x.nNeeded
e570: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e580: 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70   x.pSpace = p->p
e590: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
e5a0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78  MallocZero(db, x
e5b0: 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
e5c0: 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
e5d0: 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64  ed;.  }while( !d
e5e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e5f0: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
e600: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
e610: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
e620: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
e630: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
e640: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
e650: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
e660: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
e670: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
e680: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
e690: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
e6a0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
e6b0: 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70  }.  p->nzVar = p
e6c0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
e6d0: 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72 73  p->azVar = pPars
e6e0: 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61 72  e->azVar;.  pPar
e6f0: 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a  se->nzVar =  0;.
e700: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
e710: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  = 0;.  if( p->aM
e720: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
e730: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
e740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
e750: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
e760: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
e770: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e790: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
e7a0: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
e7b0: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
e7c0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e7d0: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
e7e0: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
e7f0: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
e800: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
e810: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
e820: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
e830: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
e840: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
e850: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
e860: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
e870: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
e880: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
e890: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
e8a0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
e8b0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
e8c0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
e8d0: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
e8e0: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
e8f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e900: 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
e910: 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65  pBt==0 || pCx->e
e920: 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
e930: 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74  _BTREE );.  swit
e940: 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70  ch( pCx->eCurTyp
e950: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55  e ){.    case CU
e960: 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a  RTYPE_SORTER: {.
e970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e980: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
e990: 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20  db, pCx);.      
e9a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e9b0: 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54   case CURTYPE_BT
e9c0: 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  REE: {.      if(
e9d0: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
e9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e9f0: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
ea00: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
ea10: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
ea20: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
ea30: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
ea40: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
ea50: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
ea60: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
ea70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
ea80: 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
ea90: 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
eaa0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
eab0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
eac0: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
ead0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
eae0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
eaf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
eb00: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
eb10: 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
eb20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
eb30: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
eb40: 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
eb50: 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
eb60: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
eb70: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
eb80: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
eb90: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
eba0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
ebb0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
ebc0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
ebd0: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
ebe0: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
ebf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ec00: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
ec10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ec20: 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
ec30: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
ec40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ec50: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
ec60: 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
ec70: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
ec80: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ec90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
eca0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
ecb0: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
ecc0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
ecd0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
ece0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ecf0: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
ed00: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
ed10: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
ed20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ed30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
ed40: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
ed50: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
ed60: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
ed70: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
ed80: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
ed90: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
eda0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
edb0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
edc0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
edd0: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
ede0: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
edf0: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
ee00: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
ee10: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
ee20: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
ee30: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
ee40: 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
ee50: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ee60: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
ee70: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
ee80: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
ee90: 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65  endif.  v->aOnce
eea0: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Flag = pFrame->a
eeb0: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e  OnceFlag;.  v->n
eec0: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
eed0: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->nOnceFlag;.  
eee0: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
eef0: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
ef00: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
ef10: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
ef20: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
ef30: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
ef40: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
ef50: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
ef60: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
ef70: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
ef80: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
ef90: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
efa0: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
efb0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
efc0: 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
efd0: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
efe0: 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71  >nDbChange;.  sq
eff0: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41  lite3VdbeDeleteA
f000: 75 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76  uxData(v->db, &v
f010: 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20  ->pAuxData, -1, 
f020: 30 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74  0);.  v->pAuxDat
f030: 61 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78  a = pFrame->pAux
f040: 44 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e  Data;.  pFrame->
f050: 70 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20  pAuxData = 0;.  
f060: 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70  return pFrame->p
f070: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
f080: 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a  e all cursors..*
f090: 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73  *.** Also releas
f0a0: 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65  e any dynamic me
f0b0: 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65  mory held by the
f0c0: 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e   VM in the Vdbe.
f0d0: 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20  aMem memory .** 
f0e0: 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73  cell array. This
f0f0: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73   is necessary as
f100: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
f110: 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61   array may conta
f120: 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74  in.** pointers t
f130: 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65  o VdbeFrame obje
f140: 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69  cts, which may i
f150: 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70  n turn contain p
f160: 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70  ointers to.** op
f170: 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73  en cursors..*/.s
f180: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
f190: 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20  AllCursors(Vdbe 
f1a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46  *p){.  if( p->pF
f1b0: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
f1c0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20  Frame *pFrame;. 
f1d0: 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d     for(pFrame=p-
f1e0: 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d  >pFrame; pFrame-
f1f0: 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65  >pParent; pFrame
f200: 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74  =pFrame->pParent
f210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f220: 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70  beFrameRestore(p
f230: 46 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70  Frame);.    p->p
f240: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70  Frame = 0;.    p
f250: 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20  ->nFrame = 0;.  
f260: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
f270: 46 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c  Frame==0 );.  cl
f280: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
f290: 65 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  e(p);.  if( p->a
f2a0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
f2b0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
f2c0: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
f2d0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
f2e0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
f2f0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
f300: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
f310: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
f320: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
f330: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
f340: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
f350: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
f360: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
f370: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
f380: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
f390: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
f3a0: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
f3b0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
f3c0: 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61  ->db, &p->pAuxDa
f3d0: 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73  ta, -1, 0);.  as
f3e0: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74  sert( p->pAuxDat
f3f0: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  a==0 );.}../*.**
f400: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d   Clean up the VM
f410: 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20   after a single 
f420: 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  run..*/.static v
f430: 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65  oid Cleanup(Vdbe
f440: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
f450: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69  *db = p->db;..#i
f460: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f470: 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61  G.  /* Execute a
f480: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
f490: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
f4a0: 74 20 74 68 65 20 56 64 62 65 2e 61 70 43 73 72  t the Vdbe.apCsr
f4b0: 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62  [] and .  ** Vdb
f4c0: 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20  e.aMem[] arrays 
f4d0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f4e0: 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a  n cleaned up.  *
f4f0: 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  /.  int i;.  if(
f500: 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28   p->apCsr ) for(
f510: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f  i=0; i<p->nCurso
f520: 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20  r; i++) assert( 
f530: 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29  p->apCsr[i]==0 )
f540: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
f550: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
f560: 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29  i<=p->nMem; i++)
f570: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d   assert( p->aMem
f580: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55  [i].flags==MEM_U
f590: 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a  ndefined );.  }.
f5a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
f5b0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
f5c0: 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
f5d0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e  rrMsg = 0;.  p->
f5e0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
f5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
f600: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c   number of resul
f610: 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77  t columns that w
f620: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
f630: 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73  by this SQL.** s
f640: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69  tatement. This i
f650: 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d  s now set at com
f660: 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65  pile time, rathe
f670: 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a  r than during.**
f680: 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
f690: 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73  e vdbe program s
f6a0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63  o that sqlite3_c
f6b0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61  olumn_count() ca
f6c0: 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f  n.** be called o
f6d0: 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  n an SQL stateme
f6e0: 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65  nt before sqlite
f6f0: 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69  3_step()..*/.voi
f700: 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
f710: 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c  NumCols(Vdbe *p,
f720: 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29   int nResColumn)
f730: 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  {.  Mem *pColNam
f740: 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  e;.  int n;.  sq
f750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f760: 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d  b;..  releaseMem
f770: 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d  Array(p->aColNam
f780: 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e  e, p->nResColumn
f790: 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73  *COLNAME_N);.  s
f7a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f7b0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20   p->aColName);. 
f7c0: 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a   n = nResColumn*
f7d0: 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e  COLNAME_N;.  p->
f7e0: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31  nResColumn = (u1
f7f0: 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20  6)nResColumn;.  
f800: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43  p->aColName = pC
f810: 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73  olName = (Mem*)s
f820: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
f830: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65  ro(db, sizeof(Me
f840: 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d  m)*n );.  if( p-
f850: 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72  >aColName==0 ) r
f860: 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20  eturn;.  while( 
f870: 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70  n-- > 0 ){.    p
f880: 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d  ColName->flags =
f890: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70   MEM_Null;.    p
f8a0: 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d  ColName->db = p-
f8b0: 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  >db;.    pColNam
f8c0: 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e++;.  }.}../*.*
f8d0: 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f  * Set the name o
f8e0: 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c  f the idx'th col
f8f0: 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e  umn to be return
f900: 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74  ed by the SQL st
f910: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d  atement..** zNam
f920: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e  e must be a poin
f930: 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72  ter to a nul ter
f940: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a  minated string..
f950: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
f960: 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74  must be made aft
f970: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
f980: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
f990: 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ls()..**.** The 
f9a0: 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c  final parameter,
f9b0: 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f   xDel, must be o
f9c0: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e  ne of SQLITE_DYN
f9d0: 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41  AMIC, SQLITE_STA
f9e0: 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45  TIC.** or SQLITE
f9f0: 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69  _TRANSIENT. If i
fa00: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41  t is SQLITE_DYNA
fa10: 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75  MIC, then the bu
fa20: 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20  ffer pointed.** 
fa30: 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c  to by zName will
fa40: 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c   be freed by sql
fa50: 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65  ite3DbFree() whe
fa60: 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65  n the vdbe is de
fa70: 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20  stroyed..*/.int 
fa80: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
fa90: 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70  lName(.  Vdbe *p
faa0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62            /* Vdb
fac0: 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72  e being configur
fad0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c  ed */.  int idx,
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
fb00: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d  x of column zNam
fb10: 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a  e applies to */.
fb20: 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20    int var,      
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
fb50: 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74   COLNAME_* const
fb60: 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ants */.  const 
fb70: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
fb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
fb90: 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
fba0: 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20  containing name 
fbb0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  */.  void (*xDel
fbc0: 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20  )(void*)        
fbd0: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
fbe0: 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74  management strat
fbf0: 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f  egy for zName */
fc00: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
fc10: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
fc20: 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e   assert( idx<p->
fc30: 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20  nResColumn );.  
fc40: 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e  assert( var<COLN
fc50: 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70  AME_N );.  if( p
fc60: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
fc70: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
fc80: 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c  ( !zName || xDel
fc90: 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  !=SQLITE_DYNAMIC
fca0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
fcb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
fcc0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
fcd0: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29  p->aColName!=0 )
fce0: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26  ;.  pColName = &
fcf0: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78  (p->aColName[idx
fd00: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75  +var*p->nResColu
fd10: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  mn]);.  rc = sql
fd20: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
fd30: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d  r(pColName, zNam
fd40: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
fd50: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73  F8, xDel);.  ass
fd60: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a  ert( rc!=0 || !z
fd70: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d  Name || (pColNam
fd80: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72  e->flags&MEM_Ter
fd90: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  m)!=0 );.  retur
fda0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
fdb0: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
fdc0: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f  ransaction may o
fdd0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74  r may not be act
fde0: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20  ive on database 
fdf0: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66  handle.** db. If
fe00: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
fe10: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74  s active, commit
fe20: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73   it. If there is
fe30: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e   a.** write-tran
fe40: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67  saction spanning
fe50: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64   more than one d
fe60: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
fe70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61  is routine.** ta
fe80: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20  kes care of the 
fe90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74  master journal t
fea0: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74  rickery..*/.stat
feb0: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69  ic int vdbeCommi
fec0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
fed0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
fee0: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d  ;.  int nTrans =
fef0: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
ff00: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  f databases with
ff10: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65   an active write
ff20: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20  -transaction.   
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64  ** that are cand
ff50: 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f  idates for a two
ff60: 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73  -phase commit us
ff70: 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20  ing a.          
ff80: 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74           ** mast
ff90: 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  er-journal */.  
ffa0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
ffb0: 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63  OK;.  int needXc
ffc0: 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64  ommit = 0;..#ifd
ffd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ffe0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a  IRTUALTABLE.  /*
fff0: 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f   With this optio
10000 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79  n, sqlite3VtabSy
10010 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20  nc() is defined 
10020 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20  to be simply .  
10030 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20  ** SQLITE_OK so 
10040 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a  p is not used. .
10050 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41    */.  UNUSED_PA
10060 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64  RAMETER(p);.#end
10070 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20  if..  /* Before 
10080 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
10090 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53  lse, call the xS
100a0 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66  ync() callback f
100b0 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74  or any.  ** virt
100c0 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65  ual module table
100d0 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69  s written in thi
100e0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  s transaction. T
100f0 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  his has to.  ** 
10100 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64  be done before d
10110 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68  etermining wheth
10120 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  er a master jour
10130 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  nal file is .  *
10140 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61  * required, as a
10150 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  n xSync() callba
10160 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74  ck may add an at
10170 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a  tached database.
10180 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e    ** to the tran
10190 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
101a0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
101b0 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20  Sync(db, p);..  
101c0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74  /* This loop det
101d0 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74  ermines (a) if t
101e0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73  he commit hook s
101f0 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64  hould be invoked
10200 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f   and.  ** (b) ho
10210 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20  w many database 
10220 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20  files have open 
10230 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
10240 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e  ns, not .  ** in
10250 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70  cluding the temp
10260 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69   database. (b) i
10270 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61  s important beca
10280 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e  use if more than
10290 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62   .  ** one datab
102a0 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  ase file has an 
102b0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
102c0 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72  action, a master
102d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
102e0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66  le is required f
102f0 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d  or an atomic com
10300 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72  mit..  */ .  for
10310 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10320 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10330 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72  ; i++){ .    Btr
10340 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
10350 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
10360 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
10370 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
10380 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
10390 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61   or not a databa
103a0 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20  se might need a 
103b0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64  master journal d
103c0 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20  epends upon.    
103d0 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c    ** its journal
103e0 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68   mode (among oth
103f0 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69  er things).  Thi
10400 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69  s matrix determi
10410 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20  nes which.      
10420 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73  ** journal modes
10430 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f   use a master jo
10440 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20  urnal and which 
10450 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20  do not */.      
10460 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
10470 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a  aMJNeeded[] = {.
10480 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54          /* DELET
10490 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20  E   */  1,.     
104a0 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20     /* PERSIST   
104b0 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
104c0 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c   OFF       */ 0,
104d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e  .        /* TRUN
104e0 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20  CATE  */ 1,.    
104f0 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20      /* MEMORY   
10500 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f   */ 0,.        /
10510 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30  * WAL       */ 0
10520 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
10530 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
10540 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69   /* Pager associ
10550 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f  ated with pBt */
10560 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d  .      needXcomm
10570 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  it = 1;.      sq
10580 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10590 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67  pBt);.      pPag
105a0 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
105b0 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
105c0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
105d0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ].safety_level!=
105e0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
105f0 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20  S_OFF.       && 
10600 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65  aMJNeeded[sqlite
10610 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c  3PagerGetJournal
10620 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20  Mode(pPager)].  
10630 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20      ){ .        
10640 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a  assert( i!=1 );.
10650 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b          nTrans++
10660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10670 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10680 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70  rExclusiveLock(p
10690 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71  Pager);.      sq
106a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
106b0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
106c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
106d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
106e0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
106f0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
10700 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
10710 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f  ons at all, invo
10720 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  ke the commit ho
10730 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64  ok */.  if( need
10740 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78  Xcommit && db->x
10750 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29  CommitCallback )
10760 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78  {.    rc = db->x
10770 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64  CommitCallback(d
10780 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a  b->pCommitArg);.
10790 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
107a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
107b0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
107c0 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  MITHOOK;.    }. 
107d0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d   }..  /* The sim
107e0 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f  ple case - no mo
107f0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61  re than one data
10800 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63  base file (not c
10810 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a  ounting the.  **
10820 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20   TEMP database) 
10830 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  has a transactio
10840 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72  n active.   Ther
10850 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72  e is no need for
10860 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72   the.  ** master
10870 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20  -journal..  **. 
10880 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72   ** If the retur
10890 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74  n value of sqlit
108a0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
108b0 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c  me() is a zero l
108c0 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e  ength.  ** strin
108d0 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  g, it means the 
108e0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
108f0 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74   :memory: or a t
10900 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20  emp file.  In . 
10910 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65   ** that case we
10920 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
10930 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c  atomic multi-fil
10940 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73  e commits, so us
10950 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70  e the .  ** simp
10960 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f  le case then too
10970 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
10980 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10990 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
109a0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
109b0 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e  0].pBt)).   || n
109c0 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20  Trans<=1.  ){.  
109d0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
109e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
109f0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10a00 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10a10 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10a20 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10a30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10a40 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10a50 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29  PhaseOne(pBt, 0)
10a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10a70 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
10a80 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c  ommit only if al
10a90 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63  l databases succ
10aa0 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74  essfully complet
10ab0 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20  e phase 1. .    
10ac0 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  ** If one of the
10ad0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
10ae0 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69  eOne() calls fai
10af0 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ls, this indicat
10b00 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20  es an.    ** IO 
10b10 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65  error while dele
10b20 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
10b30 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
10b40 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c  e. It is unlikel
10b50 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f  y,.    ** but co
10b60 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74  uld happen. In t
10b70 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e  his case abandon
10b80 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
10b90 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
10ba0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
10bb0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10bc0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
10be0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10bf0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10c00 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10c20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10c30 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  Two(pBt, 0);.   
10c40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
10c50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10c60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10c70 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b  3VtabCommit(db);
10c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10c90 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73   The complex cas
10ca0 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d  e - There is a m
10cb0 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d  ulti-file write-
10cc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
10cd0 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65  ve..  ** This re
10ce0 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20  quires a master 
10cf0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
10d00 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73  ensure the trans
10d10 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  action is.  ** c
10d20 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61  ommitted atomica
10d30 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  lly..  */.#ifnde
10d40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  f SQLITE_OMIT_DI
10d50 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20  SKIO.  else{.   
10d60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
10d70 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20  fs = db->pVfs;. 
10d80 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
10d90 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d   = 0;   /* File-
10da0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73  name for the mas
10db0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter journal */. 
10dc0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
10dd0 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74  MainFile = sqlit
10de0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
10df0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
10e00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
10e10 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20  file *pMaster = 
10e20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  0;.    i64 offse
10e30 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72  t = 0;.    int r
10e40 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72  es;.    int retr
10e50 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  yCount = 0;.    
10e60 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a  int nMainFile;..
10e70 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20      /* Select a 
10e80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10e90 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ile name */.    
10ea0 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  nMainFile = sqli
10eb0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69  te3Strlen30(zMai
10ec0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73  nFile);.    zMas
10ed0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ter = sqlite3MPr
10ee0 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58  intf(db, "%s-mjX
10ef0 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69  XXXXX9XXz", zMai
10f00 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  nFile);.    if( 
10f10 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74  zMaster==0 ) ret
10f20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10f30 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a  _BKPT;.    do {.
10f40 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
10f50 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
10f60 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
10f70 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10f80 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
10f90 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10fa0 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
10fb0 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
10fc0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
10fd0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10fe0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10ff0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
11000 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
11010 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
11020 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
11030 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
11040 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
11050 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
11060 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
11070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
11080 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
11090 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
110a0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
110b0 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
110c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
110d0 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
110e0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
110f0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
11100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
11130 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
11140 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
11150 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
11160 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
11170 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11180 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
11190 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
111a0 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
111b0 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
111c0 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
111d0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
111e0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
111f0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
11200 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
11210 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
11220 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
11230 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11250 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
11260 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
11270 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
11280 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
11290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
112a0 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
112b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
112c0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
112d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
112e0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
112f0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
11300 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
11310 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
11320 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
11330 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
11340 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11350 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
11360 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
11370 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
11380 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
11390 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
113a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
113b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
113c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
113d0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
113e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
113f0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
11400 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
11410 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11420 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
11430 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
11440 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
11450 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
11460 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
11470 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
11480 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
11490 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
114a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
114b0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
114c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
114d0 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
114e0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
114f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11500 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
11510 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
11520 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
11530 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
11540 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
11550 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11560 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
11570 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11580 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11590 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
115a0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
115b0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
115c0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
115d0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
115e0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
115f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
11600 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
11610 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
11620 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
11630 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
11640 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
11650 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
11660 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
11670 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
11680 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
11690 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73  Master, zFile, s
116a0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
116b0 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29  File)+1, offset)
116c0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74  ;.        offset
116d0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
116e0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20  n30(zFile)+1;.  
116f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11710 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11720 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11730 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11740 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
11750 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
11760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11770 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11780 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
117a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
117b0 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  }..    /* Sync t
117c0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
117d0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49  l file. If the I
117e0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
117f0 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c  device.    ** fl
11800 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69  ag is set this i
11810 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a  s not required..
11820 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30      */.    if( 0
11830 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
11840 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
11850 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
11860 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
11870 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
11880 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
11890 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
118a0 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
118b0 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
118c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
118d0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
118e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
118f0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11900 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11910 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11920 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11930 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11940 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
11950 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
11960 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
11970 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
11980 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
11990 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
119a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
119b0 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
119c0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
119d0 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
119e0 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
119f0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
11a00 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11a10 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
11a20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
11a30 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11a40 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
11a50 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
11a60 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11a70 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
11a80 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
11a90 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
11aa0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11ab0 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
11ac0 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
11ad0 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
11ae0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
11af0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11b00 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
11b10 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
11b20 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
11b30 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
11b40 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
11b50 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11b60 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11b70 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
11b80 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
11b90 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11ba0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11bb0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11bd0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11be0 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
11bf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c00 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11c10 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11c20 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
11c30 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
11c40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11c60 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11c70 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11c80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11c90 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
11ca0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11cb0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11cc0 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
11cd0 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
11ce0 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
11cf0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
11d00 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
11d10 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
11d20 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
11d30 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
11d40 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
11d50 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11d60 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11d70 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20  zMaster, 1);.   
11d80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11d90 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11da0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
11db0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
11dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11dd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66   }..    /* All f
11de0 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f  iles and directo
11df0 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ries have alread
11e00 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73  y been synced, s
11e10 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  o the following.
11e20 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
11e30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
11e40 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65  itPhaseTwo() are
11e50 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69   only closing fi
11e60 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  les and.    ** d
11e70 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  eleting or trunc
11e80 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20  ating journals. 
11e90 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  If something goe
11ea0 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20  s wrong while.  
11eb0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70    ** this is hap
11ec0 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20  pening we don't 
11ed0 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65  really care. The
11ee0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
11ef0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
11f00 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
11f10 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20  guaranteed, but 
11f20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64  some stray 'cold
11f30 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a  ' journals.    *
11f40 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61  * may be lying a
11f50 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67  round. Returning
11f60 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77   an error code w
11f70 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72  on't help matter
11f80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69  s..    */.    di
11f90 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11fa0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
11fb0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
11fc0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
11fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11fe0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11ff0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12000 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12010 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12020 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
12030 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
12040 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20  wo(pBt, 1);.    
12050 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
12060 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
12070 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62  lloc();.    enab
12080 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12090 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73  errors();..    s
120a0 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
120b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
120c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
120d0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ../* .** This ro
120e0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61  utine checks tha
120f0 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56  t the sqlite3.nV
12100 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20  dbeActive count 
12110 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63  variable.** matc
12120 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hes the number o
12130 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20  f vdbe's in the 
12140 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64  list sqlite3.pVd
12150 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63  be that are.** c
12160 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e  urrently active.
12170 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
12180 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63  ils if the two c
12190 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74  ounts do not mat
121a0 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ch..** This is a
121b0 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d  n internal self-
121c0 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20  check only - it 
121d0 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74  is not an essent
121e0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a  ial processing.*
121f0 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  * step..**.** Th
12200 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
12210 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e   NDEBUG is defin
12220 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ed..*/.#ifndef N
12230 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69  DEBUG.static voi
12240 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62  d checkActiveVdb
12250 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eCnt(sqlite3 *db
12260 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
12270 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
12280 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20  nt nWrite = 0;. 
12290 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a   int nRead = 0;.
122a0 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b    p = db->pVdbe;
122b0 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
122c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
122d0 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65  tmt_busy((sqlite
122e0 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20  3_stmt*)p) ){.  
122f0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
12300 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79   if( p->readOnly
12310 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a  ==0 ) nWrite++;.
12320 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73        if( p->bIs
12330 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b  Reader ) nRead++
12340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20  ;.    }.    p = 
12350 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
12360 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d  assert( cnt==db-
12370 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a  >nVdbeActive );.
12380 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
12390 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ==db->nVdbeWrite
123a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52   );.  assert( nR
123b0 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ead==db->nVdbeRe
123c0 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64  ad );.}.#else.#d
123d0 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76  efine checkActiv
123e0 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64  eVdbeCnt(x).#end
123f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
12400 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
12410 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
12420 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74  nt opened a stat
12430 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
12440 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e  n,.** close it n
12450 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70  ow. Argument eOp
12460 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12470 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12480 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49  CK or.** SAVEPOI
12490 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69  NT_RELEASE. If i
124a0 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
124b0 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68  OLLBACK, then th
124c0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74  e statement.** t
124d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
124e0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f  lled back. If eO
124f0 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  p is SAVEPOINT_R
12500 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65  ELEASE, then the
12510 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74   .** statement t
12520 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
12530 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
12540 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
12550 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f  curs, an SQLITE_
12560 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
12570 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
12580 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  . .** Otherwise 
12590 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
125a0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  t sqlite3VdbeClo
125b0 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65  seStatement(Vdbe
125c0 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20   *p, int eOp){. 
125d0 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20   sqlite3 *const 
125e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
125f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12600 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53  ;..  /* If p->iS
12610 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61  tatement is grea
12620 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
12630 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70  hen this Vdbe op
12640 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61  ened a .  ** sta
12650 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12660 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  on that should b
12670 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54  e closed here. T
12680 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f  he only exceptio
12690 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61  n.  ** is that a
126a0 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68  n IO error may h
126b0 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 61  ave occurred, ca
126c0 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e  using an emergen
126d0 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a  cy rollback..  *
126e0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 28  * In this case (
126f0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
12700 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  0), and there is
12710 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a   nothing to do..
12720 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e    */.  if( db->n
12730 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e  Statement && p->
12740 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20  iStatement ){.  
12750 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e    int i;.    con
12760 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  st int iSavepoin
12770 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e  t = p->iStatemen
12780 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t-1;..    assert
12790 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
127a0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70  _ROLLBACK || eOp
127b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
127c0 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ASE);.    assert
127d0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
127e0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
127f0 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d  ( p->iStatement=
12800 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  =(db->nStatement
12810 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  +db->nSavepoint)
12820 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30   );..    for(i=0
12830 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
12840 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63  ){ .      int rc
12850 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
12860 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12870 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12880 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12890 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  ){.        if( e
128a0 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
128b0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
128c0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
128d0 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
128e0 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  pBt, SAVEPOINT_R
128f0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
12900 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
12910 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 3d          if( rc2=
12920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12930 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
12940 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
12950 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
12960 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
12970 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
12980 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
12990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
129a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 72            rc = r
129b0 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
129c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
129d0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d  db->nStatement--
129e0 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d  ;.    p->iStatem
129f0 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  ent = 0;..    if
12a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12a10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70  ){.      if( eOp
12a20 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12a30 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
12a40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
12a50 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
12a60 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12a70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12a90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12aa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
12ab0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
12ac0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
12ad0 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65  T_RELEASE, iSave
12ae0 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
12af0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
12b00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
12b10 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65  ransaction is be
12b20 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  ing rolled back,
12b30 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68   also restore th
12b40 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  e .    ** databa
12b50 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72  se handles defer
12b60 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  red constraint c
12b70 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61  ounter to the va
12b80 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e 20  lue it had when 
12b90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
12ba0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12bb0 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a  n was opened.  *
12bc0 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53  /.    if( eOp==S
12bd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12be0 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  K ){.      db->n
12bf0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70  DeferredCons = p
12c00 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a  ->nStmtDefCons;.
12c10 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
12c20 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e  redImmCons = p->
12c30 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b  nStmtDefImmCons;
12c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12c60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12c70 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
12c80 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
12c90 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61  ed by the databa
12ca0 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73  se .** handle as
12cb0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12cc0 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61  e VM passed as a
12cd0 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62  n argument is ab
12ce0 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f  out to be .** co
12cf0 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72  mmitted. If ther
12d00 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
12d10 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  g deferred forei
12d20 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
12d30 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c  t.** violations,
12d40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12d50 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c  RROR. Otherwise,
12d60 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
12d70 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
12d80 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69  utstanding FK vi
12d90 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69  olations and thi
12da0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
12db0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  ns .** SQLITE_ER
12dc0 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73  ROR, set the res
12dd0 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f  ult of the VM to
12de0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12df0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a  NT_FOREIGNKEY.**
12e00 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72   and write an er
12e10 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69  ror message to i
12e20 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53  t. Then return S
12e30 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
12e40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12e50 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
12e60 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
12e70 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20  heckFk(Vdbe *p, 
12e80 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20  int deferred){. 
12e90 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12ea0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66  ->db;.  if( (def
12eb0 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44  erred && (db->nD
12ec0 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e  eferredCons+db->
12ed0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12ee0 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65  )>0) .   || (!de
12ef0 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b  ferred && p->nFk
12f00 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20  Constraint>0) . 
12f10 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12f20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12f30 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
12f40 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
12f50 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20   = OE_Abort;.   
12f60 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f   sqlite3VdbeErro
12f70 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45  r(p, "FOREIGN KE
12f80 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69  Y constraint fai
12f90 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
12fa0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
12fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
12fd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12fe0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
12ff0 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74  he when a VDBE t
13000 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49  ries to halt.  I
13010 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61  f the VDBE.** ha
13020 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61  s made changes a
13030 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  nd is in autocom
13040 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63  mit mode, then c
13050 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63  ommit those.** c
13060 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f  hanges.  If a ro
13070 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64  llback is needed
13080 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f  , then do the ro
13090 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  llback..**.** Th
130a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
130b0 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f  e only way to mo
130c0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
130d0 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c  a VM from.** SQL
130e0 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f  ITE_MAGIC_RUN to
130f0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
13100 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c  LT.  It is harml
13110 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74  ess to.** call t
13120 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74  his on a VM that
13130 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54   is in the SQLIT
13140 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61  E_MAGIC_HALT sta
13150 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  te..**.** Return
13160 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
13170 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63   If the commit c
13180 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  ould not complet
13190 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20  e because of.** 
131a0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c  lock contention,
131b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
131c0 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f  USY.  If SQLITE_
131d0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
131e0 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  , it.** means th
131f0 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20  e close did not 
13200 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73  happen and needs
13210 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e   to be repeated.
13220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
13230 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29  dbeHalt(Vdbe *p)
13240 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73      /* Used to s
13270 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72  tore transient r
13280 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20  eturn codes */. 
13290 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
132a0 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  ->db;..  /* This
132b0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69   function contai
132c0 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  ns the logic tha
132d0 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  t determines if 
132e0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20  a statement or. 
132f0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13300 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
13310 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
13320 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13330 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69  the.  ** executi
13340 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75  on of this virtu
13350 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a  al machine. .  *
13360 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66  *.  ** If any of
13370 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
13380 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a  rrors occur:.  *
13390 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  *.  **     SQLIT
133a0 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20  E_NOMEM.  **    
133b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20   SQLITE_IOERR.  
133c0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55  **     SQLITE_FU
133d0 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  LL.  **     SQLI
133e0 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a  TE_INTERRUPT.  *
133f0 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20  *.  ** Then the 
13400 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d  internal cache m
13410 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c  ight have been l
13420 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
13430 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74  istent.  ** stat
13440 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  e.  We need to r
13450 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74  ollback the stat
13460 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13470 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20  n, if there is. 
13480 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20   ** one, or the 
13490 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63  complete transac
134a0 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73  tion if there is
134b0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
134c0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
134d0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
134e0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70  cFailed ){.    p
134f0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
13500 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
13510 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  if( p->aOnceFlag
13520 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e   ) memset(p->aOn
13530 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f  ceFlag, 0, p->nO
13540 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73  nceFlag);.  clos
13550 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a  eAllCursors(p);.
13560 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d    if( p->magic!=
13570 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29  VDBE_MAGIC_RUN )
13580 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13590 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68  ITE_OK;.  }.  ch
135a0 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
135b0 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63  (db);..  /* No c
135c0 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63  ommit or rollbac
135d0 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  k needed if the 
135e0 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74  program never st
135f0 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a  arted or if the.
13600 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
13610 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64  nt does not read
13620 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74 61   or write a data
13630 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20  base file.  */. 
13640 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26   if( p->pc>=0 &&
13650 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b   p->bIsReader ){
13660 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20  .    int mrc;   
13670 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72  /* Primary error
13680 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63   code from p->rc
13690 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61   */.    int eSta
136a0 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20  tementOp = 0;.  
136b0 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45    int isSpecialE
136c0 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rror;           
136d0 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20   /* Set to true 
136e0 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20 65  if a 'special' e
136f0 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rror */..    /* 
13700 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20  Lock all btrees 
13710 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61 74  used by the stat
13720 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ement */.    sql
13730 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70 29  ite3VdbeEnter(p)
13740 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
13750 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  for one of the s
13760 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f  pecial errors */
13770 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63  .    mrc = p->rc
13780 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53   & 0xff;.    isS
13790 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72  pecialError = mr
137a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
137b0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49  || mrc==SQLITE_I
137c0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20  OERR.           
137d0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63            || mrc
137e0 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  ==SQLITE_INTERRU
137f0 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54  PT || mrc==SQLIT
13800 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20  E_FULL;.    if( 
13810 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29  isSpecialError )
13820 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
13830 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64  e query was read
13840 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72  -only and the er
13850 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
13860 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20  TE_INTERRUPT, . 
13870 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62       ** no rollb
13880 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79  ack is necessary
13890 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20  . Otherwise, at 
138a0 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e  least a savepoin
138b0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  t .      ** tran
138c0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
138d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72  rolled back to r
138e0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
138f0 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20  ase to a .      
13900 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74  ** consistent st
13910 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ate..      **.  
13920 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74      ** Even if t
13930 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
13940 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73  read-only, it is
13950 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65   important to pe
13960 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61  rform.      ** a
13970 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72   statement or tr
13980 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
13990 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66  ck operation. If
139a0 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20   the error .    
139b0 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68    ** occurred wh
139c0 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ile writing to t
139d0 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d  he journal, sub-
139e0 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62  journal or datab
139f0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
13a00 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20  e as part of an 
13a10 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75  effort to free u
13a20 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73  p cache space (s
13a30 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  ee function.    
13a40 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73    ** pagerStress
13a50 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20  () in pager.c), 
13a60 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  the rollback is 
13a70 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74  required to rest
13a80 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  ore .      ** th
13a90 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e  e pager to a con
13aa0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
13ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13ac0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c  ( !p->readOnly |
13ad0 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e  | mrc!=SQLITE_IN
13ae0 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20  TERRUPT ){.     
13af0 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c     if( (mrc==SQL
13b00 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
13b10 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26  ==SQLITE_FULL) &
13b20 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  & p->usesStmtJou
13b30 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
13b40 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
13b50 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
13b60 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ACK;.        }el
13b70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
13b80 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74   We are forced t
13b90 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20  o roll back the 
13ba0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
13bb0 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67  on. Before doing
13bc0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
13bd0 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65  , abort any othe
13be0 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69  r statements thi
13bf0 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74  s handle current
13c00 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20  ly has active.. 
13c10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
13c20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
13c30 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
13c40 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
13c50 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  CK);.          s
13c60 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
13c70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  oints(db);.     
13c80 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
13c90 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
13ca0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
13cb0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
13cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13cd0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d  /* Check for imm
13ce0 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
13cf0 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a  ey violations. *
13d00 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  /.    if( p->rc=
13d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
13d30 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20  heckFk(p, 0);.  
13d40 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
13d50 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   the auto-commit
13d60 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
13d70 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c   this is the onl
13d80 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20  y active writer 
13d90 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e  .    ** VM, then
13da0 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20   we do either a 
13db0 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
13dc0 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ck of the curren
13dd0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a  t transaction. .
13de0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
13df0 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61  te: This block a
13e00 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20  lso runs if one 
13e10 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
13e20 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20  rrors handled . 
13e30 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20     ** above has 
13e40 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a  occurred. .    *
13e50 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  /.    if( !sqlit
13e60 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29  e3VtabInSync(db)
13e70 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75   .     && db->au
13e80 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26  toCommit .     &
13e90 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  & db->nVdbeWrite
13ea0 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d  ==(p->readOnly==
13eb0 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  0) .    ){.     
13ec0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
13ed0 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72  TE_OK || (p->err
13ee0 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
13ef0 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c 45  l && !isSpecialE
13f00 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20  rror) ){.       
13f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
13f20 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a  eCheckFk(p, 1);.
13f30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13f40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f50 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
13f60 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  (p->readOnly) ){
13f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
13f80 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
13f90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
13fa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
13fb0 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  R;.          }. 
13fc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
13fd0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
13fe0 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20  FOREIGNKEY;.    
13ff0 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
14000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74        /* The aut
14010 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
14020 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65 20   true, the vdbe 
14030 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63  program was succ
14040 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20  essful .        
14050 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27    ** or hit an '
14060 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61  OR FAIL' constra
14070 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61 72  int and there ar
14080 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f  e no deferred fo
14090 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20  reign.          
140a0 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  ** key constrain
140b0 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68  ts to hold up th
140c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
140d0 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d  his means a comm
140e0 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  it .          **
140f0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f   is required. */
14100 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
14110 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70  vdbeCommit(db, p
14120 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14130 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14140 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72  ITE_BUSY && p->r
14150 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14160 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14170 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
14180 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14190 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
141a0 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
141b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
141c0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
141d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
141e0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
141f0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
14200 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14210 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
14220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14230 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
14240 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
14250 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
14260 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  mmCons = 0;.    
14270 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
14280 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72  &= ~SQLITE_Defer
14290 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73  FKs;.          s
142a0 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
142b0 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b  rnalChanges(db);
142c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
142d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
142e0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
142f0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
14300 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
14310 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14320 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74   }.      db->nSt
14330 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20  atement = 0;.   
14340 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
14350 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20  ementOp==0 ){.  
14360 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14370 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65  QLITE_OK || p->e
14380 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
14390 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ail ){.        e
143a0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
143b0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b  VEPOINT_RELEASE;
143c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
143d0 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
143e0 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20  =OE_Abort ){.   
143f0 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f       eStatementO
14400 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  p = SAVEPOINT_RO
14410 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65  LLBACK;.      }e
14420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14430 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14440 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
14450 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
14460 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
14470 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
14480 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f          db->auto
14490 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  Commit = 1;.    
144a0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
144b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
144c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65  }.  .    /* If e
144d0 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e  StatementOp is n
144e0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20  on-zero, then a 
144f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14500 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20  ction needs to. 
14510 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74     ** be committ
14520 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
14530 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56  k. Call sqlite3V
14540 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
14550 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  t() to.    ** do
14560 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65   so. If this ope
14570 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  ration returns a
14580 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65  n error, and the
14590 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
145a0 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20  nt.    ** error 
145b0 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f  code is SQLITE_O
145c0 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53  K or SQLITE_CONS
145d0 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f  TRAINT, then pro
145e0 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  mote the.    ** 
145f0 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
14600 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20  t error code..  
14610 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74    */.    if( eSt
14620 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20  atementOp ){.   
14630 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
14640 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
14650 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f  t(p, eStatementO
14660 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
14670 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
14680 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14690 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29   || (p->rc&0xff)
146a0 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ==SQLITE_CONSTRA
146b0 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  INT ){.         
146c0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
146d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
146e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
146f0 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
14700 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
14710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14720 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14730 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14740 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
14750 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14760 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14770 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
14780 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
14790 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
147a0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
147b0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
147c0 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e 20   If this was an 
147d0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
147e0 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20  r DELETE and no 
147f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
14800 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73  ction.    ** has
14810 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
14820 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64 61  k, update the da
14830 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14840 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  n change-counter
14850 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
14860 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e  ( p->changeCntOn
14870 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53   ){.      if( eS
14880 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45  tatementOp!=SAVE
14890 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
148a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
148b0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
148c0 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b  db, p->nChange);
148d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
148e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
148f0 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20  eSetChanges(db, 
14900 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
14910 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14920 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14930 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
14940 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
14950 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14960 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  }..  /* We have 
14970 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c  successfully hal
14980 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74  ted and closed t
14990 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74  he VM.  Record t
149a0 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69  his fact. */.  i
149b0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
149c0 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69     db->nVdbeActi
149d0 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70  ve--;.    if( !p
149e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d  ->readOnly ) db-
149f0 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20  >nVdbeWrite--;. 
14a00 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
14a10 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52  der ) db->nVdbeR
14a20 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  ead--;.    asser
14a30 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
14a40 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61  ve>=db->nVdbeRea
14a50 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d );.    assert(
14a60 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d   db->nVdbeRead>=
14a70 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29  db->nVdbeWrite )
14a80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
14a90 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20  ->nVdbeWrite>=0 
14aa0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69  );.  }.  p->magi
14ab0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48  c = VDBE_MAGIC_H
14ac0 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69  ALT;.  checkActi
14ad0 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20  veVdbeCnt(db);. 
14ae0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14af0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
14b00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
14b10 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
14b20 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
14b30 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
14b40 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
14b50 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
14b60 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
14b70 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
14b80 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
14b90 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
14ba0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
14bb0 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
14bc0 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
14bd0 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
14be0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
14bf0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
14c00 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
14c10 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14c20 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
14c30 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
14c40 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
14c50 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
14c60 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
14c70 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
14c80 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
14c90 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
14ca0 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
14cb0 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
14cc0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
14cd0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
14ce0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
14cf0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
14d00 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
14d10 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
14d20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
14d30 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
14d40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14d50 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
14d60 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
14d70 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
14d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
14d90 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
14da0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
14db0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
14dc0 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
14dd0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
14de0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
14df0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
14e00 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
14e10 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
14e20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
14e30 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
14e40 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
14e50 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
14e60 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14e70 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
14e80 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
14e90 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
14ea0 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
14eb0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
14ec0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
14ed0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
14ee0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
14ef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14f00 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
14f10 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
14f20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64  zErrMsg ){.    d
14f30 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  b->bBenignMalloc
14f40 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ++;.    sqlite3B
14f50 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
14f60 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ();.    if( db->
14f70 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45  pErr==0 ) db->pE
14f80 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  rr = sqlite3Valu
14f90 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71  eNew(db);.    sq
14fa0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
14fb0 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70  (db->pErr, -1, p
14fc0 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54  ->zErrMsg, SQLIT
14fd0 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54  E_UTF8, SQLITE_T
14fe0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
14ff0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
15000 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d  alloc();.    db-
15010 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d  >bBenignMalloc--
15020 3b 0a 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64  ;.    db->errCod
15030 65 20 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b  e = rc;.  }else{
15040 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15050 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
15060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15070 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15080 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
15090 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f   If an SQLITE_CO
150a0 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b  NFIG_SQLLOG hook
150b0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61   is registered a
150c0 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65  nd the VM has be
150d0 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f  en run, .** invo
150e0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ke it..*/.static
150f0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65   void vdbeInvoke
15100 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b  Sqllog(Vdbe *v){
15110 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
15120 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
15130 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c  og && v->rc==SQL
15140 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71  ITE_OK && v->zSq
15150 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b  l && v->pc>=0 ){
15160 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61  .    char *zExpa
15170 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64  nded = sqlite3Vd
15180 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76  beExpandSql(v, v
15190 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73  ->zSql);.    ass
151a0 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74  ert( v->db->init
151b0 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
151c0 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b  if( zExpanded ){
151d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
151e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
151f0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71  og(.          sq
15200 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15210 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d  g.pSqllogArg, v-
15220 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20  >db, zExpanded, 
15230 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  1.      );.     
15240 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
15250 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29  ->db, zExpanded)
15260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
15270 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
15280 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29  eInvokeSqllog(x)
15290 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
152a0 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61  lean up a VDBE a
152b0 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62  fter execution b
152c0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  ut do not delete
152d0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79   the VDBE just y
152e0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79  et..** Write any
152f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
15300 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20  into *pzErrMsg. 
15310 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
15320 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41  lt code..**.** A
15330 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
15340 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44  e is run, the VD
15350 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61  BE should be rea
15360 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  dy to be execute
15370 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  d.** again..**.*
15380 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20  * To look at it 
15390 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69  another way, thi
153a0 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73  s routine resets
153b0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
153c0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63  e.** virtual mac
153d0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d  hine from VDBE_M
153e0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45  AGIC_RUN or VDBE
153f0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b  _MAGIC_HALT back
15400 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49   to.** VDBE_MAGI
15410 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73  C_INIT..*/.int s
15420 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
15430 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
15440 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20  te3 *db;.  db = 
15450 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  p->db;..  /* If 
15460 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72  the VM did not r
15470 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  un to completion
15480 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e   or if it encoun
15490 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72  tered an.  ** er
154a0 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  ror, then it mig
154b0 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e  ht not have been
154c0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79   halted properly
154d0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20  .  So halt.  ** 
154e0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73  it now..  */.  s
154f0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70  qlite3VdbeHalt(p
15500 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15510 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20  VDBE has be run 
15520 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20  even partially, 
15530 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
15540 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  e error code.  *
15550 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  * and error mess
15560 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42  age from the VDB
15570 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  E into the main 
15580 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
15590 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66  re.  But.  ** if
155a0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75   the VDBE has ju
155b0 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72  st been set to r
155c0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61  un but has not a
155d0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64  ctually executed
155e0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75   any.  ** instru
155f0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76  ctions yet, leav
15600 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  e the main datab
15610 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d  ase error inform
15620 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
15630 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
15640 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65  c>=0 ){.    vdbe
15650 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b  InvokeSqllog(p);
15660 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15670 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29  TransferError(p)
15680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
15690 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
156a0 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72  sg);.    p->zErr
156b0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
156c0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
156d0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31  ) p->expired = 1
156e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
156f0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65  >rc && p->expire
15700 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  d ){.    /* The 
15710 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73  expired flag was
15720 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45   set on the VDBE
15730 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
15740 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
15750 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e   sqlite3_step().
15760 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   For consistency
15770 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f   (since sqlite3_
15780 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a  step() was.    *
15790 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74  * called), set t
157a0 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  he database erro
157b0 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61  r in this case a
157c0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  s well..    */. 
157d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
157e0 69 74 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63  ithMsg(db, p->rc
157f0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22  , p->zErrMsg ? "
15800 25 73 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72  %s" : 0, p->zErr
15810 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
15820 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
15830 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
15840 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d  zErrMsg = 0;.  }
15850 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61  ..  /* Reclaim a
15860 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ll memory used b
15870 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a  y the VDBE.  */.
15880 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20    Cleanup(p);.. 
15890 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69   /* Save profili
158a0 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
158b0 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 75  rom this VDBE ru
158c0 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56  n..  */.#ifdef V
158d0 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a  DBE_PROFILE.  {.
158e0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
158f0 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66  fopen("vdbe_prof
15900 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a  ile.out", "a");.
15910 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20      if( out ){. 
15920 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
15930 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15940 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66  ---- ");.      f
15950 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
15960 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15970 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30  fprintf(out, "%0
15980 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2x", p->aOp[i].o
15990 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pcode);.      }.
159a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
159b0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
159c0 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20  if( p->zSql ){. 
159d0 20 20 20 20 20 20 20 63 68 61 72 20 63 2c 20 70         char c, p
159e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  c = 0;.        f
159f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
15a00 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
15a10 69 3d 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71  i=0; (c = p->zSq
15a20 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  l[i])!=0; i++){.
15a30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63            if( pc
15a40 3d 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  =='\n' ) fprintf
15a50 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15a60 20 20 20 20 20 20 20 20 70 75 74 63 28 63 2c 20          putc(c, 
15a70 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
15a80 70 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  pc = c;.        
15a90 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  }.        if( pc
15aa0 21 3d 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66  !='\n' ) fprintf
15ab0 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  (out, "\n");.   
15ac0 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
15ad0 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
15ae0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
15af0 20 7a 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20   zHdr[100];.    
15b00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
15b10 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72  intf(sizeof(zHdr
15b20 29 2c 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31  ), zHdr, "%6u %1
15b30 32 6c 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20  2llu %8llu ",.  
15b40 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
15b50 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20  i].cnt,.        
15b60 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
15b70 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  les,.           
15b80 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20  p->aOp[i].cnt>0 
15b90 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c  ? p->aOp[i].cycl
15ba0 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74  es/p->aOp[i].cnt
15bb0 20 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a   : 0.        );.
15bc0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15bd0 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29  out, "%s", zHdr)
15be0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15bf0 33 56 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74  3VdbePrintOp(out
15c00 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29  , i, &p->aOp[i])
15c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15c20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20  fclose(out);.   
15c30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
15c40 70 2d 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20  p->iCurrentTime 
15c50 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20  = 0;.  p->magic 
15c60 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  = VDBE_MAGIC_INI
15c70 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72  T;.  return p->r
15c80 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  c & db->errMask;
15c90 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  .}. ./*.** Clean
15ca0 20 75 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61   up and delete a
15cb0 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
15cc0 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61  ution.  Return a
15cd0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
15ce0 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  is.** the result
15cf0 20 63 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e   code.  Write an
15d00 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  y error message 
15d10 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72  text into *pzErr
15d20 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
15d30 74 65 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28  te3VdbeFinalize(
15d40 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
15d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15d60 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d    if( p->magic==
15d70 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c  VDBE_MAGIC_RUN |
15d80 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  | p->magic==VDBE
15d90 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20  _MAGIC_HALT ){. 
15da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
15db0 64 62 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20  dbeReset(p);.   
15dc0 20 61 73 73 65 72 74 28 20 28 72 63 20 26 20 70   assert( (rc & p
15dd0 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d  ->db->errMask)==
15de0 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rc );.  }.  sqli
15df0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29  te3VdbeDelete(p)
15e00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15e10 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ../*.** If param
15e20 65 74 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73  eter iOp is less
15e30 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
15e40 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
15e50 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c  ructor for.** al
15e60 6c 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  l auxiliary data
15e70 20 70 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e   pointers curren
15e80 74 6c 79 20 63 61 63 68 65 64 20 62 79 20 74 68  tly cached by th
15e90 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a  e VM passed as.*
15ea0 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  * the first argu
15eb0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  ment..**.** Or, 
15ec0 69 66 20 69 4f 70 20 69 73 20 67 72 65 61 74 65  if iOp is greate
15ed0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
15ee0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
15ef0 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a  e destructor is.
15f00 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20  ** only invoked 
15f10 66 6f 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69  for those auxili
15f20 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
15f30 73 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65  s created by the
15f40 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69   user .** functi
15f50 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68  on invoked by th
15f60 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70  e OP_Function op
15f70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 75 63 74  code at instruct
15f80 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56  ion iOp of .** V
15f90 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c  M pVdbe, and onl
15fa0 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a  y then if:.**.**
15fb0 20 20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69      * the associ
15fc0 61 74 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61  ated function pa
15fd0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 33  rameter is the 3
15fe0 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f  2nd or later (co
15ff0 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66  unting.**      f
16000 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
16010 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20  t), or.**.**    
16020 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  * the correspond
16030 69 6e 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d  ing bit in argum
16040 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61  ent mask is clea
16050 72 20 28 77 68 65 72 65 20 74 68 65 20 66 69 72  r (where the fir
16060 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74  st.**      funct
16070 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f  ion parameter co
16080 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74  rresponds to bit
16090 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69   0 etc.)..*/.voi
160a0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
160b0 65 74 65 41 75 78 44 61 74 61 28 73 71 6c 69 74  eteAuxData(sqlit
160c0 65 33 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20  e3 *db, AuxData 
160d0 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69  **pp, int iOp, i
160e0 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c  nt mask){.  whil
160f0 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
16100 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
16110 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
16120 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
16130 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
16140 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
16150 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
16160 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
16170 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
16180 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
16190 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
161a0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
161b0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
161c0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
161d0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
161e0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
161f0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
16200 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16210 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c  , pAux);.    }el
16220 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70  se{.      pp= &p
16230 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
16240 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
16250 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
16260 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16270 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61  he Vdbe passed a
16280 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
16290 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74  ument,.** except
162a0 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65   for object itse
162b0 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65  lf, which is pre
162c0 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  served..**.** Th
162d0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
162e0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  ween this functi
162f0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64  on and sqlite3Vd
16300 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68  beDelete() is th
16310 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65  at.** VdbeDelete
16320 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20  () also unlinks 
16330 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68  the Vdbe from th
16340 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73  e list of VMs as
16350 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
16360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
16370 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nnection and fre
16380 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74  es the object it
16390 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  self..*/.void sq
163a0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
163b0 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
163c0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75  , Vdbe *p){.  Su
163d0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20  bProgram *pSub, 
163e0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b  *pNext;.  int i;
163f0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
16400 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62  ==0 || p->db==db
16410 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   );.  releaseMem
16420 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70  Array(p->aVar, p
16430 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61  ->nVar);.  relea
16440 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
16450 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
16460 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
16470 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e  ;.  for(pSub=p->
16480 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20  pProgram; pSub; 
16490 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20  pSub=pNext){.   
164a0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70   pNext = pSub->p
164b0 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72  Next;.    vdbeFr
164c0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53  eeOpArray(db, pS
164d0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e  ub->aOp, pSub->n
164e0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Op);.    sqlite3
164f0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29  DbFree(db, pSub)
16500 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d  ;.  }.  for(i=p-
16510 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20  >nzVar-1; i>=0; 
16520 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72  i--) sqlite3DbFr
16530 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b  ee(db, p->azVar[
16540 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  i]);.  sqlite3Db
16550 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
16560 72 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70  r);.  vdbeFreeOp
16570 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70  Array(db, p->aOp
16580 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c  , p->nOp);.  sql
16590 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
165a0 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73  ->aColName);.  s
165b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
165c0 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c   p->zSql);.  sql
165d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
165e0 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66  ->pFree);.#ifdef
165f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
16600 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
16610 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
16620 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Scan; i++){.    
16630 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16640 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e  , p->aScan[i].zN
16650 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
16660 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16670 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a  >aScan);.#endif.
16680 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
16690 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a  an entire VDBE..
166a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
166b0 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a  dbeDelete(Vdbe *
166c0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
166d0 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  b;..  if( NEVER(
166e0 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  p==0) ) return;.
166f0 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
16700 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
16710 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
16720 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16730 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
16740 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20  t(db, p);.  if( 
16750 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  p->pPrev ){.    
16760 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
16770 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  = p->pNext;.  }e
16780 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
16790 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b   db->pVdbe==p );
167a0 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d  .    db->pVdbe =
167b0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
167c0 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
167d0 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  .    p->pNext->p
167e0 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
167f0 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
16800 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41  = VDBE_MAGIC_DEA
16810 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  D;.  p->db = 0;.
16820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16830 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
16840 20 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20   The cursor "p" 
16850 68 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65  has a pending se
16860 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61  ek operation tha
16870 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
16880 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75  en.** carried ou
16890 74 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72  t.  Seek the cur
168a0 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20  sor now.  If an 
168b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
168c0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72  turn.** the appr
168d0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
168e0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
168f0 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
16900 45 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64  E handleDeferred
16910 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
16920 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73  r *p){.  int res
16930 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  , rc;.#ifdef SQL
16940 49 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72  ITE_TEST.  exter
16950 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
16960 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64  arch_count;.#end
16970 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  if.  assert( p->
16980 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
16990 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
169a0 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  sTable );.  asse
169b0 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
169c0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
169d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
169e0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
169f0 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ked(p->uc.pCurso
16a00 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54  r, 0, p->movetoT
16a10 61 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b  arget, 0, &res);
16a20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16a30 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73  rn rc;.  if( res
16a40 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=0 ) return SQL
16a50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16a60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16a70 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73  TEST.  sqlite3_s
16a80 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  earch_count++;.#
16a90 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72  endif.  p->defer
16aa0 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20  redMoveto = 0;. 
16ab0 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20   p->cacheStatus 
16ac0 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20  = CACHE_STALE;. 
16ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16ae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  K;.}../*.** Some
16af0 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20  thing has moved 
16b00 63 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f  cursor "p" out o
16b10 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20  f place.  Maybe 
16b20 74 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a  the row it was.*
16b30 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73  * pointed to was
16b40 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
16b50 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20  m under it.  Or 
16b60 6d 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20  maybe the btree 
16b70 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65  was.** rebalance
16b80 64 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65  d.  Whatever the
16b90 20 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72   cause, try to r
16ba0 65 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68  estore "p" to th
16bb0 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73  e place it.** is
16bc0 20 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20   supposed to be 
16bd0 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68  pointing.  If th
16be0 65 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65  e row was delete
16bf0 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
16c00 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20   the.** cursor, 
16c10 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74  set the cursor t
16c20 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c  o point to a NUL
16c30 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  L row..*/.static
16c40 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
16c50 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64  LINE handleMoved
16c60 43 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f  Cursor(VdbeCurso
16c70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44  r *p){.  int isD
16c80 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b  ifferentRow, rc;
16c90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
16ca0 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16cb0 42 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72  BTREE );.  asser
16cc0 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  t( p->uc.pCursor
16cd0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
16ce0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
16cf0 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
16d00 63 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  c.pCursor) );.  
16d10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16d20 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70  eCursorRestore(p
16d30 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69  ->uc.pCursor, &i
16d40 73 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a  sDifferentRow);.
16d50 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73    p->cacheStatus
16d60 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a   = CACHE_STALE;.
16d70 20 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e    if( isDifferen
16d80 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f  tRow ) p->nullRo
16d90 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  w = 1;.  return 
16da0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
16db0 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ck to ensure tha
16dc0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
16dd0 76 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20  valid.  Restore 
16de0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66  the cursor.** if
16df0 20 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72   need be.  Retur
16e00 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20  n any I/O error 
16e10 66 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65  from the restore
16e20 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69   operation..*/.i
16e30 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75  nt sqlite3VdbeCu
16e40 72 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65  rsorRestore(Vdbe
16e50 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73  Cursor *p){.  as
16e60 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70  sert( p->eCurTyp
16e70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
16e80 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
16e90 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
16ea0 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73  oved(p->uc.pCurs
16eb0 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  or) ){.    retur
16ec0 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
16ed0 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  sor(p);.  }.  re
16ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
16f00 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20  re the cursor p 
16f10 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64  is ready to read
16f20 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f   or write the ro
16f30 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a  w to which it.**
16f40 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69   was last positi
16f50 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e  oned.  Return an
16f60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
16f70 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49  n OOM fault or I
16f80 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76  /O error.** prev
16f90 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73  ents us from pos
16fa0 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72  itioning the cur
16fb0 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65  sor to its corre
16fc0 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a  ct position..**.
16fd0 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f  ** If a MoveTo o
16fe0 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64  peration is pend
16ff0 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ing on the given
17000 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f   cursor, then do
17010 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20   that.** MoveTo 
17020 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65  now.  If no move
17030 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65   is pending, che
17040 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
17050 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a   row has been.**
17060 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
17070 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
17080 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73  or and if it has
17090 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61  , mark the row a
170a0 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  s.** a NULL row.
170b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
170c0 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
170d0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
170e0 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20  correct row and 
170f0 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20  that row has.** 
17100 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64  not been deleted
17110 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
17120 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  the cursor, then
17130 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17140 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74   a no-op..*/.int
17150 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
17160 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72  orMoveto(VdbeCur
17170 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70  sor **pp, int *p
17180 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72  iCol){.  VdbeCur
17190 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20  sor *p = *pp;.  
171a0 69 66 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  if( p->eCurType=
171b0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
171c0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66  {.    if( p->def
171d0 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20  erredMoveto ){. 
171e0 20 20 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20       int iMap;. 
171f0 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74       if( p->aAlt
17200 4d 61 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70  Map && (iMap = p
17210 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43  ->aAltMap[1+*piC
17220 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  ol])>0 ){.      
17230 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43    *pp = p->pAltC
17240 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a  ursor;.        *
17250 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31  piCol = iMap - 1
17260 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17280 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
17290 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
172a0 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a  oveto(p);.    }.
172b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
172c0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
172d0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
172e0 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
172f0 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
17300 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sor(p);.    }.  
17310 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17320 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
17330 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
17340 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
17350 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17360 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
17370 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
17380 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17390 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
173a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
173b0 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
173c0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
173d0 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
173e0 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
173f0 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
17400 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
17410 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
17420 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
17430 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
17440 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
17450 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
17460 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
17470 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
17480 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
17490 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
174a0 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
174b0 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
174c0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
174d0 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
174e0 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
174f0 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
17500 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
17510 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
17520 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
17530 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
17540 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
17550 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
17560 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
17570 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
17580 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
17590 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
175a0 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
175b0 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
175c0 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
175d0 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
175e0 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
175f0 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
17600 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
17610 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17620 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
17630 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
17640 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
17650 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
17660 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
17670 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
17680 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
17690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
176a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
176b0 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
176c0 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
176f0 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
17720 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17730 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
17740 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
17750 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17760 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17770 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
17780 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17790 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
177a0 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177c0 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
177d0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
177e0 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
177f0 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
17800 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17810 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17830 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17840 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17850 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
17870 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
17880 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
17890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178a0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
178b0 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
178c0 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178e0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
178f0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17900 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
17930 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
17940 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
17950 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
17960 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
17970 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
17980 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
17990 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
179a0 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
179b0 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
179c0 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
179d0 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
179e0 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
179f0 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
17a00 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
17a10 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
17a20 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
17a30 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
17a40 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
17a50 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
17a60 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
17a70 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17a80 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
17a90 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
17aa0 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
17ab0 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
17ac0 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
17ad0 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
17ae0 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
17af0 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
17b00 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
17b10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
17b20 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
17b30 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
17b40 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
17b50 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
17b60 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
17b70 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
17b80 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
17b90 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
17ba0 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
17bb0 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
17bc0 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
17bd0 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
17be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
17bf0 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
17c00 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
17c10 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
17c20 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
17c30 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
17c40 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
17c50 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
17c60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17c70 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
17c80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17c90 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17ca0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
17cb0 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
17cc0 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
17cd0 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
17ce0 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
17cf0 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
17d00 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
17d10 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
17d20 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
17d30 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
17d40 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
17d50 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
17d60 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
17d70 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
17d80 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
17d90 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
17da0 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
17db0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
17dc0 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
17dd0 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
17de0 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
17df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
17e00 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
17e10 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
17e20 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
17e30 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
17e40 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
17e50 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
17e60 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
17e70 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
17e80 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
17e90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
17ea0 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
17eb0 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
17ec0 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
17ed0 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
17ee0 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
17ef0 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
17f00 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
17f10 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
17f20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
17f30 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
17f40 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
17f50 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
17f60 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
17f70 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
17f80 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
17f90 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
17fa0 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
17fb0 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
17fc0 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
17fd0 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
17fe0 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
17ff0 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
18000 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
18010 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
18020 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
18030 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
18040 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
18050 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
18060 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
18070 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
18080 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
18090 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
180a0 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
180b0 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
180c0 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
180d0 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
180e0 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
180f0 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
18100 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
18110 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
18120 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
18130 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
18140 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
18150 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
18160 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
18170 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
18180 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
18190 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
181a0 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
181b0 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
181c0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
181d0 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
181e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
181f0 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
18200 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
18210 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
18220 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
18230 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
18240 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
18250 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
18260 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
18270 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
18280 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
18290 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
182a0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
182b0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
182c0 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
182d0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
182e0 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
182f0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
18300 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
18310 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
18320 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
18330 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
18340 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
18350 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18360 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
18370 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
18380 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
18390 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
183a0 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
183b0 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
183c0 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
183d0 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
183e0 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
183f0 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
18400 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
18410 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
18420 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
18430 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
18440 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
18450 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
18460 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
18470 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
18480 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
18490 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
184a0 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
184b0 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
184c0 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
184d0 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
184e0 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
184f0 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
18500 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18510 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
18520 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
18530 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
18540 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
18550 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
18560 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
18570 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
18580 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
18590 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
185a0 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
185b0 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
185c0 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
185d0 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
185e0 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
185f0 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
18600 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
18610 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
18620 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
18630 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
18640 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
18650 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
18660 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
18670 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
18680 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
18690 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
186a0 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
186b0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
186c0 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
186d0 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
186e0 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
186f0 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
18700 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
18710 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
18720 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
18730 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
18740 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
18750 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
18760 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
18770 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
18780 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
18790 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
187a0 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
187b0 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
187c0 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
187d0 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
187e0 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
187f0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18800 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
18810 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
18820 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
18830 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
18840 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
18850 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
18860 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
18870 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
18880 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
18890 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
188a0 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
188b0 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
188c0 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
188d0 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
188e0 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
188f0 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
18900 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
18910 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
18920 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
18930 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
18940 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
18950 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
18960 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
18970 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
18980 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
18990 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
189a0 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
189b0 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
189c0 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
189d0 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
189e0 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
189f0 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
18a00 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
18a10 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
18a20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
18a30 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
18a40 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
18a50 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
18a60 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
18a70 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
18a80 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
18a90 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
18aa0 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
18ab0 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
18ac0 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
18ad0 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
18ae0 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
18af0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18b00 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
18b10 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
18b20 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
18b30 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
18b40 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
18b50 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
18b60 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
18b70 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
18b80 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
18b90 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
18ba0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
18bb0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
18bc0 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
18bd0 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
18be0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18bf0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
18c00 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
18c10 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
18c20 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
18c30 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
18c40 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
18c50 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
18c60 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
18c70 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
18c80 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
18c90 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
18ca0 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
18cb0 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
18cc0 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
18cd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18ce0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18cf0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
18d00 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
18d10 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
18d20 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
18d30 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
18d40 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
18d50 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
18d60 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
18d70 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
18d80 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
18d90 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
18da0 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
18db0 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
18dc0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
18dd0 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
18de0 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
18df0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
18e00 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
18e10 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
18e20 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
18e30 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
18e40 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
18e50 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
18e60 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
18e70 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
18e80 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
18e90 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
18ea0 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
18eb0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
18ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18ed0 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
18ee0 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
18ef0 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
18f00 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18f10 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
18f20 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
18f30 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
18f40 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
18f50 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
18f60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
18f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
18f80 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
18f90 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
18fa0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18fb0 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
18fc0 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
18fd0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
18fe0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
18ff0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
19000 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
19010 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
19020 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
19030 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
19040 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66   pMem->n;.    if
19050 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79  ( len>0 ) memcpy
19060 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
19070 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
19080 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
19090 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
190a0 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
190b0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
190c0 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
190d0 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
190e0 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
190f0 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
19100 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
19110 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
19120 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
19130 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
19140 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
19150 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
19160 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
19170 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
19180 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
19190 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
191a0 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
191b0 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
191c0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
191d0 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
191e0 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
191f0 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
19200 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
19210 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
19220 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66  <8)|(x)[3]).#def
19230 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  ine FOUR_BYTE_IN
19240 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28  T(x) (16777216*(
19250 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
19260 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
19270 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
19280 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
19290 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
192a0 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
192b0 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
192c0 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
192d0 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
192e0 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
192f0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19300 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a  f bytes read..**
19310 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19320 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
19330 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65   as two separate
19340 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65   routines for pe
19350 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
19360 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74  e few cases that
19370 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76   require local v
19380 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f  ariables are bro
19390 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73  ken out into a s
193a0 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69  eparate.** routi
193b0 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f  ne so that in mo
193c0 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65  st cases the ove
193d0 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20  rhead of moving 
193e0 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  the stack pointe
193f0 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e  r.** is avoided.
19400 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20  .*/ .static u32 
19410 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
19420 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  serialGet(.  con
19430 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
19440 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
19450 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
19460 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
19470 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
19480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
19490 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
194a0 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
194b0 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
194d0 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
194e0 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
194f0 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20  */.){.  u64 x = 
19500 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
19510 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46  uf);.  u32 y = F
19520 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
19530 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c  f+4);.  x = (x<<
19540 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73  32) + y;.  if( s
19550 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
19560 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19570 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32  -OF: R-29851-522
19580 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  72 Value is a bi
19590 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a  g-endian 64-bit.
195a0 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
195b0 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
195c0 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  */.    pMem->u.i
195d0 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
195e0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
195f0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73  MEM_Int;.    tes
19600 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19610 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  <0 );.  }else{. 
19620 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19630 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34  F: R-57343-49114
19640 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19650 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d  endian IEEE 754-
19660 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20  2008 64-bit.    
19670 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
19680 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66  t number. */.#if
19690 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
196a0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
196b0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
196c0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a  NG_POINT).    /*
196d0 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
196e0 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
196f0 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
19700 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
19710 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
19720 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
19730 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
19740 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
19750 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
19760 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
19770 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19780 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
19790 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e  d.    ** endian.
197a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
197b0 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
197c0 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
197d0 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61  00)<<32;.    sta
197e0 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
197f0 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75   r1 = 1.0;.    u
19800 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
19810 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19820 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73  loat(t2);.    as
19830 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
19840 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
19850 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
19860 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
19870 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
19880 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
19890 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
198a0 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20  m->u.r)==8 );.  
198b0 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
198c0 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d  nFloat(x);.    m
198d0 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72  emcpy(&pMem->u.r
198e0 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
198f0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
19900 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
19910 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45  (pMem->u.r) ? ME
19920 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
19930 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
19940 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  8;.}.u32 sqlite3
19950 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
19960 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
19970 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
19980 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
19990 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
199a0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
199b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
199c0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
199d0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
199e0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a00 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
19a10 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
19a20 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
19a30 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
19a40 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
19a50 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
19a60 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
19a70 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
19a80 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
19a90 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
19aa0 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
19ab0 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
19ac0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19ad0 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
19ae0 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
19af0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19b00 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
19b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19b20 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
19b30 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19b40 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
19b50 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
19b60 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
19b70 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
19b80 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19b90 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
19ba0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
19bb0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19bc0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19bd0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19be0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19bf0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19c00 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
19c10 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
19c20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
19c30 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19c40 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
19c50 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
19c60 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
19c70 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19c80 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19c90 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19ca0 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
19cb0 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
19cc0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19cd0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19ce0 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19cf0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
19d00 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19d10 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
19d20 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
19d30 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19d40 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
19d50 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
19d60 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
19d70 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19d80 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19d90 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19da0 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
19db0 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
19dc0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19dd0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19de0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19df0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19e00 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
19e10 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
19e20 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
19e30 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
19e40 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19e50 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
19e60 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
19e70 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
19e80 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19e90 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19ea0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19eb0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
19ec0 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
19ed0 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
19ee0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
19ef0 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
19f00 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
19f10 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
19f20 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
19f30 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
19f40 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
19f50 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
19f60 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
19f70 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19f80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19f90 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19fa0 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
19fb0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
19fc0 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
19fd0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19fe0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19ff0 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
1a000 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
1a010 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
1a020 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
1a030 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
1a040 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
1a050 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
1a060 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
1a070 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
1a080 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
1a090 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a0a0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a0b0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a0c0 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a0d0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
1a0e0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
1a0f0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
1a100 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a110 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
1a120 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
1a130 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
1a140 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
1a150 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
1a160 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
1a170 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
1a180 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
1a190 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
1a1a0 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
1a1b0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
1a1c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
1a1d0 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
1a1e0 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
1a1f0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
1a200 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
1a210 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
1a220 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
1a230 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a240 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
1a250 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
1a260 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
1a270 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a280 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
1a290 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
1a2a0 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
1a2b0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1a2c0 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
1a2d0 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
1a2e0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1a300 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
1a310 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
1a320 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
1a330 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
1a340 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
1a350 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
1a360 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
1a370 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
1a380 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
1a390 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
1a3a0 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
1a3b0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
1a3c0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
1a3d0 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
1a3e0 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
1a3f0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
1a400 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
1a410 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
1a420 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
1a430 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
1a440 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
1a450 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
1a460 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
1a470 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
1a480 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
1a490 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
1a4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
1a4b0 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
1a4c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
1a4d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a4e0 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
1a4f0 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
1a500 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
1a510 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
1a520 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
1a530 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
1a540 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
1a550 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
1a560 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
1a570 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1a580 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
1a590 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
1a5a0 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
1a5b0 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
1a5c0 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
1a5d0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
1a5e0 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
1a5f0 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
1a600 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
1a610 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
1a620 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
1a630 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
1a640 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
1a650 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
1a660 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
1a670 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1a680 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1a690 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1a6a0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1a6b0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1a6c0 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1a6d0 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1a6e0 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1a6f0 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1a700 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1a710 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1a720 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1a730 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1a740 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1a750 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1a760 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1a770 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1a780 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1a790 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1a7a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1a7c0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1a7d0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
1a7e0 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20  r *pSpace,      
1a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a800 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
1a810 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69  available */.  i
1a820 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20  nt szSpace,     
1a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a840 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
1a850 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
1a860 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20   char **ppFree  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20   /* OUT: Caller 
1a890 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73  should free this
1a8a0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20   pointer */.){. 
1a8b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a8c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1a8d0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1a8e0 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1a8f0 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a910 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1a920 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74  pSpace by nOff t
1a930 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20  o align it */.  
1a940 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a970 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
1a980 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77  *p */..  /* We w
1a990 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
1a9a0 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
1a9b0 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
1a9c0 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
1a9d0 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
1a9e0 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
1a9f0 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
1aa00 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
1aa10 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
1aa20 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
1aa30 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
1aa40 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
1aa50 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
1aa60 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
1aa70 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
1aa80 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
1aa90 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e  ) & 7)) & 7;.  n
1aaa0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
1aab0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1aac0 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
1aad0 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
1aae0 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
1aaf0 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f  nByte>szSpace+nO
1ab00 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55  ff ){.    p = (U
1ab10 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1ab20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1ab30 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1ab40 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70   nByte);.    *pp
1ab50 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70  Free = (char *)p
1ab60 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72  ;.    if( !p ) r
1ab70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1ab80 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
1ab90 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61  kedRecord*)&pSpa
1aba0 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70  ce[nOff];.    *p
1abb0 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pFree = 0;.  }..
1abc0 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1abd0 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1abe0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1abf0 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1ac00 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1ac10 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1ac20 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1ac30 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1ac40 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1ac50 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1ac60 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1ac70 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1ac80 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1ac90 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1aca0 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1acb0 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1acc0 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1acd0 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1ace0 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1acf0 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1ad00 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1ad10 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1ad20 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1ad30 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1ad40 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1ad50 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1ad60 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1ad70 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1ad80 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1ad90 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1ada0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1adb0 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1adc0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1add0 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1ade0 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1adf0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1ae00 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1ae10 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1ae20 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1ae30 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1ae40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1ae50 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1ae60 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1ae70 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
1ae80 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1ae90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aea0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1aeb0 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1aec0 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1aef0 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1af00 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1af10 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1af20 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1af30 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1af40 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1af50 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1af60 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1af70 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1af80 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1af90 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1afa0 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1afb0 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  dr && d<=nKey ){
1afc0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1afd0 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
1afe0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1aff0 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
1b000 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
1b010 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
1b020 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
1b030 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
1b040 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d  db;.    /* pMem-
1b050 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73  >flags = 0; // s
1b060 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b070 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74  Get() will set t
1b080 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  his for us */.  
1b090 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63    pMem->szMalloc
1b0a0 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e   = 0;.    pMem->
1b0b0 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20  z = 0;.    d += 
1b0c0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b0d0 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73  lGet(&aKey[d], s
1b0e0 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d  erial_type, pMem
1b0f0 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  );.    pMem++;. 
1b100 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d     if( (++u)>=p-
1b110 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b  >nField ) break;
1b120 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75  .  }.  assert( u
1b130 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  <=pKeyInfo->nFie
1b140 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e  ld + 1 );.  p->n
1b150 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69  Field = u;.}..#i
1b160 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1b170 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1b180 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20  on compares two 
1b190 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72  index or table r
1b1a0 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68  ecord keys in th
1b1b0 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73  e same way.** as
1b1c0 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65   the sqlite3Vdbe
1b1d0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b1e0 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20  routine. Unlike 
1b1f0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b200 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e  e(),.** this fun
1b210 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
1b220 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20  es and compares 
1b230 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65  values using the
1b240 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
1b250 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73  erialGet() and s
1b260 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1b270 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74  () functions. It
1b280 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61   is used.** in a
1b290 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1b2a0 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
1b2b0 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  t the optimized 
1b2c0 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  code in.** sqlit
1b2d0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1b2e0 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65  are() returns re
1b2f0 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65  sults with these
1b300 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e   two primitives.
1b310 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1b320 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74  ue if the result
1b330 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69   of comparison i
1b340 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
1b350 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a  desiredResult..*
1b360 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1b370 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73  f there is a dis
1b380 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  agreement..*/.st
1b390 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
1b3a0 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1b3b0 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1b3c0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1b3d0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1b3e0 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64    const Unpacked
1b3f0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1b400 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1b410 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73    int desiredRes
1b420 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
1b430 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65  /* Correct answe
1b440 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  r */.){.  u32 d1
1b450 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1b460 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b470 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1b480 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32  element */.  u32
1b490 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20   idx1;          
1b4a0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1b4b0 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65  Key[] of next he
1b4c0 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ader element */.
1b4d0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1b4e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b4f0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65  f bytes in heade
1b500 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30  r */.  int i = 0
1b510 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1b520 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1b530 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1b540 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b550 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b  har *)pKey1;.  K
1b560 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1b570 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1b580 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65   pKeyInfo = pPKe
1b590 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1b5a0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  if( pKeyInfo->db
1b5b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1b5c0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65    mem1.enc = pKe
1b5d0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65  yInfo->enc;.  me
1b5e0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1b5f0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e  ->db;.  /* mem1.
1b600 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57  flags = 0;  // W
1b610 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ill be initializ
1b620 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62  ed by sqlite3Vdb
1b630 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a  eSerialGet() */.
1b640 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1b650 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1b660 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1b670 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1b680 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20  ements */..  /* 
1b690 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f  Compilers may co
1b6a0 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31  mplain that mem1
1b6b0 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61  .u.i is potentia
1b6c0 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  lly uninitialize
1b6d0 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64  d..  ** We could
1b6e0 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20   initialize it, 
1b6f0 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74  as shown here, t
1b700 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20  o silence those 
1b710 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a  complaints..  **
1b720 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65   But in fact, me
1b730 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65  m1.u.i will neve
1b740 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73  r actually be us
1b750 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ed uninitialized
1b760 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a  , and doing .  *
1b770 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72  * the unnecessar
1b780 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  y initialization
1b790 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c   has a measurabl
1b7a0 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f  e negative perfo
1b7b0 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61  rmance.  ** impa
1b7c0 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72  ct, since this r
1b7d0 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79  outine is a very
1b7e0 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41   high runner.  A
1b7f0 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65  nd so, we choose
1b800 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20  .  ** to ignore 
1b810 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  the compiler war
1b820 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20  nings and leave 
1b830 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e  this variable un
1b840 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1b850 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69  /.  /*  mem1.u.i
1b860 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65   = 0;  // not ne
1b870 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69  eded, here to si
1b880 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77  lence compiler w
1b890 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69  arning */.  .  i
1b8a0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1b8b0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1b8c0 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39  ;.  if( szHdr1>9
1b8d0 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51  8307 ) return SQ
1b8e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
1b8f0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61  d1 = szHdr1;.  a
1b900 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b910 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f  >nField+pKeyInfo
1b920 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1b930 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52  2->nField || COR
1b940 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1b950 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ert( pKeyInfo->a
1b960 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1b970 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b980 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1b990 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1b9a0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1b9b0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1b9c0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1b9d0 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  e1;..    /* Read
1b9e0 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   the serial type
1b9f0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65  s for the next e
1ba00 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b  lement in each k
1ba10 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20  ey. */.    idx1 
1ba20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20  += getVarint32( 
1ba30 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69  aKey1+idx1, seri
1ba40 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20  al_type1 );..   
1ba50 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
1ba60 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
1ba70 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e  key space remain
1ba80 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20  ing to avoid.   
1ba90 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65   ** a buffer ove
1baa0 72 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b  rread.  The "d1+
1bab0 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20  serial_type1+2" 
1bac0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69  subexpression wi
1bad0 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  ll.    ** always
1bae0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
1baf0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1bb00 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69   amount of requi
1bb10 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20  red key space.. 
1bb20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61     ** Use that a
1bb30 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20  pproximation to 
1bb40 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65  avoid the more e
1bb50 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f  xpensive call to
1bb60 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  .    ** sqlite3V
1bb70 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1bb80 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  () in the common
1bb90 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1bba0 20 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f    if( d1+serial_
1bbb0 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65  type1+2>(u32)nKe
1bbc0 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71  y1.     && d1+sq
1bbd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
1bbe0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
1bbf0 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20  pe1)>(u32)nKey1 
1bc00 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
1bc10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1bc20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76  /* Extract the v
1bc30 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70  alues to be comp
1bc40 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
1bc50 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1bc60 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1bc70 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1bc80 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20  ype1, &mem1);.. 
1bc90 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d     /* Do the com
1bca0 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20  parison.    */. 
1bcb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
1bcc0 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c  emCompare(&mem1,
1bcd0 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69   &pPKey2->aMem[i
1bce0 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  ], pKeyInfo->aCo
1bcf0 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ll[i]);.    if( 
1bd00 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  rc!=0 ){.      a
1bd10 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1bd20 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1bd30 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1bd40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b   */.      if( pK
1bd50 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1bd60 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1bd70 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49   rc = -rc;  /* I
1bd80 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74  nvert the result
1bd90 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f   for DESC sort o
1bda0 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  rder. */.      }
1bdb0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75  .      goto debu
1bdc0 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20  gCompareEnd;.   
1bdd0 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77   }.    i++;.  }w
1bde0 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72  hile( idx1<szHdr
1bdf0 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e  1 && i<pPKey2->n
1be00 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e  Field );..  /* N
1be10 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  o memory allocat
1be20 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64  ion is ever used
1be30 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65   on mem1.  Prove
1be40 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a   this using.  **
1be50 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
1be60 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65  ssert().  If the
1be70 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c   assert() fails,
1be80 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   it indicates a.
1be90 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b    ** memory leak
1bea0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63   and a need to c
1beb0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d  all sqlite3VdbeM
1bec0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29  emRelease(&mem1)
1bed0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1bee0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1bef0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1bf00 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1bf10 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73   one of the keys
1bf20 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c   ran out of fiel
1bf30 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20  ds and.  ** all 
1bf40 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f  the fields up to
1bf50 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65   that point were
1bf60 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74   equal. Return t
1bf70 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20  he default_rc.  
1bf80 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20  ** value.  */.  
1bf90 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  rc = pPKey2->def
1bfa0 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43  ault_rc;..debugC
1bfb0 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28  ompareEnd:.  if(
1bfc0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d   desiredResult==
1bfd0 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74  0 && rc==0 ) ret
1bfe0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73  urn 1;.  if( des
1bff0 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20  iredResult<0 && 
1c000 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b  rc<0 ) return 1;
1c010 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1c020 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29  sult>0 && rc>0 )
1c030 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c040 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
1c050 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b  turn 1;.  if( pK
1c060 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c  eyInfo->db->mall
1c070 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1c080 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
1c090 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
1c0a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1c0b0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1c0c0 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e  er of fields (a.
1c0d0 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e  k.a. columns) in
1c0e0 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65   the record give
1c0f0 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65  n by.** pKey,nKe
1c100 79 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74  y.  The verify t
1c110 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69  hat this count i
1c120 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
1c130 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c  qual to the.** l
1c140 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b  imit given by pK
1c150 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1c160 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65   pKeyInfo->nXFie
1c170 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ld..**.** If thi
1c180 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20  s constraint is 
1c190 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69  not satisfied, i
1c1a0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1c1b0 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76   high-speed.** v
1c1c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c1d0 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65  Int() and vdbeRe
1c1e0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1c1f0 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c  g() routines wil
1c200 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  l.** not work co
1c210 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69  rrectly.  If thi
1c220 73 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20  s assert() ever 
1c230 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62  fires, it probab
1c240 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  ly means.** that
1c250 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69   the KeyInfo.nFi
1c260 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e  eld or KeyInfo.n
1c270 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65  XField values we
1c280 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69  re computed.** i
1c290 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73  ncorrectly..*/.s
1c2a0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41  tatic void vdbeA
1c2b0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1c2c0 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69  ithinLimits(.  i
1c2d0 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76  nt nKey, const v
1c2e0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
1c2f0 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65  The record to ve
1c300 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74  rify */ .  const
1c310 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1c320 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70  fo       /* Comp
1c330 61 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68  are size with th
1c340 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b  is KeyInfo */.){
1c350 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20  .  int nField = 
1c360 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  0;.  u32 szHdr;.
1c370 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32    u32 idx;.  u32
1c380 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73   notUsed;.  cons
1c390 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1c3a0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1c3b0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b  nsigned char*)pK
1c3c0 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55  ey;..  if( CORRU
1c3d0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  PT_DB ) return;.
1c3e0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1c3f0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1c400 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79  ;.  assert( nKey
1c410 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1c420 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65   szHdr<=(u32)nKe
1c430 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  y );.  while( id
1c440 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69  x<szHdr ){.    i
1c450 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1c460 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55  2(aKey+idx, notU
1c470 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64  sed);.    nField
1c480 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ++;.  }.  assert
1c490 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79  ( nField <= pKey
1c4a0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1c4b0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29  yInfo->nXField )
1c4c0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1c4d0 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65  ne vdbeAssertFie
1c4e0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c4f0 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69  its(A,B,C).#endi
1c500 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70  f../*.** Both *p
1c510 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20  Mem1 and *pMem2 
1c520 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76  contain string v
1c530 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74  alues. Compare t
1c540 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  he two values.**
1c550 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61   using the colla
1c560 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
1c570 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72  oll. As usual, r
1c580 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
1c590 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f   , zero.** or po
1c5a0 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20  sitive value if 
1c5b0 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74  *pMem1 is less t
1c5c0 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72  han, equal to or
1c5d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a   greater than .*
1c5e0 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63  * *pMem2, respec
1c5f0 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20  tively. Similar 
1c600 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63  in spirit to "rc
1c610 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a   = (*pMem1) - (*
1c620 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61  pMem2);"..*/.sta
1c630 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70  tic int vdbeComp
1c640 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1c650 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1c660 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  ,.  const Mem *p
1c670 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f  Mem2,.  const Co
1c680 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20  llSeq *pColl,.  
1c690 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20  u8 *prcErr      
1c6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6b0 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  /* If an OOM occ
1c6c0 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49  urs, set to SQLI
1c6d0 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20  TE_NOMEM */.){. 
1c6e0 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d   if( pMem1->enc=
1c6f0 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
1c700 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67     /* The string
1c710 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  s are already in
1c720 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63   the correct enc
1c730 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65  oding.  Call the
1c740 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69  .     ** compari
1c750 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72  son function dir
1c760 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74  ectly */.    ret
1c770 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28  urn pColl->xCmp(
1c780 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65  pColl->pUser,pMe
1c790 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70  m1->n,pMem1->z,p
1c7a0 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a  Mem2->n,pMem2->z
1c7b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c7c0 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73  int rc;.    cons
1c7d0 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b  t void *v1, *v2;
1c7e0 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b  .    int n1, n2;
1c7f0 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20  .    Mem c1;.   
1c800 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c   Mem c2;.    sql
1c810 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1c820 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c1, pMem1->db, 
1c830 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1c840 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1c850 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c2, pMem1->db
1c860 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1c870 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1c880 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20  hallowCopy(&c1, 
1c890 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem1, MEM_Ephem
1c8a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c8b0 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79  beMemShallowCopy
1c8c0 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d  (&c2, pMem2, MEM
1c8d0 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20  _Ephem);.    v1 
1c8e0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
1c8f0 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt((sqlite3_valu
1c900 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65  e*)&c1, pColl->e
1c910 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31  nc);.    n1 = v1
1c920 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a  ==0 ? 0 : c1.n;.
1c930 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33      v2 = sqlite3
1c940 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74  ValueText((sqlit
1c950 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70  e3_value*)&c2, p
1c960 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20  Coll->enc);.    
1c970 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a  n2 = v2==0 ? 0 :
1c980 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20   c2.n;.    rc = 
1c990 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1c9a0 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31  l->pUser, n1, v1
1c9b0 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69  , n2, v2);.    i
1c9c0 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d  f( (v1==0 || v2=
1c9d0 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20  =0) && prcErr ) 
1c9e0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45  *prcErr = SQLITE
1c9f0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1ca00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ca10 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
1ca20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1ca30 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
1ca40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1ca50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1ca60 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74   two blobs.  Ret
1ca70 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
1ca80 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
1ca90 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  if the first.** 
1caa0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1cab0 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1cac0 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1cad0 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  nd, respectively
1cae0 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62  ..** If one blob
1caf0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
1cb00 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20  the other, then 
1cb10 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74  the shorter is t
1cb20 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74  he lessor..*/.st
1cb30 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
1cb40 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33  LINE int sqlite3
1cb50 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73  BlobCompare(cons
1cb60 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73  t Mem *pB1, cons
1cb70 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69  t Mem *pB2){.  i
1cb80 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42  nt c = memcmp(pB
1cb90 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42  1->z, pB2->z, pB
1cba0 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42  1->n>pB2->n ? pB
1cbb0 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a  2->n : pB1->n);.
1cbc0 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e    if( c ) return
1cbd0 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31   c;.  return pB1
1cbe0 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a  ->n - pB2->n;.}.
1cbf0 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70  ./*.** Do a comp
1cc00 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61  arison between a
1cc10 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69   64-bit signed i
1cc20 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d  nteger and a 64-
1cc30 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69  bit floating-poi
1cc40 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52  nt.** number.  R
1cc50 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1cc60 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1cc70 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 28  e if the first (
1cc80 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 61  i64) is less tha
1cc90 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20  n,.** equal to, 
1cca0 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1ccb0 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62  the second (doub
1ccc0 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  le)..*/.static i
1ccd0 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  nt sqlite3IntFlo
1cce0 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c  atCompare(i64 i,
1ccf0 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66   double r){.  if
1cd00 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55  ( sizeof(LONGDOU
1cd10 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20  BLE_TYPE)>8 ){. 
1cd20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59     LONGDOUBLE_TY
1cd30 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42  PE x = (LONGDOUB
1cd40 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69  LE_TYPE)i;.    i
1cd50 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20  f( x<r ) return 
1cd60 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20  -1;.    if( x>r 
1cd70 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1cd80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1cd90 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20  se{.    i64 y;. 
1cda0 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20     double s;.   
1cdb0 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30   if( r<-92233720
1cdc0 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 20  36854775808.0 ) 
1cdd0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69  return +1;.    i
1cde0 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 38  f( r>92233720368
1cdf0 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 74  54775807.0 ) ret
1ce00 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20  urn -1;.    y = 
1ce10 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20  (i64)r;.    if( 
1ce20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  i<y ) return -1;
1ce30 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a  .    if( i>y ){.
1ce40 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41        if( y==SMA
1ce50 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72  LLEST_INT64 && r
1ce60 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  >0.0 ) return -1
1ce70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b  ;.      return +
1ce80 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d  1;.    }.    s =
1ce90 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20   (double)i;.    
1cea0 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e  if( s<r ) return
1ceb0 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72   -1;.    if( s>r
1cec0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1ced0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1cee0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
1cef0 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74   the values cont
1cf00 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f  ained by the two
1cf10 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72   memory cells, r
1cf20 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61  eturning.** nega
1cf30 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f  tive, zero or po
1cf40 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20  sitive if pMem1 
1cf50 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1cf60 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1cf70 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32  er.** than pMem2
1cf80 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20  . Sorting order 
1cf90 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c  is NULL's first,
1cfa0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d   followed by num
1cfb0 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a  bers (integers.*
1cfc0 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72  * and reals) sor
1cfd0 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c  ted numerically,
1cfe0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78   followed by tex
1cff0 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 65  t ordered by the
1d000 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65   collating.** se
1d010 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64  quence pColl and
1d020 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20   finally blob's 
1d030 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d  ordered by memcm
1d040 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e  p()..**.** Two N
1d050 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63  ULL values are c
1d060 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c 20  onsidered equal 
1d070 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1d080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d090 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74  MemCompare(const
1d0a0 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e   Mem *pMem1, con
1d0b0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63  st Mem *pMem2, c
1d0c0 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43  onst CollSeq *pC
1d0d0 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20  oll){.  int f1, 
1d0e0 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e  f2;.  int combin
1d0f0 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20  ed_flags;..  f1 
1d100 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a  = pMem1->flags;.
1d110 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c    f2 = pMem2->fl
1d120 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f  ags;.  combined_
1d130 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20  flags = f1|f2;. 
1d140 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e   assert( (combin
1d150 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  ed_flags & MEM_R
1d160 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20  owSet)==0 );. . 
1d170 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65   /* If one value
1d180 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20   is NULL, it is 
1d190 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74  less than the ot
1d1a0 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c  her. If both val
1d1b0 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c  ues.  ** are NUL
1d1c0 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a  L, return 0..  *
1d1d0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64  /.  if( combined
1d1e0 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20  _flags&MEM_Null 
1d1f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66  ){.    return (f
1d200 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66  2&MEM_Null) - (f
1d210 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d  1&MEM_Null);.  }
1d220 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20  ..  /* At least 
1d230 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76  one of the two v
1d240 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65  alues is a numbe
1d250 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  r.  */.  if( com
1d260 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d  bined_flags&(MEM
1d270 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29  _Int|MEM_Real) )
1d280 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  {.    if( (f1 & 
1d290 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30  f2 & MEM_Int)!=0
1d2a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d   ){.      if( pM
1d2b0 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32  em1->u.i < pMem2
1d2c0 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d  ->u.i ) return -
1d2d0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  1;.      if( pMe
1d2e0 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d  m1->u.i > pMem2-
1d2f0 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31  >u.i ) return +1
1d300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
1d310 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d320 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52  (f1 & f2 & MEM_R
1d330 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1d340 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20   if( pMem1->u.r 
1d350 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72  < pMem2->u.r ) r
1d360 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d370 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e  if( pMem1->u.r >
1d380 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65   pMem2->u.r ) re
1d390 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1d3a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1d3b0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49     if( (f1&MEM_I
1d3c0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1d3d0 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c  if( (f2&MEM_Real
1d3e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d3f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
1d400 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d  tFloatCompare(pM
1d410 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d  em1->u.i, pMem2-
1d420 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.r);.      }el
1d430 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  se{.        retu
1d440 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20  rn -1;.      }. 
1d450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1d460 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b  &MEM_Real)!=0 ){
1d470 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1d480 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1d490 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71        return -sq
1d4a0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1d4b0 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c  pare(pMem2->u.i,
1d4c0 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20   pMem1->u.r);.  
1d4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d4e0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1d4f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d500 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a  return +1;.  }..
1d510 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75    /* If one valu
1d520 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e  e is a string an
1d530 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 61  d the other is a
1d540 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e   blob, the strin
1d550 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20  g is less..  ** 
1d560 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 69  If both are stri
1d570 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69  ngs, compare usi
1d580 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ng the collating
1d590 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f   functions..  */
1d5a0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1d5b0 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b  flags&MEM_Str ){
1d5c0 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 4d  .    if( (f1 & M
1d5d0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1d5e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1d5f0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20    }.    if( (f2 
1d600 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1d610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1d620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
1d630 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d  ert( pMem1->enc=
1d640 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70  =pMem2->enc || p
1d650 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Mem1->db->malloc
1d660 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73  Failed );.    as
1d670 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63  sert( pMem1->enc
1d680 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  ==SQLITE_UTF8 ||
1d690 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d   .            pM
1d6a0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d6b0 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d  _UTF16LE || pMem
1d6c0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1d6d0 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f  TF16BE );..    /
1d6e0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
1d6f0 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65  sequence must be
1d700 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 73   defined at this
1d710 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a   point, even if.
1d720 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20      ** the user 
1d730 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c  deletes the coll
1d740 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61  ation sequence a
1d750 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 72  fter the vdbe pr
1d760 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20  ogram is.    ** 
1d770 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77  compiled (this w
1d780 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68  as not always th
1d790 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a  e case)..    */.
1d7a0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 6f      assert( !pCo
1d7b0 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll || pColl->xCm
1d7c0 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  p );..    if( pC
1d7d0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74  oll ){.      ret
1d7e0 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  urn vdbeCompareM
1d7f0 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20  emString(pMem1, 
1d800 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29  pMem2, pColl, 0)
1d810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  ;.    }.    /* I
1d820 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
1d830 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 74   was passed as t
1d840 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74  he collate funct
1d850 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67  ion, fall throug
1d860 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  h.    ** to the 
1d870 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73  blob case and us
1d880 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  e memcmp().  */.
1d890 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20    }. .  /* Both 
1d8a0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62  values must be b
1d8b0 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75  lobs.  Compare u
1d8c0 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20  sing memcmp().  
1d8d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  */.  return sqli
1d8e0 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70  te3BlobCompare(p
1d8f0 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a  Mem1, pMem2);.}.
1d900 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
1d910 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
1d920 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
1d930 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74  on is a serial-t
1d940 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72  ype that.** corr
1d950 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e  esponds to an in
1d960 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75  teger - all valu
1d970 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  es between 1 and
1d980 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a   9 inclusive .**
1d990 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73   except 7. The s
1d9a0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20  econd points to 
1d9b0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1d9c0 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76  ing an integer v
1d9d0 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a  alue.** serializ
1d9e0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
1d9f0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69  serial_type. Thi
1da00 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1da10 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72  ializes.** and r
1da20 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1da30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1da40 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1da50 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Int(u32 serial_t
1da60 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ype, const u8 *a
1da70 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20  Key){.  u32 y;. 
1da80 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1da90 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  _DB || (serial_t
1daa0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c  ype>=1 && serial
1dab0 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69  _type<=9 && seri
1dac0 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20  al_type!=7) );. 
1dad0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
1dae0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
1daf0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a   0:.    case 1:.
1db00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1db10 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1db20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45        return ONE
1db30 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1db40 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20  .    case 2:.   
1db50 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1db60 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1db70 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59     return TWO_BY
1db80 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1db90 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20    case 3:.      
1dba0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1dbb0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1dbc0 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54  return THREE_BYT
1dbd0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1dbe0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20   case 4: {.     
1dbf0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b   testcase( aKey[
1dc00 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20  0]&0x80 );.     
1dc10 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
1dc20 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1dc30 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1dc40 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20  nt*)&y;.    }.  
1dc50 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20    case 5: {.    
1dc60 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1dc70 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1dc80 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59    return FOUR_BY
1dc90 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20  TE_UINT(aKey+2) 
1dca0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1dcb0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b  *TWO_BYTE_INT(aK
1dcc0 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ey);.    }.    c
1dcd0 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75  ase 6: {.      u
1dce0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45  64 x = FOUR_BYTE
1dcf0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1dd00 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1dd10 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1dd20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1dd30 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1dd40 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72  aKey+4);.      r
1dd50 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34  eturn (i64)*(i64
1dd60 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  *)&x;.    }.  }.
1dd70 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61  .  return (seria
1dd80 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a  l_type - 8);.}..
1dd90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1dda0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65  ion compares the
1ddb0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20   two table rows 
1ddc0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  or index records
1ddd0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1dde0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1ddf0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20  and pPKey2.  It 
1de00 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1de10 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70  ve, zero.** or p
1de20 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20  ositive integer 
1de30 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20  if key1 is less 
1de40 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f  than, equal to o
1de50 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68  r .** greater th
1de60 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e  an key2.  The {n
1de70 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79  Key1, pKey1} key
1de80 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a   must be a blob.
1de90 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ** created by th
1dea0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
1deb0 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44  opcode of the VD
1dec0 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a  BE.  The pPKey2.
1ded0 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  ** key must be a
1dee0 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68   parsed key such
1def0 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   as obtained fro
1df00 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
1df10 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a  ParseRecord..**.
1df20 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  ** If argument b
1df30 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
1df40 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
1df50 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1df60 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64  has already.** d
1df70 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1df80 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
1df90 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20  of the keys are 
1dfa0 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79  equal..**.** Key
1dfb0 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f  1 and Key2 do no
1dfc0 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69  t have to contai
1dfd0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
1dfe0 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20  r of fields. If 
1dff0 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74  all .** fields t
1e000 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f  hat appear in bo
1e010 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  th keys are equa
1e020 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e  l, then pPKey2->
1e030 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a  default_rc is .*
1e040 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  * returned..**.*
1e050 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f  * If database co
1e060 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63  rruption is disc
1e070 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65  overed, set pPKe
1e080 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a  y2->errCode to .
1e090 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
1e0a0 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20  T and return 0. 
1e0b0 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1e0c0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1e0d0 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  .** pPKey2->errC
1e0e0 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 51  ode is set to SQ
1e0f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20  LITE_NOMEM and, 
1e100 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
1e110 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63  L, the.** malloc
1e120 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74  -failed flag set
1e130 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
1e140 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65  dle (pPKey2->pKe
1e150 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69  yInfo->db)..*/.i
1e160 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
1e170 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1e180 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  kip(.  int nKey1
1e190 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1e1a0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1e1b0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1e1c0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20  Record *pPKey2, 
1e1d0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1e1e0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53   key */.  int bS
1e1f0 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 20  kip             
1e200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1e210 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66  true, skip the f
1e220 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b  irst field */.){
1e230 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20  .  u32 d1;      
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1e260 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1e270 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
1e280 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e     /* Index of n
1e2b0 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d  ext field to com
1e2c0 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a  pare */.  u32 sz
1e2d0 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  Hdr1;           
1e2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1e2f0 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64  e of record head
1e300 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1e310 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20   u32 idx1;      
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69   /* Offset of fi
1e340 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 64  rst type in head
1e350 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
1e360 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e370 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1e380 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d  n value */.  Mem
1e390 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d   *pRhs = pPKey2-
1e3a0 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  >aMem;       /* 
1e3b0 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50  Next field of pP
1e3c0 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20  Key2 to compare 
1e3d0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
1e3e0 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1e3f0 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e  >pKeyInfo;.  con
1e400 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e410 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
1e420 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1e430 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65  )pKey1;.  Mem me
1e440 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b  m1;..  /* If bSk
1e450 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ip is true, then
1e460 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1e470 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e  already determin
1e480 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ed that the firs
1e490 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65  t.  ** two eleme
1e4a0 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20  nts in the keys 
1e4b0 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74  are equal. Fix t
1e4c0 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b  he various stack
1e4d0 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20   variables so.  
1e4e0 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ** that this rou
1e4f0 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70  tine begins comp
1e500 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 63  aring at the sec
1e510 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  ond field. */.  
1e520 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20  if( bSkip ){.   
1e530 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78   u32 s1;.    idx
1e540 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e  1 = 1 + getVarin
1e550 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73  t32(&aKey1[1], s
1e560 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d  1);.    szHdr1 =
1e570 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64   aKey1[0];.    d
1e580 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c  1 = szHdr1 + sql
1e590 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1e5a0 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69  peLen(s1);.    i
1e5b0 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b   = 1;.    pRhs++
1e5c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e5d0 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33  dx1 = getVarint3
1e5e0 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29  2(aKey1, szHdr1)
1e5f0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1e600 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75  1;.    if( d1>(u
1e610 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1e620 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e   .      pPKey2->
1e630 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1e640 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e650 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
1e660 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f  0;  /* Corruptio
1e670 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  n */.    }.    i
1e680 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41   = 0;.  }..  VVA
1e690 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61  _ONLY( mem1.szMa
1e6a0 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f  lloc = 0; ) /* O
1e6b0 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73  nly needed by as
1e6c0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1e6d0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  s */.  assert( p
1e6e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e6f0 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e  >nField+pPKey2->
1e700 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1e710 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1e720 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  d .       || COR
1e730 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
1e740 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e750 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1e760 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1e770 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1e780 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a  fo->nField>0 );.
1e790 20 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d    assert( idx1<=
1e7a0 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50  szHdr1 || CORRUP
1e7b0 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  T_DB );.  do{.  
1e7c0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1e7d0 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69  e;..    /* RHS i
1e7e0 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
1e7f0 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c      if( pRhs->fl
1e800 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
1e810 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1e820 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1e830 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e840 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1e850 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1e860 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29  erial_type>=10 )
1e870 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1e880 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1e890 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1e8a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e8b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1e8c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e8d0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1e8e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e8f0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c  lGet(&aKey1[d1],
1e900 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d   serial_type, &m
1e910 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  em1);.        rc
1e920 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c   = -sqlite3IntFl
1e930 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d  oatCompare(pRhs-
1e940 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b  >u.i, mem1.u.r);
1e950 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e960 20 20 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20        i64 lhs = 
1e970 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65  vdbeRecordDecode
1e980 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c  Int(serial_type,
1e990 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20   &aKey1[d1]);.  
1e9a0 20 20 20 20 20 20 69 36 34 20 72 68 73 20 3d 20        i64 rhs = 
1e9b0 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20  pRhs->u.i;.     
1e9c0 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29     if( lhs<rhs )
1e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e9e0 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   -1;.        }el
1e9f0 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29  se if( lhs>rhs )
1ea00 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ea10 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1ea20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1ea30 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c    /* RHS is real
1ea40 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ea50 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1ea60 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20  EM_Real ){.     
1ea70 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1ea80 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1ea90 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1eaa0 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1eab0 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73   /* Serial types
1eac0 20 31 32 20 6f 72 20 67 72 65 61 74 65 72 20 61   12 or greater a
1ead0 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62  re strings and b
1eae0 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20 74 68  lobs (greater th
1eaf0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  an.        ** nu
1eb00 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20 31 30  mbers). Types 10
1eb10 20 61 6e 64 20 31 31 20 61 72 65 20 63 75 72 72   and 11 are curr
1eb20 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65 64 20  ently "reserved 
1eb30 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20 20 20  for future .    
1eb40 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20      ** use", so 
1eb50 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c  it doesn't reall
1eb60 79 20 6d 61 74 74 65 72 20 77 68 61 74 20 74 68  y matter what th
1eb70 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d  e results of com
1eb80 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  paring.        *
1eb90 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72  * them to number
1eba0 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20  ic values are.  
1ebb0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
1ebc0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  +1;.      }else 
1ebd0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1ebe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
1ebf0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1ec00 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1ec10 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1ec20 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1ec30 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29  ial_type, &mem1)
1ec40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65  ;.        if( se
1ec50 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1ec60 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 65            if( me
1ec70 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72  m1.u.r<pRhs->u.r
1ec80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ec90 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  rc = -1;.       
1eca0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d     }else if( mem
1ecb0 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20  1.u.r>pRhs->u.r 
1ecc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1ecd0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1ece0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1ecf0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1ed00 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61  = sqlite3IntFloa
1ed10 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e  tCompare(mem1.u.
1ed20 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20  i, pRhs->u.r);. 
1ed30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ed40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1ed50 48 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a  HS is a string *
1ed60 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1ed70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1ed80 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65  _Str ){.      ge
1ed90 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1eda0 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74  [idx1], serial_t
1edb0 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ype);.      test
1edc0 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70  case( serial_typ
1edd0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69  e==12 );.      i
1ede0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31  f( serial_type<1
1edf0 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  2 ){.        rc 
1ee00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1ee10 65 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74  e if( !(serial_t
1ee20 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1ee30 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1ee40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ee50 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73       mem1.n = (s
1ee60 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29  erial_type - 12)
1ee70 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65   / 2;.        te
1ee80 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31  stcase( (d1+mem1
1ee90 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  .n)==(unsigned)n
1eea0 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1eeb0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1eec0 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  m1.n+1)==(unsign
1eed0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1eee0 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31      if( (d1+mem1
1eef0 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29  .n) > (unsigned)
1ef00 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20  nKey1 ){.       
1ef10 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f     pPKey2->errCo
1ef20 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f  de = (u8)SQLITE_
1ef30 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1ef40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1ef50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ef60 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ef70 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  /.        }else 
1ef80 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  if( pKeyInfo->aC
1ef90 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  oll[i] ){.      
1efa0 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70      mem1.enc = p
1efb0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1efc0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20          mem1.db 
1efd0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1efe0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66            mem1.f
1eff0 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a  lags = MEM_Str;.
1f000 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a            mem1.z
1f010 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31   = (char*)&aKey1
1f020 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [d1];.          
1f030 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65  rc = vdbeCompare
1f040 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20  MemString(.     
1f050 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20           &mem1, 
1f060 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  pRhs, pKeyInfo->
1f070 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79  aColl[i], &pPKey
1f080 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  2->errCode.     
1f090 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1f0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f0b0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1f0c0 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29  mem1.n, pRhs->n)
1f0d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1f0e0 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64   memcmp(&aKey1[d
1f0f0 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d  1], pRhs->z, nCm
1f100 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
1f110 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d  ( rc==0 ) rc = m
1f120 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b  em1.n - pRhs->n;
1f130 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
1f140 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f150 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20  * RHS is a blob 
1f160 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20  */.    else if( 
1f170 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f180 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
1f190 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1f1a0 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1f1b0 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1f1c0 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1f1d0 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1f1e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f1f0 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1f200 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1f210 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f230 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1f240 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1f250 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1f260 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1f270 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1f280 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1f290 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1f2a0 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1f2b0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f2c0 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1f2d0 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1f2e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1f2f0 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1f300 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1f310 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1f320 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f340 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1f350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f360 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1f370 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73  = MIN(nStr, pRhs
1f380 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->n);.          
1f390 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  rc = memcmp(&aKe
1f3a0 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c  y1[d1], pRhs->z,
1f3b0 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20   nCmp);.        
1f3c0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1f3d0 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e   = nStr - pRhs->
1f3e0 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1f3f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1f400 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a  /* RHS is null *
1f410 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  /.    else{.    
1f420 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20    serial_type = 
1f430 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20  aKey1[idx1];.   
1f440 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f     rc = (serial_
1f450 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a  type!=0);.    }.
1f460 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29  .    if( rc!=0 )
1f470 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  {.      if( pKey
1f480 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1f490 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1f4a0 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d  c = -rc;.      }
1f4b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76  .      assert( v
1f4c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1f4d0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1f4e0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20  y1, pPKey2, rc) 
1f4f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f500 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1f510 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1f520 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1f530 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f540 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20     }..    i++;. 
1f550 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64     pRhs++;.    d
1f560 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1f570 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65  SerialTypeLen(se
1f580 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1f590 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56  idx1 += sqlite3V
1f5a0 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f  arintLen(serial_
1f5b0 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28  type);.  }while(
1f5c0 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29   idx1<(unsigned)
1f5d0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1f5e0 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31  y2->nField && d1
1f5f0 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  <=(unsigned)nKey
1f600 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  1 );..  /* No me
1f610 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1f620 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1f630 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1f640 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1f650 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1f660 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1f670 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1f680 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1f690 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1f6a0 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1f6b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f6c0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a  lease(&mem1).  *
1f6d0 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31  /.  assert( mem1
1f6e0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a  .szMalloc==0 );.
1f6f0 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65  .  /* rc==0 here
1f700 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20   means that one 
1f710 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b  or both of the k
1f720 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1f730 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1f740 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1f750 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1f760 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1f770 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1f780 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1f790 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1f7a0 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  PT_DB .       ||
1f7b0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f7c0 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1f7d0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50  Key1, pPKey2, pP
1f7e0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f7f0 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65  ) .       || pKe
1f800 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1f810 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70  cFailed.  );.  p
1f820 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
1f830 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65  1;.  return pPKe
1f840 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1f850 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
1f860 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a  eRecordCompare(.
1f870 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1f880 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1f890 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f    /* Left key */
1f8a0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1f8b0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1f8c0 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
1f8d0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  */.){.  return s
1f8e0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1f8f0 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
1f900 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f910 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a  Key2, 0);.}.../*
1f920 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f930 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
1f940 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
1f950 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f960 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
1f970 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
1f980 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
1f990 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e  s an integer, an
1f9a0 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69  d (b) the .** si
1f9b0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
1f9c0 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  int at the start
1f9d0 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   of (pKey1/nKey1
1f9e0 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  ) fits in a sing
1f9f0 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e  le.** byte (i.e.
1fa00 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32   is less than 12
1fa10 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  8)..**.** To avo
1fa20 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75  id concerns abou
1fa30 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  t buffer overrea
1fa40 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ds, this routine
1fa50 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a   is only used.**
1fa60 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72   on schemas wher
1fa70 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61  e the maximum va
1fa80 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20  lid header size 
1fa90 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c  is 63 bytes or l
1faa0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
1fab0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1fac0 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e  pareInt(.  int n
1fad0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1fae0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1faf0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1fb00 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1fb10 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1fb20 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1fb30 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28  st u8 *aKey = &(
1fb40 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
1fb50 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b  )[*(const u8*)pK
1fb60 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69  ey1 & 0x3F];.  i
1fb70 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d  nt serial_type =
1fb80 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65   ((const u8*)pKe
1fb90 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65  y1)[1];.  int re
1fba0 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36  s;.  u32 y;.  u6
1fbb0 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70  4 x;.  i64 v = p
1fbc0 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75  PKey2->aMem[0].u
1fbd0 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a  .i;.  i64 lhs;..
1fbe0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
1fbf0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1fc00 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
1fc10 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1fc20 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
1fc30 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
1fc40 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
1fc50 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
1fc60 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
1fc70 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
1fc80 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1fc90 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1fca0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
1fcb0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1fcc0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1fcd0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fce0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
1fcf0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
1fd00 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1fd10 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
1fd20 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1fd30 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1fd40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fd50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fd60 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
1fd70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1fd80 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
1fd90 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1fda0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1fdb0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1fdc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1fdd0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
1fde0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
1fdf0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1fe00 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
1fe10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1fe20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
1fe30 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
1fe40 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1fe50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fe60 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1fe70 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1fe80 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1fe90 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
1fea0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
1feb0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1fec0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1fed0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1fee0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1fef0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ff00 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
1ff10 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1ff20 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1ff30 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1ff40 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1ff50 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1ff60 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1ff70 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
1ff80 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
1ff90 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1ffa0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1ffb0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1ffc0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
1ffd0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
1ffe0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
1fff0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
20000 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
20010 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
20020 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
20030 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
20040 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
20050 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
20060 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
20070 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
20080 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
20090 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
200a0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
200b0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
200c0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
200d0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
200e0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
200f0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
20100 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
20110 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
20120 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
20130 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
20140 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
20150 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
20160 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
20170 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
20180 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
20190 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
201a0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
201b0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
201c0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
201d0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
201e0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
201f0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
20200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20210 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20220 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20230 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
20240 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29  }..  if( v>lhs )
20250 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
20260 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20  y2->r1;.  }else 
20270 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20  if( v<lhs ){.   
20280 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20290 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
202a0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
202b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ){.    /* The fi
202c0 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  rst fields of th
202d0 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65  e two keys are e
202e0 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68  qual. Compare th
202f0 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20  e trailing .    
20300 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20  ** fields.  */. 
20310 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33     res = sqlite3
20320 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
20330 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
20340 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20350 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
20360 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
20370 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
20380 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61  keys are equal a
20390 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  nd there are no 
203a0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20  trailing.    ** 
203b0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70  fields. Return p
203c0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
203d0 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  c in this case. 
203e0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  */.    res = pPK
203f0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
20400 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  .    pPKey2->eqS
20410 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  een = 1;.  }..  
20420 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f  assert( vdbeReco
20430 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
20440 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20450 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72  ey2, res) );.  r
20460 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
20470 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20480 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65  n is an optimize
20490 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
204a0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
204b0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74  mpare() .** that
204c0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66   (a) the first f
204d0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69  ield of pPKey2 i
204e0 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74  s a string, that
204f0 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20 66   (b) the first f
20500 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65  ield.** uses the
20510 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
20520 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28  nce BINARY and (
20530 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  c) that the size
20540 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20550 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61  t .** at the sta
20560 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
20570 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
20580 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74  ngle byte..*/.st
20590 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
205a0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
205b0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
205c0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
205d0 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
205e0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
205f0 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
20600 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
20610 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
20620 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75  aKey1 = (const u
20630 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20  8*)pKey1;.  int 
20640 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69  serial_type;.  i
20650 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72  nt res;..  asser
20660 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  t( pPKey2->aMem[
20670 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  0].flags & MEM_S
20680 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65  tr );.  vdbeAsse
20690 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
206a0 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20  inLimits(nKey1, 
206b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70  pKey1, pPKey2->p
206c0 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56  KeyInfo);.  getV
206d0 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31  arint32(&aKey1[1
206e0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  ], serial_type);
206f0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
20700 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73  pe<12 ){.    res
20710 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20   = pPKey2->r1;  
20720 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
20730 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72  ey1) is a number
20740 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20   or a null */.  
20750 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69  }else if( !(seri
20760 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20  al_type & 0x01) 
20770 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50  ){ .    res = pP
20780 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f  Key2->r2;      /
20790 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
207a0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d  is a blob */.  }
207b0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43  else{.    int nC
207c0 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72  mp;.    int nStr
207d0 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20  ;.    int szHdr 
207e0 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20  = aKey1[0];..   
207f0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
20800 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20  type-12) / 2;.  
20810 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e    if( (szHdr + n
20820 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a  Str) > nKey1 ){.
20830 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
20840 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
20850 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
20860 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20870 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
20880 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n */.    }.    n
20890 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79  Cmp = MIN( pPKey
208a0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53  2->aMem[0].n, nS
208b0 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  tr );.    res = 
208c0 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a  memcmp(&aKey1[sz
208d0 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d  Hdr], pPKey2->aM
208e0 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a  em[0].z, nCmp);.
208f0 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
20900 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e  ){.      res = n
20910 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d  Str - pPKey2->aM
20920 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69  em[0].n;.      i
20930 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
20940 20 20 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d       if( pPKey2-
20950 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
20960 20 20 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c         res = sql
20970 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20980 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
20990 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
209a0 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  y2, 1);.        
209b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
209c0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
209d0 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20  efault_rc;.     
209e0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53       pPKey2->eqS
209f0 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  een = 1;.       
20a00 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
20a10 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
20a20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20a30 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ->r2;.      }els
20a40 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
20a50 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
20a60 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
20a70 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20  f( res>0 ){.    
20a80 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20a90 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r2;.    }else{. 
20aa0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20ab0 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  2->r1;.    }.  }
20ac0 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65  ..  assert( vdbe
20ad0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
20ae0 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ug(nKey1, pKey1,
20af0 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20   pPKey2, res).  
20b00 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
20b10 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b  DB.       || pPK
20b20 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
20b30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
20b40 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65    );.  return re
20b50 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
20b60 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
20b70 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  an sqlite3VdbeRe
20b80 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f  cordCompare() co
20b90 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f  mpatible functio
20ba0 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f  n.** suitable fo
20bb0 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69  r comparing seri
20bc0 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74  alized records t
20bd0 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72  o the unpacked r
20be0 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20  ecord passed.** 
20bf0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
20c00 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43  ment..*/.RecordC
20c10 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56 64  ompare sqlite3Vd
20c20 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e  beFindCompare(Un
20c30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29  packedRecord *p)
20c40 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63  {.  /* varintRec
20c50 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
20c60 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64  and varintRecord
20c70 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
20c80 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a  both assume.  **
20c90 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f   that the size-o
20ca0 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20  f-header varint 
20cb0 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
20cc0 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
20cd0 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74   record.  ** fit
20ce0 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  s in a single by
20cf0 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20  te (i.e. is 127 
20d00 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74  or less). varint
20d10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20d20 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73  ().  ** also ass
20d30 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73 20  umes that it is 
20d40 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64  safe to overread
20d50 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74 20   a buffer by at 
20d60 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20  least the .  ** 
20d70 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65  maximum possible
20d80 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73 69   legal header si
20d90 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e  ze plus 8 bytes.
20da0 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20 69   Because there i
20db0 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65  s.  ** guarantee
20dc0 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  d to be at least
20dd0 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36   74 (but not 136
20de0 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  ) bytes of paddi
20df0 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63  ng following eac
20e00 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61  h.  ** buffer pa
20e10 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65  ssed to varintRe
20e20 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
20e30 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63   this makes it c
20e40 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a  onvenient to.  *
20e50 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65  * limit the size
20e60 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 74   of the header t
20e70 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63 61  o 64 bytes in ca
20e80 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66 69  ses where the fi
20e90 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69  rst field.  ** i
20ea0 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20  s an integer..  
20eb0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69  **.  ** The easi
20ec0 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72  est way to enfor
20ed0 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73  ce this limit is
20ee0 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c   to consider onl
20ef0 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20  y records with. 
20f00 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72   ** 13 fields or
20f10 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66 69   less. If the fi
20f20 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20  rst field is an 
20f30 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78  integer, the max
20f40 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20  imum legal.  ** 
20f50 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 28  header size is (
20f60 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79  12*5 + 1 + 1) by
20f70 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28  tes.  */.  if( (
20f80 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  p->pKeyInfo->nFi
20f90 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66  eld + p->pKeyInf
20fa0 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20  o->nXField)<=13 
20fb0 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  ){.    int flags
20fc0 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c   = p->aMem[0].fl
20fd0 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ags;.    if( p->
20fe0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
20ff0 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rder[0] ){.     
21000 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20   p->r1 = 1;.    
21010 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20    p->r2 = -1;.  
21020 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
21030 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20  ->r1 = -1;.     
21040 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20   p->r2 = 1;.    
21050 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73  }.    if( (flags
21060 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20   & MEM_Int) ){. 
21070 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
21080 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
21090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
210a0 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45  case( flags & ME
210b0 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65  M_Real );.    te
210c0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
210d0 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  MEM_Null );.    
210e0 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
210f0 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20  & MEM_Blob );.  
21100 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28    if( (flags & (
21110 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c  MEM_Real|MEM_Nul
21120 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20  l|MEM_Blob))==0 
21130 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  && p->pKeyInfo->
21140 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20  aColl[0]==0 ){. 
21150 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61       assert( fla
21160 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
21170 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
21180 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
21190 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ring;.    }.  }.
211a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
211b0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
211c0 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75  re;.}../*.** pCu
211d0 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69  r points at an i
211e0 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74  ndex entry creat
211f0 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f  ed using the OP_
21200 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
21210 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72  e..** Read the r
21220 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66  owid (the last f
21230 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f  ield in the reco
21240 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74  rd) and store it
21250 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52   in *rowid..** R
21260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21270 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
21280 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72  rks, or an error
21290 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
212a0 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68  .**.** pCur migh
212b0 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t be pointing to
212c0 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66   text obtained f
212d0 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61  rom a corrupt da
212e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
212f0 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63  So the content c
21300 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
21310 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74  .  Do appropriat
21320 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20  e checks on the 
21330 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  content..*/.int 
21340 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f  sqlite3VdbeIdxRo
21350 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  wid(sqlite3 *db,
21360 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
21370 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20   i64 *rowid){.  
21380 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
21390 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
213a0 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20  2 szHdr;        
213b0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68  /* Size of the h
213c0 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74  eader */.  u32 t
213d0 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20  ypeRowid;    /* 
213e0 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74  Serial type of t
213f0 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33  he rowid */.  u3
21400 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20  2 lenRowid;     
21410 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72  /* Size of the r
21420 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c  owid */.  Mem m,
21430 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68   v;..  /* Get th
21440 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e  e size of the in
21450 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79  dex entry.  Only
21460 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73   indices entries
21470 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68   of less.  ** th
21480 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70  an 2GiB are supp
21490 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c  ort - anything l
214a0 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74  arge must be dat
214b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
214c0 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75  ..  ** Any corru
214d0 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
214e0 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65  d in sqlite3Btre
214f0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
21500 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a   though, so.  **
21510 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73   this code can s
21520 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61  afely assume tha
21530 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32  t nCellKey is 32
21540 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61  -bits  .  */.  a
21550 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
21560 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
21570 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f  (pCur) );.  VVA_
21580 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74  ONLY(rc =) sqlit
21590 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70  e3BtreeKeySize(p
215a0 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b  Cur, &nCellKey);
215b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
215c0 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20  QLITE_OK );     
215d0 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79  /* pCur is alway
215e0 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69  s valid so KeySi
215f0 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a  ze cannot fail *
21600 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65  /.  assert( (nCe
21610 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d  llKey & SQLITE_M
21620 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43  AX_U32)==(u64)nC
21630 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20  ellKey );..  /* 
21640 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70  Read in the comp
21650 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  lete content of 
21660 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  the index entry 
21670 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
21680 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20  MemInit(&m, db, 
21690 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
216a0 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72  e3VdbeMemFromBtr
216b0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32  ee(pCur, 0, (u32
216c0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d  )nCellKey, 1, &m
216d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
216e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
216f0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
21700 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67  x entry must beg
21710 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72  in with a header
21720 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64   size */.  (void
21730 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38  )getVarint32((u8
21740 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20  *)m.z, szHdr);. 
21750 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
21760 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
21770 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b  e( szHdr==m.n );
21780 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
21790 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29  szHdr<3 || (int)
217a0 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20  szHdr>m.n) ){.  
217b0 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
217c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
217d0 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20  ..  /* The last 
217e0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64  field of the ind
217f0 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20  ex should be an 
21800 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f  integer - the RO
21810 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79  WID..  ** Verify
21820 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65   that the last e
21830 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61  ntry really is a
21840 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  n integer. */.  
21850 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
21860 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64  2((u8*)&m.z[szHd
21870 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29  r-1], typeRowid)
21880 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21890 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20  peRowid==1 );.  
218a0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
218b0 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74  wid==2 );.  test
218c0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
218d0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
218e0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29  ( typeRowid==4 )
218f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21900 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20  peRowid==5 );.  
21910 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21920 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74  wid==6 );.  test
21930 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21940 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =8 );.  testcase
21950 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29  ( typeRowid==9 )
21960 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
21970 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20  (typeRowid<1 || 
21980 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74  typeRowid>9 || t
21990 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a  ypeRowid==7) ){.
219a0 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
219b0 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
219c0 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20   }.  lenRowid = 
219d0 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
219e0 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d  Sizes[typeRowid]
219f0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75  ;.  testcase( (u
21a00 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65  32)m.n==szHdr+le
21a10 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20  nRowid );.  if( 
21a20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e  unlikely((u32)m.
21a30 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  n<szHdr+lenRowid
21a40 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21a50 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21a60 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65  on;.  }..  /* Fe
21a70 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20  tch the integer 
21a80 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
21a90 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20  he index record 
21aa0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
21ab0 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26  SerialGet((u8*)&
21ac0 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64  m.z[m.n-lenRowid
21ad0 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76  ], typeRowid, &v
21ae0 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e  );.  *rowid = v.
21af0 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  u.i;.  sqlite3Vd
21b00 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
21b10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21b20 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
21b30 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73   here if databas
21b40 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
21b50 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d  detected after m
21b60 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61   has been.  ** a
21b70 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20  llocated.  Free 
21b80 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64  the m object and
21b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21ba0 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72  ORRUPT. */.idx_r
21bb0 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a  owid_corruption:
21bc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73  .  testcase( m.s
21bd0 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20  zMalloc!=0 );.  
21be0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
21bf0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
21c00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21c10 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  PT_BKPT;.}../*.*
21c20 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65  * Compare the ke
21c30 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  y of the index e
21c40 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
21c50 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20   pC is pointing 
21c60 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68  to against.** th
21c70 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20  e key string in 
21c80 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74  pUnpacked.  Writ
21c90 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e  e into *pRes a n
21ca0 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  umber.** that is
21cb0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
21cc0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
21cd0 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  pC is less than,
21ce0 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72   equal to,.** or
21cf0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55   greater than pU
21d00 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e  npacked.  Return
21d10 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
21d20 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e  ccess..**.** pUn
21d30 70 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72  packed is either
21d40 20 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74   created without
21d50 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74   a rowid or is t
21d60 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74  runcated so that
21d70 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65   it.** omits the
21d80 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
21d90 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74  d.  The rowid at
21da0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
21db0 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69  index entry.** i
21dc0 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c  s ignored as wel
21dd0 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20  l.  Hence, this 
21de0 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d  routine only com
21df0 70 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78  pares the prefix
21e00 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65  es .** of the ke
21e10 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ys prior to the 
21e20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74  final rowid, not
21e30 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e   the entire key.
21e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
21e50 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65  dbeIdxKeyCompare
21e60 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
21e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e80 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
21e90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21ea0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c   VdbeCursor *pC,
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
21ed0 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  to compare again
21ee0 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  st */.  Unpacked
21ef0 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65  Record *pUnpacke
21f00 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61  d,       /* Unpa
21f10 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  cked version of 
21f20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65  key */.  int *re
21f30 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
21f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21f50 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  te the compariso
21f60 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f  n result here */
21f70 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  .){.  i64 nCellK
21f80 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
21f90 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
21fa0 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20  ur;.  Mem m;..  
21fb0 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72  assert( pC->eCur
21fc0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
21fd0 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20  REE );.  pCur = 
21fe0 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a  pC->uc.pCursor;.
21ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22000 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
22010 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
22020 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
22030 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
22040 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
22050 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
22060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
22070 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
22080 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
22090 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
220a0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
220b0 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
220c0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
220d0 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
220e0 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
220f0 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
22100 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
22110 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
22120 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
22130 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
22140 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
22150 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
22160 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
22170 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
22190 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
221a0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
221b0 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
221c0 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
221d0 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
221e0 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
221f0 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
22200 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22210 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c    }.  *res = sql
22220 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
22230 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20  mpare(m.n, m.z, 
22240 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71  pUnpacked);.  sq
22250 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
22260 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22270 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22280 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
22290 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75  ne sets the valu
222a0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  e to be returned
222b0 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
222c0 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74  alls to.** sqlit
222d0 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20  e3_changes() on 
222e0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
222f0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f  dle 'db'. .*/.vo
22300 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
22310 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  tChanges(sqlite3
22320 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67   *db, int nChang
22330 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
22340 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
22350 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
22360 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e   db->nChange = n
22370 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54  Change;.  db->nT
22380 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43  otalChange += nC
22390 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
223a0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68  Set a flag in th
223b0 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65  e vdbe to update
223c0 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e   the change coun
223d0 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66  ter when it is f
223e0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72  inalised.** or r
223f0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eset..*/.void sq
22400 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68  lite3VdbeCountCh
22410 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a  anges(Vdbe *v){.
22420 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e    v->changeCntOn
22430 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
22440 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72  ark every prepar
22450 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73  ed statement ass
22460 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
22470 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22480 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64  on.** as expired
22490 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72  ..**.** An expir
224a0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61  ed statement mea
224b0 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c  ns that recompil
224c0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61  ation of the sta
224d0 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63  tement is.** rec
224e0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65  ommend.  Stateme
224f0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20  nts expire when 
22500 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68  things happen th
22510 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a  at make their.**
22520 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65   programs obsole
22530 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73  te.  Removing us
22540 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
22550 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e  ions or collatin
22560 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20  g.** sequences, 
22570 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61  or changing an a
22580 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e  uthorization fun
22590 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79  ction are the ty
225a0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73  pes of.** things
225b0 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61   that make prepa
225c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  red statements o
225d0 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64  bsolete..*/.void
225e0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
225f0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
22600 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
22610 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28   Vdbe *p;.  for(
22620 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70  p = db->pVdbe; p
22630 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
22640 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20     p->expired = 
22650 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
22660 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  Return the datab
22670 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
22680 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f  ith the Vdbe..*/
22690 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
226a0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29  3VdbeDb(Vdbe *v)
226b0 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62  {.  return v->db
226c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
226d0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
226e0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  n sqlite3_value 
226f0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
22700 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62  ning the value b
22710 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ound.** paramete
22720 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20  r iVar of VM v. 
22730 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76  Except, if the v
22740 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e  alue is an SQL N
22750 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20  ULL, return .** 
22760 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73  0 instead. Unles
22770 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70  s it is NULL, ap
22780 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66  ply affinity aff
22790 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c   (one of the SQL
227a0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e  ITE_AFF_*.** con
227b0 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76  stants) to the v
227c0 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
227d0 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  rning it..**.** 
227e0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
227f0 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  ue must be freed
22800 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
22810 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75  sing sqlite3Valu
22820 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69  eFree()..*/.sqli
22830 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74  te3_value *sqlit
22840 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61  e3VdbeGetBoundVa
22850 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  lue(Vdbe *v, int
22860 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a   iVar, u8 aff){.
22870 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
22880 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20   );.  if( v ){. 
22890 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
228a0 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b  v->aVar[iVar-1];
228b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65  .    if( 0==(pMe
228c0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
228d0 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ull) ){.      sq
228e0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65  lite3_value *pRe
228f0 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  t = sqlite3Value
22900 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20  New(v->db);.    
22910 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
22920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
22930 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29  eMemCopy((Mem *)
22940 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  pRet, pMem);.   
22950 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
22960 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
22970 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45  Ret, aff, SQLITE
22980 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a  _UTF8);.      }.
22990 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65        return pRe
229a0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
229b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
229c0 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20  * Configure SQL 
229d0 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f  variable iVar so
229e0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20   that binding a 
229f0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20  new value to it 
22a00 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71  signals.** to sq
22a10 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65  lite3_reoptimize
22a20 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61  () that re-prepa
22a30 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65  ring the stateme
22a40 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a  nt may result.**
22a50 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65   in a better que
22a60 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64  ry plan..*/.void
22a70 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56   sqlite3VdbeSetV
22a80 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20  armask(Vdbe *v, 
22a90 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73  int iVar){.  ass
22aa0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20  ert( iVar>0 );. 
22ab0 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a   if( iVar>32 ){.
22ac0 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d      v->expmask =
22ad0 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d   0xffffffff;.  }
22ae0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70  else{.    v->exp
22af0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20  mask |= ((u32)1 
22b00 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20  << (iVar-1));.  
22b10 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
22b20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22b30 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  TABLE./*.** Tran
22b40 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61  sfer error messa
22b50 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20  ge text from an 
22b60 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72  sqlite3_vtab.zEr
22b70 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
22b80 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
22b90 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
22ba0 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74  ite3_malloc) int
22bb0 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67  o a Vdbe.zErrMsg
22bc0 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
22bd0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
22be0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
22bf0 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f  DbMalloc)..*/.vo
22c00 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d  id sqlite3VtabIm
22c10 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20  portErrmsg(Vdbe 
22c20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  *p, sqlite3_vtab
22c30 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20   *pVtab){.  if( 
22c40 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29  pVtab->zErrMsg )
22c50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
22c60 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73  b = p->db;.    s
22c70 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22c80 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
22c90 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73    p->zErrMsg = s
22ca0 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
22cb0 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  b, pVtab->zErrMs
22cc0 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
22cd0 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72  free(pVtab->zErr
22ce0 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d  Msg);.    pVtab-
22cf0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
22d00 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
22d10 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22d20 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65  LTABLE */..#ifde
22d30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22d40 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a  PREUPDATE_HOOK..
22d50 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  /*.** If the sec
22d60 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
22d70 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73  not NULL, releas
22d80 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  e any allocation
22d90 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a  s associated .**
22da0 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79   with the memory
22db0 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d   cells in the p-
22dc0 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41  >aMem[] array. A
22dd0 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70  lso free the Unp
22de0 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
22df0 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c  tructure itself,
22e00 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
22e10 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Free()..**.** Th
22e20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
22e30 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61  sed to free Unpa
22e40 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
22e50 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  tures allocated 
22e60 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e  by.** the vdbeUn
22e70 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e  packRecord() fun
22e80 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76  ction found in v
22e90 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61  dbeapi.c..*/.sta
22ea0 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
22eb0 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65  eUnpacked(sqlite
22ec0 33 20 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52  3 *db, UnpackedR
22ed0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28  ecord *p){.  if(
22ee0 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b   p ){.    int i;
22ef0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22f00 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b  p->nField; i++){
22f10 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
22f20 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a   = &p->aMem[i];.
22f30 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
22f40 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
22f50 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
22f60 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
22f70 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f80 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, p);.  }.}../*
22f90 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70  .** Invoke the p
22fa0 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20  re-update hook. 
22fb0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50  If this is an UP
22fc0 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70  DATE or DELETE p
22fd0 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a  re-update call,.
22fe0 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70  ** then cursor p
22ff0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
23000 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ond argument sho
23010 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  uld point to the
23020 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f   row about.** to
23030 20 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65   be update or de
23040 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70  leted. If the ap
23050 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20  plication calls 
23060 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74  sqlite3_preupdat
23070 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20  e_old(),.** the 
23080 72 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77  required value w
23090 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ill be read from
230a0 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
230b0 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  sor points to..*
230c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
230d0 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28  bePreUpdateHook(
230e0 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75     /* Vdbe pre-u
23110 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e  pdate hook is in
23120 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64  voked by */.  Vd
23130 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20  beCursor *pCsr, 
23140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23150 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20   Cursor to grab 
23160 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f  old.* values fro
23170 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  m */.  int op,  
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23190 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
231a0 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20  _INSERT, UPDATE 
231b0 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63  or DELETE */.  c
231c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231e0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
231f0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
23200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23210 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64       /* Modified
23220 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20   table */.  i64 
23230 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20  iKey1,          
23240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
23250 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65  nitial key value
23260 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20   */.  int iReg  
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
23290 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f  r for new.* reco
232a0 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  rd */.){.  sqlit
232b0 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a  e3 *db = v->db;.
232c0 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50    i64 iKey2;.  P
232d0 72 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61  reUpdate preupda
232e0 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  te;.  const char
232f0 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a   *zTbl = pTab->z
23300 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63  Name;.  static c
23310 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74  onst u8 fakeSort
23320 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73  Order = 0;..  as
23330 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70  sert( db->pPreUp
23340 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d  date==0 );.  mem
23350 73 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20  set(&preupdate, 
23360 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64  0, sizeof(PreUpd
23370 61 74 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d  ate));.  if( op=
23380 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29  =SQLITE_UPDATE )
23390 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d  {.    iKey2 = v-
233a0 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b  >aMem[iReg].u.i;
233b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b  .  }else{.    iK
233c0 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d  ey2 = iKey1;.  }
233d0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ..  assert( pCsr
233e0 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e  ->nField==pTab->
233f0 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20  nCol .       || 
23400 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70  (pCsr->nField==p
23410 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f  Tab->nCol+1 && o
23420 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  p==SQLITE_DELETE
23430 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20   && iReg==-1).  
23440 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e  );..  preupdate.
23450 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61  v = v;.  preupda
23460 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a  te.pCsr = pCsr;.
23470 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d    preupdate.op =
23480 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65   op;.  preupdate
23490 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b  .iNewReg = iReg;
234a0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
234b0 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20  info.db = db;.  
234c0 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66  preupdate.keyinf
234d0 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  o.enc = ENC(db);
234e0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79  .  preupdate.key
234f0 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54  info.nField = pT
23500 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75  ab->nCol;.  preu
23510 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53  pdate.keyinfo.aS
23520 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
23530 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a  &fakeSortOrder;.
23540 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79    preupdate.iKey
23550 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65  1 = iKey1;.  pre
23560 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69  update.iKey2 = i
23570 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74  Key2;.  preupdat
23580 65 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e  e.iPKey = pTab->
23590 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50  iPKey;..  db->pP
235a0 72 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75  reUpdate = &preu
235b0 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72  pdate;.  db->xPr
235c0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28  eUpdateCallback(
235d0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72  db->pPreUpdateAr
235e0 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20  g, db, op, zDb, 
235f0 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65  zTbl, iKey1, iKe
23600 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55  y2);.  db->pPreU
23610 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c  pdate = 0;.  sql
23620 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23630 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64  reupdate.aRecord
23640 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70  );.  vdbeFreeUnp
23650 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64  acked(db, preupd
23660 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a  ate.pUnpacked);.
23670 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b    vdbeFreeUnpack
23680 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65  ed(db, preupdate
23690 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a  .pNewUnpacked);.
236a0 20 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e    if( preupdate.
236b0 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20  aNew ){.    int 
236c0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
236d0 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20  i<pCsr->nField; 
236e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
236f0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
23700 65 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65  e(&preupdate.aNe
23710 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  w[i]);.    }.   
23720 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
23730 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65  b, preupdate.aNe
23740 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  w);.  }.}.#endif
23750 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
23760 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b  E_PREUPDATE_HOOK
23770 20 2a 2f 0a                                       */.